说明

  • 演示环境: 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. linux中conda升级R到4.0?

    目录 前言 问题 曲线救国 前言 虽然我的win版本R已经用4了,但之前在Linux环境一直没用R4.0,因为Linux涉及的东西太多,担心不稳定,牵一发而动全身. 但现在有好些R包必须要用更新到R4 ...

  2. 【讲座】朱正江——基于LC-MS的非靶向代谢组学

    本次课程主题为<基于LC-MS的非靶向代谢组学>,主要分为代谢组学简介.代谢组学技术简介.非靶向代谢组学方法和数据采集.非靶向代谢组学数据分析和代谢物结构鉴定几个方面. 一.代谢组简介 基 ...

  3. ubuntu终端颜色快速配置

    ubuntu终端颜色快速配置 根据以下step步骤设置即可 step1:备份:cp ~/.bashrc ~/.bashrc.backup step2:打开文件:vim ~/.bashrc step3: ...

  4. 字符scanf 的输入注意

    1.注意scanf 不能有空格,如果有空格会将空格给输入进去 scanf("d "):---有空格 和scanf("d");--没有空格 有很大的区别

  5. WebRTC网页打开摄像头并录制视频

    前面我们能打开本地摄像头,并且在网页上看到摄像头的预览图像. 本文我们使用MediaRecorder来录制视频.在网页上播放录制好的视频,并能提供下载功能. html 首先创建一个html界面,放上一 ...

  6. python第三天 列表和元组

    枚举 for in enumerate 循环输出字符串的内容并且输出它的索引信息: #判断索引为5的字符串是不是"您" is in Python提供了⼤量的内置数据结构,包含了列表 ...

  7. 半天做完的数据报表,YonBuilder只要十几分钟,0代码开发

    进入数字化时代,拍脑袋的决策方式显然不靠谱,一切要靠数据说话.与信息化时代相比,数字化时代的企业对数据的应用更广泛.更深入.为了应对激烈的市场竞争,企业经营决策者们对数据的依赖度越来越高,企业各个业务 ...

  8. Vue 前端配置多级目录实践(基于Nginx配置方式)

    前情提要 有阵子没更新博客了,因为快年结了工作比较多,这不,最近公司的对外演示环境出现问题这个活儿也落到了我的头上-- 事情是这样的,原来演示环境有很多服务,每个服务都是对外单独开一个端口,比如 ht ...

  9. ios加载html5 audio标签用js无法自动播放

    html5 audio标签在ios 微信浏览器中是无法自动播放的,最近在做一个小的项目遇到这个问题,安卓和pc都是正常的,唯独ios不行,查阅了很多资料,找到了以下方法,也许不是最好用的方法,如果有更 ...

  10. 一起手写吧!promise.all

    Promise.all 接收一个 promise 对象的数组作为参数,当这个数组里的所有 promise 对象全部变为resolve或 有 reject 状态出现的时候,它才会去调用 .then 方法 ...