重载PreTranslateMessage响应CTreeCtrl控件的回车键后运行程序出现中断ASSERT(::IsWindow(m_hWnd));

博客讨论了在MFC中使用CTreeCtrl控件时遇到的问题,即编辑节点后按回车键无法触发OnTvnEndlabeledit事件。通过重载PreTranslateMessage函数并添加回车键响应来解决此问题,但导致了程序中断。解决方案是修改PreTranslateMessage函数,使其在处理回车键后立即返回。此外,还提到了另一种可能的解决方法,通过改变控件的焦点来实现功能。博客内容涉及MFC消息处理、控件交互和Windows消息循环。

场景:

在CTreeCtrl控件中编辑完节点名称后按下回车键控件、节点都没有反应,只有鼠标光标点击非该节点编辑框编辑才会生效,所以希望按下回车键也能使编辑生效(即按下回车键后CTreeCtrl控件可以响应 OnTvnEndlabeledit 函数事件。
在网上查了资料发现重载 PreTranslateMessage 函数可以实现,需要添加回车键消息响应:

case VK_RETURN:
	::TranslateMessage(pMsg);
	::DispatchMessage(pMsg);		//执行完这一行后会响应 ***OnTvnEndlabeledit*** 函数事件
	break

这样确实会响应 OnTvnEndlabeledit 函数事件,但是程序在执行完 OnTvnEndlabeledit 函数事件之后继续往下执行到重载函数PreTranslateMessage 返回指令后会触发中断:

return CDialogEx::PreTranslateMessage(pMsg);

在这里插入图片描述
中段代码最终会指示到如下所示的地方:

//wincore.cpp
BOOL PASCAL CWnd::WalkPreTranslateTree(HWND hWndStop, MSG* pMsg)
{
   
   
	ASSERT(hWndStop == NULL || ::IsWindow(hWndStop));
	ASSERT(pMsg != NULL);

	// walk from the target window up to the hWndStop window checking
	//  if any window wants to translate this message

	for (HWND hWnd = pMsg->hwnd; hWnd != NULL; hWnd = ::GetParent(hWnd))
	{
   
   
		CWnd* pWnd = CWnd::FromHandlePermanent(hWnd);
		if (pWnd != NULL)
		{
   
   
			// target window is a C++ window
			if (pWnd->PreTranslateMessage(pMsg))
				return TRUE; // trapped by target window (eg: accelerators)
		}

		/
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值