MFC設計或實現之漏洞

一.

我使用了OnNcLButtonDown可以響應消息,之後使用OnNcLButtonUp卻不能響應單擊消息,但雙擊能響應。
因爲窗口管理器在處理 OnNcLButtonDown 的時候捕捉了鼠標焦點,即使用了 SetCapture 函數,在捕捉了鼠標焦點後,窗口就不會發送 WM_NCLBUTTONUP 消息而會發送 WM_LBUTTONUP 消息。

解決辦法:
在你的CXXDialog中的消息處理函數OnSysCommand()(對WM_SYSCOMMAND的響應)添加下面代碼:

void CXXXDialog::OnSysCommand(UINT nID, LPARAM lParam)
{
if( (nID & 0xFFF0) == IDM_ABOUTDLG )
{
// 省略...
}
else
{
// 這是本來有的
CDialog::OnSysCommand(nID, lParam);

// 加入下面這2行
if( (nID & 0xFFF0) == SC_MOVE )
PostMessage(WM_NCLBUTTONUP, nID, lParam);
}
}

當DLG收到WM_NCLBUTTONDOWN後, 卻省的DefWindowProc會發送WM_SYSCOMMAND, 然後在處理WM_SYSCOMMAND時, 還會有一些消息被髮送並處理, 會使WM_NCLBUTTONUP不會被收到, 所以在WM_SYSCOMMAND的處理返回後, 再補發一個WM_NCLBUTTONUP

發佈了27 篇原創文章 · 獲贊 1 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章