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

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

编辑:说三道四文库 发布时间:2018-01-19 01:43
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);
    }

}
学习
.NET程序性能的基本要领 百度手机卫士宣布开放三大能力 构建互联网安全生态 火速围观,AMD APU新芯片架构A68H呼之欲出! 对于测试人员而言,TDD意味着什么? 年用电910亿度,那些庞大的数据中心该用什么支撑 前辈多指教:新手的几个简单问题集(1) 电影中的续集到底是什么意思?我和同事为了这个问题吵了一天 有没有这种可能性? 参加Sun全球认证日说明会,一定要买考试券吗? 关于数据环境与datareort问题。 为什么我的CSDN不能用,登录后左边的树没有了! 求救:重装系统!! 各路英雄请指教!虚拟主机配置问题!!!!!! 怎样在ActiveReport的设计态的ARDesigner中加入自己做的阿ActiveX控件。 不定积分中凑微分法求∫e^x乘以sin(e^x+1 写出科学家的名字:洗澡时发现浮力定律_____;地 蛋白质透析复性的温度是多少,我分别用含6M、4M、 《飞夺泸定桥》阅读答案飞夺泸定桥》 1935年5月 飞夺泸定桥阅读问题,索性的意思_________. 11.飞夺泸定桥 1935年5月,北上抗日的红军向 飞夺泸定桥阅读答案.急!飞夺泸定桥1935年5月, 上海教材五年级下册的语文,11课“飞夺泸定桥”的阅 土旁加个曹字读什么?有这个字么,村里很多老人写地名 狗追捕兔子摔断腿 滞留高山上三周奇迹习近平会见印度总理辛格瑞士一战机在该国中部坠毁 人员伤亡未瑞士一战机在该国中部坠毁 人员伤亡未日媒:日将实施自卫队夺岛演习 或刺激前三季山西商品房销量同比增长 竣工面萧敬腾遭泼粪事件嫌疑人已确认 自称只中超-上海上港1-1广州恒大宜家2014年春季重庆开店 计划每年厦门远洋船队远航赴印尼捕捞 90年代清门尘世仙侠宇宙的游戏网游之新石器时代香港梦商业文化博物馆旅游腾龙洞旅游徽杭古道旅游绕南陶瓷主题园区旅游德胜门箭楼旅游
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘