您可以将控件设置为将WM_PARENTNOTIFY
消息发送到父对话框(默认情况下不发送),并将该OnParentNotify()
函数的覆盖添加到您的对话框类。基本程序如下所述。
首先,您需要WS_EX_NOPARENTNOTIFY
从列表框控件中删除样式,以便它将所需的消息发送到其父级。有几种方法可以做到这一点,但一种非常简单的方法是修改OnInitDialog
覆盖中的“ex-style”,如下所示:
BOOL MyDialog::OnInitDialog(void)
{
CDialog::OnInitDIalog(); // Call base class
//...
// Other code you need
//
CWnd* pList = GetDlgItem(IDC_MYLISTBOX); // Use the resource ID of the listbox
LONG_PTR exstyle = GetWindowLongPtr(pList->m_hWnd, GWL_EXSTYLE);
// Remove the WS_EX_NOPARENTNOTIFY bit ...
exstyle &= ~WS_EX_NOPARENTNOTIFY;
SetWindowLongPtr(pList->m_hWnd, GWL_EXSTYLE, exstyle); // Set new style
//...
return TRUE; // Assuming you don't explicitly set the focus
}
然后,您需要添加ON_WM_PARENTNOTIFY
到对话框的消息映射:
BEGIN_MESSAGE_MAP(MyDialog, CDialog)
//...
ON_WM_PARENTNOTIFY()
END_MESSAGE_MAP()
最后,拦截通知的处理程序:
void MyDialog::OnParentNotify(UINT message, LPARAM lParam)
{
CDialog::OnParentNotify(message, lParam); // Always best to call base class for MFC!
if (message == WM_RBUTTONDOWN) {
// Here, we can handle the right-button click!
// lParam will be the cursor position (x in LOWORD and y in HIWORD)
// NOTE: See the caveat mentioned below!
}
}
这种方法的一个(可能是麻烦的)问题是(您可能已经注意到)没有传递给处理函数的有关通知来自哪个控件的信息。如果您的对话框中只有一个控件启用了此行为,那没关系;否则,您将不得不做一些诡计(使用给定的光标位置和控件的窗口矩形)来确定哪个控件发送了消息。