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