场景:
在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)
}
/

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

被折叠的 条评论
为什么被折叠?



