1. 程式人生 > >MFC 中實現在客戶區拖動來拖動視窗的方法總結

MFC 中實現在客戶區拖動來拖動視窗的方法總結

VC++實現無標題欄對話方塊的拖動 其實說白了就是欺騙,欺騙誰了?呵呵,當然是欺騙windows,本來是移動標題欄可以拖動窗體,那麼我們現在是拖動客戶區來移動,當我們拖動標題欄的時候windows產生一個WM_NCHITTEST訊息,這個訊息確定滑鼠點選的哪個位置,這個訊息返回一個值,從而確定是“客戶區”還是“非客戶區”,當返回的值是HTCAPTION,說明這時拖動的是標題欄

  那麼我們現在就來欺騙,當用戶拖動非標題欄的時候直接返回一個HTCAPTION狀態就可以 ,看程式碼

  在對話方塊中過載訊息WM_NCHITTEST ,新增如下程式碼

  CRect rc;

  GetClientRect(&rc);//得到客戶區的大小

  ClientToScreen(&rc);//座標轉換

  return rc.PtInRect(pt) ? HTCAPTION : //當用戶滑鼠的點選位置在客戶區的時候直接返回HTCAPTION

  當然了上面的方法只是適合對話方塊,那我們有的時候拖動的卻是檢視,那怎麼設計呢!首先大家明白這樣一個道理,Windows在傳送WM_NCHITTEST訊息時,是將它傳送到滑鼠游標下的框架/檢視最頂層非透明視窗,由於檢視首先獲得WM_NCHITTEST 訊息。所以只要在檢視的WM_NCHITTEST訊息處理例程中返回HTTRANSPARENT,直接在檢視的WM_NCHITTEST訊息中新增如下程式碼

  return HTTRANSPARENT; //返回這個狀態標誌

  上面的方法看了網上的資料總結的,當然了還有更簡單的,只要在OnLButtonDown事件中新增如下一句程式碼也可以實現

  PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y));

  這裡注意,在檢視視窗中新增可能不起作用,這段程式碼只能適合對話方塊型別