如何处理 CMainFrame 中的鼠标点击
How to handle mouse clicks in CMainFrame
如何检测“空”CMainFrame 中的鼠标点击?空的我的意思是一个 MDI 还没有 document/view.
我尝试使用以下方法检测鼠标点击:
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
BOOL CMainFrame::PreTranslateMessage(MSG* pMsg);
MDI主机windows有一个'invisible'clientwindow占用主机的客户区。使用 'normal' class 覆盖技术无法访问此 window,但是,如果该主框架 window 派生自 CMDIFrameWnd
或 CMDIFrameWndEx
,您可以使用它的 m_hWndMDIClient
成员(那个不可见的 window 的 HWND
)通过覆盖它的 WindowProc
.
来子class它
我使用 bool
成员变量(设置为 false
构造)来跟踪子classing是否已经完成。
这里有一个可能的解决方案(改编自我自己的代码)可能适用于拦截鼠标点击。 (我对其进行了测试,确实在鼠标点击时得到了 Beep()
诊断!)
// Local function pointer to store the 'original' (default) window procedure...
LRESULT (CALLBACK *DefCliPrc)(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) = nullptr;
// Static definition of our override procedure...
static LRESULT CALLBACK ClientProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LRESULT answer = DefCliPrc(hWnd, uMsg, wParam, lParam); // First, call default proc.
if (uMsg == WM_LBUTTONDOWN) {
Beep(1000,1000); // Make a sound to show that it's working!
// <Insert your handling code here>
}
//...
// Intercept/handle other messages, as required ...
//...
return answer;
}
// Override of the UpdateWindow function, to enact the subclassing...
void MyMainFrame::UpdateWindow(void)
{
if (!funchange) { // Only do the sub-classing ONCE ...
DefCliPrc = (WNDPROC)(intptr_t)(::GetWindowLongPtr(m_hWndMDIClient, GWLP_WNDPROC));
::SetWindowLongPtr(m_hWndMDIClient, GWLP_WNDPROC, (intptr_t)(ClientProc));
funchange = true; // Set this 'flag' to prevent repetition!
}
CMDIFrameWnd::UpdateWindow(); // Should always call base class
return;
}
如何检测“空”CMainFrame 中的鼠标点击?空的我的意思是一个 MDI 还没有 document/view.
我尝试使用以下方法检测鼠标点击:
afx_msg void OnLButtonDown(UINT nFlags, CPoint point);
BOOL CMainFrame::PreTranslateMessage(MSG* pMsg);
MDI主机windows有一个'invisible'clientwindow占用主机的客户区。使用 'normal' class 覆盖技术无法访问此 window,但是,如果该主框架 window 派生自 CMDIFrameWnd
或 CMDIFrameWndEx
,您可以使用它的 m_hWndMDIClient
成员(那个不可见的 window 的 HWND
)通过覆盖它的 WindowProc
.
我使用 bool
成员变量(设置为 false
构造)来跟踪子classing是否已经完成。
这里有一个可能的解决方案(改编自我自己的代码)可能适用于拦截鼠标点击。 (我对其进行了测试,确实在鼠标点击时得到了 Beep()
诊断!)
// Local function pointer to store the 'original' (default) window procedure...
LRESULT (CALLBACK *DefCliPrc)(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) = nullptr;
// Static definition of our override procedure...
static LRESULT CALLBACK ClientProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
LRESULT answer = DefCliPrc(hWnd, uMsg, wParam, lParam); // First, call default proc.
if (uMsg == WM_LBUTTONDOWN) {
Beep(1000,1000); // Make a sound to show that it's working!
// <Insert your handling code here>
}
//...
// Intercept/handle other messages, as required ...
//...
return answer;
}
// Override of the UpdateWindow function, to enact the subclassing...
void MyMainFrame::UpdateWindow(void)
{
if (!funchange) { // Only do the sub-classing ONCE ...
DefCliPrc = (WNDPROC)(intptr_t)(::GetWindowLongPtr(m_hWndMDIClient, GWLP_WNDPROC));
::SetWindowLongPtr(m_hWndMDIClient, GWLP_WNDPROC, (intptr_t)(ClientProc));
funchange = true; // Set this 'flag' to prevent repetition!
}
CMDIFrameWnd::UpdateWindow(); // Should always call base class
return;
}