说明

  • 演示环境: Vs2015 + MFC 基于对话框程序

效果图

方法1

  • 注意: 此方法存在缺陷: 无法响应LButtonUp消息

添加消息处理函数

函数代码

void CMFCApplication1Dlg::OnLButtonDown( UINT nFlags , CPoint point )
{
PostMessage( WM_NCLBUTTONDOWN , HTCAPTION , MAKELPARAM( point.x , point.y ) );
CDialogEx::OnLButtonDown( nFlags , point );
}

方法2

  • 使用movewindow函数移动窗口, 下面的示意图以为了得到窗口相对屏幕的起点坐标

原理

画了一个示意图

代码

保存offset

CMFCApplication1Dlg 类中定义了以下变量, 保存offset

	int x_offset = 0;
int y_offset = 0;

添加OnLButton函数

void CMFCApplication1Dlg::OnLButtonDown( UINT nFlags , CPoint point )
{
SetCapture();
CRect rW;
GetWindowRect( rW ); /// 得到屏幕坐标
CPoint ptW = point;
ClientToScreen( &ptW ); /// -----------------------------------------------------------------
/// 保存offset x_offset = ptW.x - rW.left;
y_offset = ptW.y - rW.top;
CDialogEx::OnLButtonDown( nFlags , point );
}

添加OnMouseMove函数

void CMFCApplication1Dlg::OnMouseMove( UINT nFlags , CPoint point )
{
if ((nFlags & MK_LBUTTON) && this == GetCapture())
{
CPoint ptW = point;
ClientToScreen( &ptW ); ptW.x -= x_offset;
ptW.y -= y_offset; CRect rW;
GetWindowRect( rW );
//TRACE("\n\nxxx=%d, yyy=%d", rW.left, rW.top); /// 得到屏幕分辨率
int nWidth = GetSystemMetrics( SM_CXSCREEN );
int nHeight = GetSystemMetrics( SM_CYSCREEN ); /// 得到当前窗口的绝对坐标系的起点坐标
int cur_xxx = ptW.x + rW.Width();
int cur_yyy = ptW.y + rW.Height(); /// 保证 X在屏幕中间
if ((1 >= ptW.x) || (cur_xxx >= nWidth))
{
if (1 >= ptW.x)
ptW.x = 1;
else
ptW.x = nWidth - rW.Width();
} /// 保证Y在屏幕中间
if ((1 >= ptW.y) ||(cur_yyy >= nHeight) )
{
if (1 >= ptW.y)
ptW.y = 1;
else
ptW.y = nHeight - rW.Height(); } /// 移动窗口到指定位置
MoveWindow(ptW.x, ptW.y, rW.Width(), rW.Height());
} CDialogEx::OnMouseMove( nFlags , point );
}

OnLButtonUp函数

void CMFCApplication1Dlg::OnLButtonUp( UINT nFlags , CPoint point )
{ ReleaseCapture(); CDialogEx::OnLButtonUp( nFlags , point );
}

MFC之实现无边窗口移动的更多相关文章

  1. MFC应用程序创建窗口的过程 good

    MFC应用程序中处理消息的顺序 1.AfxWndProc()      该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc 2.AfxCallWndProc()  该 ...

  2. MFC中的主窗口修改标题

    MFC中的主窗口修改标题 如何去掉“无标题”1.在主程序中的InitInstance(): m_pMainWnd->SetWindowText("你要显示的东西如果不想显示置空就行&q ...

  3. qt5之设置无边窗口移动

    Note qt version: 5.12 qt creator: 4.13 本文将介绍 设置无边窗口和设置窗口的移动 你要知道: QDialog 和 QMainWindow都是 QWidget的派生 ...

  4. MFC自绘框架窗口客户区

    利用MFC开发用户界面往往需要需要根据要求进行界面美化,界面的美化包括很多内容,比如说界面各功能模块空间布局,控件位置选择,各功能模块区域的字体.背景颜色选择.添加位图,标题栏.菜单栏.状态栏等的重绘 ...

  5. MFC框架下Opengl窗口闪屏问题解决方案

    转自https://blog.csdn.net/niusiqiang/article/details/43116153 虽然启用了双缓冲,但是仍然会出闪屏的情况,这是由于OpenGL自己有刷新背景的函 ...

  6. 在MFC中添加OpenGL窗口

    虽然MFC已经落伍好多年,而且用来做界面非常的不好用...但是我既不会C#也不会QT,又需要使用OpenGL,就只能将就用了...   一.首先介绍Windows图像程序设计中几个重要的概念:   G ...

  7. Windows MFC 两个OpenGL窗口显示与线程RC问题

    问题为:背景界面是一个OpenGL窗口(对话框),在其上弹出一个OpenGL窗口(模态对话框)时, 1.上方的OpenGL窗口能响应鼠标操作等并刷新: 2.当移动或放大缩小上方的OpenGL窗口时,其 ...

  8. MFC中无边框窗口的拖动

      void CXXXXDialog::OnLButtonDown(UINT nFlags, CPoint point) { PostMessage(WM_NCLBUTTONDOWN, HTCAPTI ...

  9. MFC无闪烁隐藏窗口

    今天需要用到将窗口的程序隐藏,但是如果在OnInitDialog()中,直接写: ShowWindow(SW_HIDE); 是无效的,因为这本身就是个初始化窗口函数.也就是说,窗口在并没有显示出来的时 ...

随机推荐

  1. map与unordered_map区别及使用

    需要引入的头文件不同map: #include <map>unordered_map: #include <unordered_map> 内部实现机理不同map: map内部实 ...

  2. [Linux] 非root安装Lefse软件及其数据分析

    说明 Lefse软件是宏组学物种研究常用软件,一般大家用在线版本即可.但要搭建在Linux集群环境中有点烦,记录一下折腾过程. 安装 这个软件是python2写的,因此假设我已经安装好了较高版本的py ...

  3. PHP非对称加密-RSA

    对称加密算法是在加密和解密时使用同一个密钥.与对称加密算法不同,非对称加密算法需要两个密钥--公开密钥(public key)和私有密钥(private key)进行加密和解密.公钥和密钥是一对,如果 ...

  4. 码上来战!探索“智”感生活,HMS Core线上Codelabs挑战赛第4期开始!

    HMS Core线上Codelabs挑战赛第4期正式开始!我们向所有实践力超强.创新力满满的开发者发出邀请,用你的超级"码"力,解锁更多应用价值! 生活里,我们被手机"秒 ...

  5. 以VuePress的v1.x为基础开发-用户手册

    首先配置.vuepress中的config.js module.exports = { title:"用户手册", description: '用户手册', evergreen: ...

  6. TD课程通最终版本体验

    功能上,新版本增加了学校教室的上课情况,有无课程可以清楚查询,如下图: 在添加课程的设置上有改进,相比于之前编辑课程后不能保存,新版本在可保存的基础上又增加了登陆教务系统的功能,学生使用更加方便快捷, ...

  7. 02-爬取http://www.allitebooks.org/网站,获取图片url,书名,简介,作者

    import requests from lxml import etree from bs4 import BeautifulSoup import json class BookSpider(ob ...

  8. 【leetcode】1217. Minimum Cost to Move Chips to The Same Position

    We have n chips, where the position of the ith chip is position[i]. We need to move all the chips to ...

  9. java网站架构设计

    涉及到的技术及工具:java,springmvc,ibatis,freemarker,mysql,mongdb,memcached,ehcache,maven. 一个网站不可能说一开始就是要设计一个能 ...

  10. git删除了本地文件,从远程仓库中恢复

    在本地删除了文件,使用git pull,无法从远程项目中拉取下来 具体操作 查看项目的状态,会显示出你删除的数据 git status 进入被删除的文件的目录下,假设删除的文件名为 test.txt ...