VC++ 鼠标非显示区域命中测试消息WM_NCHITTEST和相关编程问题学习1
此消息代表非顯示區域命中測試;非顯示區域,應該指窗口客戶區以外的區域;
這個消息優先于所有其他的顯示區域和非顯示區域鼠標消息;其中lParam參數含有鼠標位置的x和y屏幕坐標,wParam 這里沒有用;
消息的返回值:
? ? 下面列出的鼠標擊中測試枚舉值之一;
HTBORDER 在不具有可變大小邊框的窗口的邊框上?!?br /> HTBOTTOM 在窗口的水平邊框的底部?!?br /> HTBOTTOMLEFT 在窗口邊框的左下角。
HTBOTTOMRIGHT 在窗口邊框的右下角?! ?br /> HTCAPTION 在標題條中?! ?br /> HTCLIENT 在客戶區中。
HTERROR 在屏幕背景或窗口之間的分隔線上(與HTNOWHERE相同,除了Windows的DefWndProc函數產生一個系統響聲以指明錯誤)?! ?br /> HTGROWBOX 在尺寸框中?! ?br /> HTHSCROLL 在水平滾動條上?! ?br /> HTLEFT 在窗口的左邊框上。
HTMAXBUTTON 在最大化按鈕上?! ?br /> HTMENU 在菜單區域。
HTMINBUTTON 在最小化按鈕上?! ?br /> HTNOWHERE 在屏幕背景或窗口之間的分隔線上。
HTREDUCE 在最小化按鈕上?! ?br /> HTRIGHT 在窗口的右邊框上?! ?br /> HTSIZE 在尺寸框中。(與HTGROWBOX相同)
HTSYSMENU 在控制菜單或子窗口的關閉按鈕上?! ?br /> HTTOP 在窗口水平邊框的上方。
HTTOPLEFT 在窗口邊框的左上角。
HTTOPRIGHT 在窗口邊框的右上角。
HTTRANSPARENT 在一個被其它窗口覆蓋的窗口中?! ?br /> HTVSCROLL 在垂直滾動條中?! ?br /> HTZOOM 在最大化按鈕上。
這個消息的一個經典應用是,拖動一個無標題欄的窗體或者說我如何實現在客戶區也能拖動此窗體;
?
win10, VC6;新建一個對話框工程,或單文檔工程;代碼為,
UINT CMainFrame::OnNcHitTest(CPoint point) {// TODO: Add your message handler code here and/or call defaultUINT nHitTest = CFrameWnd::OnNcHitTest (point);if (nHitTest == HTCAPTION){AfxMessageBox("鼠標在標題條中!!!");}//if ((nHitTest == HTCLIENT) && (::GetAsyncKeyState (MK_LBUTTON) < 0))//{// nHitTest = HTCAPTION;//AfxMessageBox("鼠標在標題條中!!!");//}return CFrameWnd::OnNcHitTest(point); }如果由對話框類或視圖類處理此消息,添加代碼,則出錯如下;
也就是只能由主框架類處理此消息;代碼如前;
根據前面此消息的定義,運行程序,看鼠標放到窗口標題條上,是否彈出對話框;結果是,沒反應;代碼中注釋部分和沒注釋部分,都是一樣;
下回再整;
如果類向導中沒有出現?WM_NCHITTEST 消息;則做如下選擇;
從代碼來看,消息響應函數收到的是鼠標點坐標,再通過點坐標調用?CFrameWnd::OnNcHitTest (point) 獲得鼠標位置的枚舉值;
總結
以上是生活随笔為你收集整理的VC++ 鼠标非显示区域命中测试消息WM_NCHITTEST和相关编程问题学习1的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 初步了解Telerik for WPF
- 下一篇: VC++图片框控件静态和动态加载位图