CRect rcDialog;//创建对象 GetClientRect(&rcDialog);//创建区域并赋予对话框 CRgn rgn; //rgn.CreateEllipticRgn (0,0,rcDialog.Width(),rcDialog.Height());//创建圆形或椭圆形“region”。 rgn.CreateRoundRectRgn(0 , 0 , rcDialog.Width( ) , rcDialog.Height( ),rcDialog.Width()-50,rcDialog.Height()-50);//创建圆角矩形“region” //rgn.CreateRectRgn( 0, 0, rcDialog.Width(), rcDialog.Height()); //创建矩形的“region”。 //rgn.CreatePolygonRgn(pt, //LPPOINT lpPoints // rcDialog.Width(), //int nCount //rcDialog.Height()); //创建多边形“region”。int nMode //设置区域 SetWindowRgn( (HRGN) rgn ,TRUE );
方法一:直接在OnNcHitTest中虚拟发送HTCAPTION消息
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
UINT CMainFrame::OnNcHitTest(CPoint point) { RECT rectWindows, rectClient; this->GetWindowRect(&rectWindows); this->GetClientRect(&rectClient); if (point.y > rectWindows.top && point.y < rectWindows.top + 25) { return HTCAPTION;//标题栏形式 } else { return CFrameWnd::OnNcHitTest(point); } }
方法二:直接在OnLButtonDown中虚拟发送WM_NCLBUTTONDOWN,HTCAPTION消息
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
void CMyDlg::OnLButtonDown(UINT nFlags, CPoint point) { if (point.y < 26) PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y)); CDialog::OnLButtonDown(nFlags, point); }
方法三:通过在OnMouseMove中手动进行处理
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
void CMyDlg::OnMouseMove(UINT nFlags, CPoint point) { // TODO: Add your message handler code here and/or call default static CPoint PrePoint = CPoint(0, 0); if(MK_LBUTTON == nFlags) { if(point != PrePoint) { CPoint ptTemp = point - PrePoint; CRect rcWindow; GetWindowRect(&rcWindow); rcWindow.OffsetRect(ptTemp.x, ptTemp.y); MoveWindow(&rcWindow); return ; } } PrePoint = point; CDialog::OnMouseMove(nFlags, point); }
控件拖动:
控件拖动只能采用上述的第三种方法