说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

如何拖动窗体??我知道各位老大都会

编辑:说三道四文库 发布时间:2018-07-19 10:01
HTML文档下载 WORD文档下载 PDF文档下载
做一个控件,模拟窗口标题栏。
其它的基本上都实现了,但现在遇到一个问题:如何使拖动该控件动作-->变成拖动窗口位置动作?

可用记录MouseDown位置及拖动位置的方法,当MouseMove时,动态改变Form的Left及Top,但这样每次MouseMove时窗口都将重画,系统效率低下,且不象真正的窗口标题栏拖动(仅画一个虚框)。

也可以在桌面上画一个虚框,(用::GetDC(0)来获得桌面句柄,之后::FrameRect(dc,&aRect,aBrush);),但之后怎么察除呢?

也可映射消息WM_NCHITTEST,但我是从TControl下继承而来的,不知怎的它不响应该消息,唉!


请高手指点一二,有思路也可!
The framework calls this member function for the CWnd object that contains the cursor (or the CWnd object that used the SetCapture member function to capture the mouse input) every time the mouse is moved.

afx_msg UINT OnNcHitTest(
   CPoint point 
);


HTCAPTION   In a title-bar area.
void __fastcall TfrmAbout::FormMouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
    if(Button==mbLeft)
    {
        ReleaseCapture();
        SendMessage(Handle,WM_NCLBUTTONDOWN,HTCAPTION,NULL);
    }    
}

void __fastcall TForm1::FormMouseDown(TObject *Sender,
      TMouseButton Button, TShiftState Shift, int X, int Y)
{
    //无标题窗口的拖动
    if(Button==mbLeft)
    {
        ReleaseCapture();
        SendMessage(this->Handle,WM_SYSCOMMAND,SC_MOVE+HTCAPTION,0);
        SetWindowPos(this->Handle,HWND_TOPMOST,0,0,0,0,SWP_NOACTIVATE|SWP_NOMOVE|SWP_NOSIZE);        
    }       
}
给你我的程序中的在桌面上的画框的函数,这是我用VC中sdk写的,调用部份没有给全,你自己写吧!
//这个函数画虚框
void DrawUIBorder( LPRECT lprc )
{
    HDC hDC;
    int sbx, sby;

    hDC = CreateDC( "DISPLAY", NULL, NULL, NULL );
    SelectObject( hDC, GetStockObject( GRAY_BRUSH ) );//这里可以自己定义是实线还是虚框
    sbx = GetSystemMetrics( SM_CXBORDER );
    sby = GetSystemMetrics( SM_CYBORDER );
    PatBlt( hDC, lprc->left, 
lprc->top, 
lprc->right - lprc->left-sbx, 
sby, PATINVERT );
    PatBlt( hDC, lprc->right - sbx, 
lprc->top, 
sbx, 
lprc->bottom - lprc->top-sby, PATINVERT );
    PatBlt( hDC, lprc->right, 
lprc->bottom-sby, 
-(lprc->right - lprc->left-sbx), 
sby, PATINVERT );
    PatBlt( hDC, lprc->left, 
lprc->bottom, 
sbx, 
-(lprc->bottom - lprc->top-sby), PATINVERT );
    DeleteDC( hDC );
}
static RECT rect;//记录画虚线框的矩形位置
在mousemove事件中:

  int w,h;
  RECT re;
                              POINT p;
                              DrawUIBorder(&rect);//清除上一次的虚线
                               GetCursorPos(&p);
                              ...根据p来设定你要画的新的虚线框的矩形位置rect
           DrawUIBorder(&rect);//画这一次的虚线框
在mouseup事件中:
                DrawUIBorder(&rect);//清除上一次的虚线
                movewindow(....);//移动窗体
             
void __fastcall TForm1::Label1MouseMove(TObject *Sender, TShiftState Shift,
      int X, int Y)
{
   //if the user is holding the left mouse button down -- move
   if( Shift.Contains( ssLeft ) )
   {
       ReleaseCapture();
       SendMessage(Handle,0xA1,2,0);
   }
   //if the user is holding the right mouse button down -- popup menu
   if( Shift.Contains( ssRight ) )
   {
       PopupMenu1->Popup(X+ Left,Y+ Top);
    }

}
学习
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘