MFC之实现无边窗口移动
说明
- 演示环境: 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之实现无边窗口移动的更多相关文章
- MFC应用程序创建窗口的过程 good
MFC应用程序中处理消息的顺序 1.AfxWndProc() 该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc 2.AfxCallWndProc() 该 ...
- MFC中的主窗口修改标题
MFC中的主窗口修改标题 如何去掉“无标题”1.在主程序中的InitInstance(): m_pMainWnd->SetWindowText("你要显示的东西如果不想显示置空就行&q ...
- qt5之设置无边窗口移动
Note qt version: 5.12 qt creator: 4.13 本文将介绍 设置无边窗口和设置窗口的移动 你要知道: QDialog 和 QMainWindow都是 QWidget的派生 ...
- MFC自绘框架窗口客户区
利用MFC开发用户界面往往需要需要根据要求进行界面美化,界面的美化包括很多内容,比如说界面各功能模块空间布局,控件位置选择,各功能模块区域的字体.背景颜色选择.添加位图,标题栏.菜单栏.状态栏等的重绘 ...
- MFC框架下Opengl窗口闪屏问题解决方案
转自https://blog.csdn.net/niusiqiang/article/details/43116153 虽然启用了双缓冲,但是仍然会出闪屏的情况,这是由于OpenGL自己有刷新背景的函 ...
- 在MFC中添加OpenGL窗口
虽然MFC已经落伍好多年,而且用来做界面非常的不好用...但是我既不会C#也不会QT,又需要使用OpenGL,就只能将就用了... 一.首先介绍Windows图像程序设计中几个重要的概念: G ...
- Windows MFC 两个OpenGL窗口显示与线程RC问题
问题为:背景界面是一个OpenGL窗口(对话框),在其上弹出一个OpenGL窗口(模态对话框)时, 1.上方的OpenGL窗口能响应鼠标操作等并刷新: 2.当移动或放大缩小上方的OpenGL窗口时,其 ...
- MFC中无边框窗口的拖动
void CXXXXDialog::OnLButtonDown(UINT nFlags, CPoint point) { PostMessage(WM_NCLBUTTONDOWN, HTCAPTI ...
- MFC无闪烁隐藏窗口
今天需要用到将窗口的程序隐藏,但是如果在OnInitDialog()中,直接写: ShowWindow(SW_HIDE); 是无效的,因为这本身就是个初始化窗口函数.也就是说,窗口在并没有显示出来的时 ...
随机推荐
- map与unordered_map区别及使用
需要引入的头文件不同map: #include <map>unordered_map: #include <unordered_map> 内部实现机理不同map: map内部实 ...
- [Linux] 非root安装Lefse软件及其数据分析
说明 Lefse软件是宏组学物种研究常用软件,一般大家用在线版本即可.但要搭建在Linux集群环境中有点烦,记录一下折腾过程. 安装 这个软件是python2写的,因此假设我已经安装好了较高版本的py ...
- PHP非对称加密-RSA
对称加密算法是在加密和解密时使用同一个密钥.与对称加密算法不同,非对称加密算法需要两个密钥--公开密钥(public key)和私有密钥(private key)进行加密和解密.公钥和密钥是一对,如果 ...
- 码上来战!探索“智”感生活,HMS Core线上Codelabs挑战赛第4期开始!
HMS Core线上Codelabs挑战赛第4期正式开始!我们向所有实践力超强.创新力满满的开发者发出邀请,用你的超级"码"力,解锁更多应用价值! 生活里,我们被手机"秒 ...
- 以VuePress的v1.x为基础开发-用户手册
首先配置.vuepress中的config.js module.exports = { title:"用户手册", description: '用户手册', evergreen: ...
- TD课程通最终版本体验
功能上,新版本增加了学校教室的上课情况,有无课程可以清楚查询,如下图: 在添加课程的设置上有改进,相比于之前编辑课程后不能保存,新版本在可保存的基础上又增加了登陆教务系统的功能,学生使用更加方便快捷, ...
- 02-爬取http://www.allitebooks.org/网站,获取图片url,书名,简介,作者
import requests from lxml import etree from bs4 import BeautifulSoup import json class BookSpider(ob ...
- 【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 ...
- java网站架构设计
涉及到的技术及工具:java,springmvc,ibatis,freemarker,mysql,mongdb,memcached,ehcache,maven. 一个网站不可能说一开始就是要设计一个能 ...
- git删除了本地文件,从远程仓库中恢复
在本地删除了文件,使用git pull,无法从远程项目中拉取下来 具体操作 查看项目的状态,会显示出你删除的数据 git status 进入被删除的文件的目录下,假设删除的文件名为 test.txt ...