在客户区拖动窗口(拖动无边框窗口)两种实现方法及原理分析

4220 人浏览 | 时间: 2015-06-23 14:39:33 | 作者: codexia

    正如简介所说,两种方式,各有所长。下面讲解一下两种方式。根据具体情况选择。
    第一种,基于MFC窗口机制。这种方式代码很简单。但是如果你不了解其中的机制,你就想不到可以这样使用。同时,如果你不了解,你也掌握不了,下次使用又记不住。提到记忆,只是因为没有理解,如果你理解,使用过几次后,就忘不了了。所以,理解内部机制,你才能够真正掌握,以后需要就新手拈来。先来看看代码。

LRESULT CbtnTextDlg::OnNcHitTest(CPoint point)
{
    UINT nHitTest = CDialogEx::OnNcHitTest(point);
    if(nHitTest == HTCLIENT)//如果是客户区
    nHitTest = HTCAPTION; //则把它当成标题栏
    return nHitTest;
}
//为了更清晰起见,将整个函数都贴出来,这样读者就知道这个函数在代码中的样子。

    这是MFC中的代码,所以,如果你是使用MFC的话,就直接可以复制粘贴就可以达到效果。当然,如果你不了解,呵呵,你根本就不知道这个段代码贴到哪去。所以,为了以后运用自如,慢慢看完分析解说。
    OnNcHitTest是消息WM_NCHITTEST的标准响应函数,所以,你使用类向导添加这个消息的响应,然后将函数内的代码写成代码段中的那样就可以实现了。如果你看到这个,就把代码贴过去解决了,然后不接着往下看看,那你就是码农了。OnNcHitTest返回的值,自然最终传递给系统,从而使系统来改变窗体。你要记住,你所有的代码都是请系统来帮忙的,你不会直接使窗体移动的,虽然是你写的代码,你只是委托系统完成的。这就是API调用的思想。而函数只有一个参数。这个参数是点结构体,有这个参数就够了。这个点是鼠标单击的屏幕点坐标,也就是原点是屏幕左上角。系统会根据这个鼠标的点,结合窗口的非客户区来判断这点落在这个区域没有,如果落在里面,则返回一个标志码,表示已经单击了非客户区,如果拖动的话,窗口就随之拖动了。这就是拖动标题栏自动拖动窗口的原理。平常我们拖动窗口并不会注意这个细节。但是,如果你的窗口选择了无边框的风格,那么,问题就来了。因为没有边框,标题栏都没了。既然没有了,那么就不可能有非客户区的单击了。这样就无法拖动窗口了。解决办法在这段代码中了。
    OnNcHitTest这个函数是非客户单击测试消息响应函数,其实这样会使很多人有误解,以为是单击非客户区才有的。其实不是的,这个函数名表示它要执行的功能只是测试非客户区,如果满足就执行一定的操作,如果不是就不执行默认的操作

请微信扫码阅读。
为防止恶意爬虫,
已开启反爬机制,
理解哟~~~~
标注
评论
站内搜
百度搜
传送到手机
手机扫码,识别文字,完成传送x
加载中...
标注内容x
加载中...
添加标注x
收藏 0 点赞 0

相关阅读