松鼠的博客

导航

统计

拖动没有标题栏的窗体

方法一:处理WM_NCHITTEST消息,不过还需要自已处理标题栏系统按钮的事件,有点麻烦。

(1)在.h文件中添加WM_NCHITTEST处理函数

void __fastcall WMNchitTest(TMessage &Message);

 

(2)添加消息映射

    BEGIN_MESSAGE_MAP
    MESSAGE_HANDLER(WM_NCHITTEST,TMessage,WMNchitTest)
    END_MESSAGE_MAP(TForm)

(3)编写消息处理代码
复制代码
void __fastcall TForm1::WMNchitTest(TMessage &Message)
{
    
if(GetAsyncKeyState(VK_LBUTTON)<0)
        Message.Result 
= HTCAPTION;
    
else
        Message.Result 
= HTCLIENT;
}
复制代码

 

方法二:通过OnMouseMove,OnMouseUp,OnMouseDown来使窗体即时移动

(1)定义bool IsDraging;全局变量来在OnMouseMove事件中判断是否需要进行窗体移动

复制代码
void __fastcall TForm1::MouseMove(TObject *Sender,TMouseButton Button,TShiftState Shift,int X,int Y)
{
    
if(IsDraging)
    
{
        
this->Left+=X-xx;//移动当前窗体的X坐标
        this->Top+=Y-yy;//移动当前窗体的Y坐标
    }

}
复制代码

 

(2)在OnMouseDown中将IsDraging设为true

void __fastcall TForm1::MouseDown(TObject *Sender,TMouseButton Button,TShiftState Shift,int X,int Y)
{
    IsDraging 
= true;
    xx 
= X;//全局变量,用来保存拖动的开始X坐标
    yy = Y;//全局变量,用来保存拖动的开始Y坐标
}

 

(3)在OnMouseUp中将IsDraging设为false

void __fastcall TForm1::MouseUp(TObject *Sender,TMouseButton Button,TShiftState Shift,int X,int Y)
{
    IsDraging 
= false;
}

 

方法三:向系统发送消息,告诉系统,鼠标现在在标题栏

复制代码
void __fastcall TForm1::MouseDown(TObject *Sender,TMouseButton Button,TShitftState Shift,int X,int Y)
{
    Refresh();
    
if(Button == mbLeft)
    
{
        ReleaseCapture();
        Perform(WM_SYSCOMMAND,
0xf017,0);
    }

}
复制代码

 

相关资料:
(1)TApplicationEvents

posted on   Xproer-松鼠  阅读(251)  评论(0编辑  收藏  举报

编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示