【筆記】MFC 無(wú)邊框移動(dòng)
因?yàn)檎伊税胩欤谑蔷陀浵聛?lái),以防以后還會(huì)再用。
首先,假設(shè)對(duì)話(huà)框類(lèi)為:CMFCAppDlg,那么
頭文件:CMFCAppDlg.h
源文件:CMFCAppDlg.cpp
已知只有拖動(dòng)對(duì)話(huà)框窗口的標(biāo)題欄才能移動(dòng)窗口,那只要我們告訴系統(tǒng)鼠標(biāo)點(diǎn)在窗體上就是點(diǎn)在標(biāo)題欄上即可。
本方案實(shí)現(xiàn)的辦法很簡(jiǎn)單,就是使用?WM_NCHITTEST?消息,這個(gè)消息是用來(lái)獲取鼠標(biāo)當(dāng)前命中的位置。
現(xiàn)在只要重載 WM_NCHITTEST 消息的?OnNcHitTest 函數(shù),使其返回?HTCAPTION ,系統(tǒng)就會(huì)認(rèn)為我們點(diǎn)在標(biāo)題欄上。
在 CMFCAppDlg.h 中添加消息映射函數(shù) OnNcHitTest(CPoint point) 。
在 CMFCAppDlg.cpp 中添加?ON_WM_NCHITTEST() 消息定義。
在 CMFCAppDlg.cpp 中添加?OnNcHitTest(CPoint point) 函數(shù)定義。
如果將上述代碼中?rc.bottom = rc.top + 100; 的注釋取消的話(huà),那么只有在點(diǎn)擊窗體頂部到 100 這個(gè)方形區(qū)域內(nèi)才能移動(dòng)窗體,通過(guò)此方法可以限制鼠標(biāo)拖動(dòng)窗體的點(diǎn)擊區(qū)域,比如假裝自己有個(gè)標(biāo)題欄,點(diǎn)擊標(biāo)題欄下方的區(qū)域無(wú)法拖動(dòng)窗體。
同理,只要我們獲取控件的區(qū)域,將點(diǎn)擊這個(gè)區(qū)域變成點(diǎn)擊標(biāo)題欄就能實(shí)現(xiàn)點(diǎn)擊控件挪動(dòng)窗體。
這里需要重載消息處理函數(shù)?PreTranslateMessage ,它將會(huì)在消息發(fā)送到窗口之前攔截消息并處理,再發(fā)給窗口。
同樣的先在?CMFCAppDlg.h 中添加
再往CMFCAppDlg.cpp?中添加函數(shù)定義
這里需要注意的是,上面的方法可能造成控件失控,就像我上面的代碼所示,我獲取的確認(rèn)按鈕的區(qū)域,所以我只有再鼠標(biāo)完全靜止的時(shí)候點(diǎn)擊按鈕才能使用這個(gè)按鈕本身的功能,一旦鼠標(biāo)有一點(diǎn)晃動(dòng)就會(huì)變成拖動(dòng)窗體了。
所以有些控件比如,滾動(dòng)條,當(dāng)你的鼠標(biāo)在上面滑動(dòng)的時(shí)候,可能只能拖動(dòng)窗體,而無(wú)法拖動(dòng)里面的內(nèi)容。
話(huà)說(shuō)代碼塊看的到嗎?在預(yù)覽里面是空的,我提交試試,看不到的話(huà)在想想其他辦法。