如何处理 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 派生自 CMDIFrameWndCMDIFrameWndEx,您可以使用它的 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;
}