gpt4 book ai didi

c++ - MFC 重定向/捕获 MESSAGE_MAP |预翻译消息?

转载 作者:行者123 更新时间:2023-11-28 02:16:45 25 4
gpt4 key购买 nike

我在使用 MESSAGE_MAP 和/或 PreTranslateMessage 时遇到问题。这可能是设计问题,但我不确定。主要问题是 MESSAGE_MAP 代码未被调用并且不确定如何通过 PreTranslateMessage 执行相同的操作。即如下:

    //MyCDialogEx : public CDialogEx
class MyCDialogEx::Init()
{
CFlatSplitterWnd m_cSplitter; //http://www.codersource.net/2010/01/29/mfc-splitter-window/
m_pFrame = new CFlatFrameWnd;
m_pFrame->Create(strMyClass, L"", WS_CHILD, rect, this);
m_pFrame->ShowWindow(SW_SHOW);
m_cSplitter.CreateStatic(m_pFrame, 1, 2);

m_cSplitter.ModifyStyleEx(WS_EX_CLIENTEDGE, 0, SWP_NOSIZE | SWP_NOACTIVATE);
m_cSplitter.CreateView(0, 0, RUNTIME_CLASS(CHolderView), CSize(100, 100), &ccc);

CHolderView* pView = (CHolderView*)m_cSplitter.GetPane(0, 0);
ASSERT_VALID(pView);
pView->setWnd(&m_TreeCtrl);
pView->setOwner(this, IDC_TREECTRL);

const DWORD dwStyle = LBS_NOTIFY | WS_CHILD | WS_VISIBLE | TVS_HASBUTTONS | TVS_HASLINES
| TVS_LINESATROOT | TVS_CHECKBOXES | TVS_SHOWSELALWAYS | WS_BORDER | WS_HSCROLL | WS_TABSTOP;
m_TreeCtrl.Create(dwStyle, CRect(0, 0, 1, 1), pView, IDC_TREECTRL);
}

BEGIN_MESSAGE_MAP(MyCDialogEx, CDialogEx)
ON_NOTIFY_REFLECT(WM_ONMYCLICK, OnClickTreectrl) //this & following not called
ON_NOTIFY(NM_CLICK, IDC_TREECTRL, OnClickTreectrl)
ON_NOTIFY(TVN_ITEMCHANGED, IDC_TREECTRL, OnItemchangedTreectrl)
ON_NOTIFY(TVN_SELCHANGED, IDC_TREECTRL, OnSelchangedTreectrl)
ON_NOTIFY(TVN_KEYDOWN, IDC_TREECTRL, OnKeydownTreectrl)
END_MESSAGE_MAP()

BOOL MyCDialogEx::PreTranslateMessage(MSG* pMsg)
{
if (GetFocus() && GetFocus()->GetDlgCtrlID() == IDC_TREECTRL)
{
//what/how goes in here to catch NM_CLICK, TVN_ITEMCHANGED etc??

if (pMsg->message == WM_LBUTTONDOWN)
{
switch (LOWORD(pMsg->wParam))
{
case NM_CLICK:
break;
}
}
if (pMsg->message == WM_KEYDOWN)
TRACE(L"WM_KEYDOWN\n");

if (pMsg->message == WM_KEYUP)
TRACE(L"WM_KEYUP\n");
}
return MyCDialogEx::PreTranslateMessage(pMsg);
}
void MyCDialogEx::OnClickTreectrl(NMHDR *pNMHDR, LRESULT *pResult) //not called
{
TRACE(L"tree click\n");
*pResult = 0;
}

如果我将它们放在 CHolderView 类 MESSAGE_MAP 中,MESSAGE_MAP 就可以工作,但我宁愿不这样做,因为它只是一个容器类,可能会在我的项目的其他地方使用。

我真正想做的是使用 MESSAGE_MAP 通过 PreTranslateMessage 最大限度地减少编码(如果可以重定向到 MESSAGE_MAP,怎么做?)。如果我必须求助于 PreTranslateMessage 或其他,那么我该如何使用它以便我可以捕获相关的 NM_CLICK、TVN_ITEMCHANGED 以进行树控制等。

谢谢。

编辑:哦,以下没有帮助,不相关或没有充分解释:

最佳答案

问题在于 TreeView 会将其所有通知发送到父窗口。父窗口是 CHolderWindow。

消息不像 WM_COMMAND 消息那样被路由。因此 WM_COMMAND 消息的处理程序可能驻留在通知路径中的任何位置。

但是常规窗口控件通知总是在窗口的直接父级中处理。在 MFC 中,您可以将此类通知重定向到子窗口控件本身。使用 ON_..._REFLECT。

技巧可以是:将指向窗口的指针设置为持有者窗口,该窗口应该接收所有消息。比接受持有人窗口中的所有 WM_COMMAND 和所有 WM_NOTIFY 消息并将它们重新发送到新窗口。

PreTranslateMessage 是另一回事。目标窗口总是先收到调用。在 PreTranslateMessage 调用链中的某个人返回 TRUE 之前,所有 parent 都有机会。

关于c++ - MFC 重定向/捕获 MESSAGE_MAP |预翻译消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33825766/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com