[MFC] Cum deplasez un dialog cu mouse-ul?

Despre MFC, ATL si alte biblioteci C++ de la Microsoft (forum moderat)
Post Reply
User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

[MFC] Cum deplasez un dialog cu mouse-ul?

Post by Ovidiu Cucu » 23 Nov 2007, 14:15

Intrebare
Cum deplasez un dialog (sau o fereasta, in general) tragandu-l cu mouse-lul din orice punct al lui?

Raspuns
Cel mai frecvent raspuns pe care l-am intalnit este: "Handle WM_NCHITTEST and always return HTCAPTION".
E OK, functioneaza, doar in cazul cand dialogul/fereastra nu are meniu/meniu sistem, buton maximize/minimize/close, scrollbar si nici nu este redimensionabila. Altfel, nu se mai poate folosi nici meniul si nici una din cele mentionate mai sus.
Un pic mai bine este sa se forteze valoarea de return din handlerul lui WM_NCHITTEST la HTCAPTION, numai pentru zona client.

Exemplu

Code: Select all

UINT CMyDialog::OnNcHitTest(CPoint point) 
{
   UINT nRet = CDialog::OnNcHitTest(point);

   if(HTCLIENT == nRet)
   {
      nRet = HTCAPTION;
   }
   return nRet;
}
O alta medoda, aparent nu tot atat de OK dar care totusi functioneaza, este sa se posteze un mesaj WM_NCLBUTTONDOWN din handlerul mesajului WM_LBUTTONDOWN.

Exemplu

Code: Select all

void CMyDialog::OnLButtonDown(UINT nFlags, CPoint point) 
{
   CDialog::OnLButtonDown(nFlags, point);
   PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y));
}
<< Back to MFC index



Post Reply