MFC无标题栏对话框移动的处理方法

很多时候,为了界面的美观,我们会隐藏标题栏,而在客户区通过自绘模拟标题栏。但是这样处理,会导致窗体无法移动。下面提供几种移动方法:

1、采用欺骗的方式。即当鼠标点击客户区的时候,我们欺骗windows,让windows认为我们点击在了标题栏,这样,拖动过程就通过windows进行处理了。因此可以大大减少我们的代码量。具体方法如下:

响应鼠标左键按下消息WM_LBUTTONDOWN,相应函数中,直接发送欺骗消息:

PostMessage(WM_NCLBUTTONDOWN, HTCAPTION, MAKELPARAM(point.x, point.y));

WM_NCLBUTTONDOWN即左键在非客户区按下,HTCAPTION即标题栏,所以采用这种方式,就可以实现无标题栏对话框的移动问题了。

那么问题来了。。。

采用这种操作后,会导致我们的对话框无法响应WM_LBUTTONUP消息,同时在我编写程序过程中发现WM_NCLBUTTONUP也一般不能响应。当然,可以通过注册WM_MOUSEHOVER以及WM_MOUSELEAVE消息,响应这两个消息去处理相应的代码,或者采用下钩子的方法,在钩子中正确发送消息,不过不推荐这种方法,实现也比较麻烦。

所以下面提供第二种方法。

2、在WM_MOUSEMOVE消息中,自己处理窗口移动。具体就是先判断鼠标左键是否处于按下,如果是的话,就获取鼠标移动到的位置,然后将窗口进行移动就可以了。具体实现如下:

void CMyDlg::OnMouseMove(UINT nFlags, CPoint point)  
{  
    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); 
}

通过上面的消息,就能够进行窗口移动了。然而,如果仅仅响应上面的消息发现两个问题:第一,当鼠标按住左键快速移动的时候,鼠标会移出窗口,窗口不动了,拖动效果不好;第二,左键释放消息在上面这种情况下没有响应。解决方法如下:

首先左键按下消息中设置鼠标捕获

SetCapture();

在左键释放消息中释放鼠标捕获

RealeseCapture();

通过上面的处理,就可以完美拖动,同时,左键抬起的消息也不会受影响。

因此,第一种方法较为简洁,适合不需要响应鼠标其它消息的情况;第二种方法相对麻烦一些,不过实现效果也很好,并且不影响其他消息。

时间: 2024-10-21 07:53:01

MFC无标题栏对话框移动的处理方法的相关文章

VC 无标题栏对话框移动(在OnLButtonDown里再次发送消息)

操作系统:Windows 7软件环境:Visual C++ 2008 SP1本次目的:实现无框移动 所谓的无标题栏对话框,是基于对话框的工程,对话框属性Border设置为None,对话框如下所示: 为对话框添加左键点击事件,代码如下: [cpp] view plain copy void CPlayerDlg::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代码和/或调用默认值 SendMessage(WM_SYSCO

MFC无边框对话框移动

当窗口确定鼠标位置时,Windows向窗口发送WM_NCHITTEST消息,可以处理该消息,使得只要鼠标在窗口内,Windows便认为鼠标在标题条上.这需要重载CWnd类处理WM_NCHITTEST消息的OnNcHitTest函数,在函数中调用父类的该函数,如果返回HTCLIENT,说明鼠标在窗口客户区内,使重载函数返回HTCAPTION,使Windows误认为鼠标处于标题条上. 当用户在窗口客户区按下鼠标左键时,使Windows认为鼠标是在标题条上,即在处理WM_LBUTTONDOWN消息的处

MFC小知识一:将对话框设置为无边框无标题栏初始最大化样式

今天公司新开始的一个项目.界面模式为无边框无标题栏初始最大化样式.其实本来可以直接在属性里面将默认的Resizing换成none就可以了,那么我想如何用代码来实现呢?于是就百度了一下.找到了两种方式,但其实两种方式思想是一样的.即修改样式--ModifyStyle.直接将以下代码加在OnInitDialog()即可实现. 第一种: 1 // 去掉标题栏 2 ModifyStyle(WS_CAPTION, 0); 3 // 去掉边框 4 ModifyStyleEx(WS_EX_DLGMODALFR

不用splitter控件 简单实现对mfc对话框的分割的方法

不用splitter控件  简单实现对mfc对话框的分割的方法 直接贴上源代码主要部分吧 这个是基于对话框的工程 进行对话框的分割实现 只是相应了三个消息函数,看一下就会明白的 我空间资源里边有现成的工程代码可以下载运行 .cpp 文件 [cpp] view plaincopy // spliteDlg.cpp : implementation file // #include "stdafx.h" #include "splite.h" #include &quo

MFC中无标题栏窗口的移动

原文链接: http://blog.sina.com.cn/s/blog_6288219501015dwa.html 移动标准窗口是通过用鼠标单击窗口标题条来实现的,但对于没有标题条的窗口,就需要用鼠标单击窗口标题条以外区域来移动窗口.有两种方法可以达到这一目标. 方法一:当窗口确定鼠标位置时,Windows向窗口发送WM_NCHITTEST消息,可以处理该消息,使得只要鼠标在窗口内,Windows便认为鼠标在标题条上.这需要重载CWnd类处理WM_NCHITTEST消息的OnNcHitTest

Android实现无标题栏全屏的三种方法

一.通过Java代码 在setContentView之前执行: requestWindowFeature(Window.FEATURE_NO_TITLE);//隐藏标题栏 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);//隐藏状态栏 二.调用Android自带的Theme 直接在AndroidManifest.xml中需要全屏显

C#实现无标题栏窗体点击任务栏图标正常最小化或还原的解决方法

对于无标题栏窗体,也就是FormBorderStyle等于System.Windows.Forms.FormBorderStyle.None的窗体,点击任务栏图标的时候,是不能象标准窗体那样最小化或还原的.把下面的代码加到你的Form实现类中,即可实现点击任务栏图标正常最小化或还原窗体. [c-sharp] view plain copy protected override CreateParams CreateParams { get { const int WS_MINIMIZEBOX =

添加无模式对话框

本文只描述了一种添加无模式对话框的方法,不涉及所有方法的讨论,有好的方法,欢迎大家讨论.关于模式和无模式的对话框的区别,在上篇文章中已有,不再赘述,直接捞干的. 1.创建的是基于对话框的工程.(我的是wince下的): 2.有一个父窗口,插入新的窗口如newDlg,并将其属性设置为child: 3.给newDlg 添加类,如newDlg.cpp , newDlg.h 4.在父窗口文件中添加以下代码: 某个按钮操作函数{           //创建   newDlg  NewDlg:      

MFC 在父对话框中内嵌子对话框

MFC 在父对话框中内嵌子对话框 分类: MFC2012-10-10 21:46 2222人阅读 评论(4) 收藏 举报 mfcborder 原文地址:http://blog.csdn.net/leesaiya/article/details/7374537 [cpp] view plaincopy 一.对话框中显示对话框的方法: 1.首先创建要在对话框里显示的那个对话框,命名为:IDD_INNER. 设置这个对话框的属性: 1).“Style”选择“Child”:中文版“样式”选择“下层”.