说明

  • 演示环境: 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. #10470. 「2020-10-02 提高模拟赛」流水线 (line)

    题面:#10470. 「2020-10-02 提高模拟赛」流水线 (line) 题目中的那么多区间的条件让人感觉极其难以维护,而且贪心的做法感觉大多都能 hack 掉,因此考虑寻找一些性质,然后再设计 ...

  2. Vue 中使用 extent 开发loading等全局 组件

    Vue 中使用 extend 开发组件 简介:再开发过程中那面会遇到自定义 loading alert 等全局组件,这里我们可以使用 vue 中的extend 来帮助我们完成 一个简单extend例子 ...

  3. pcm.x代码分析

    简介 运行说明 pcm 监控结果可以分为核心.socket 和系统三部分.在核心监控部分,结果包括如下内容: • EXEC • IPC:每 CPU 周期指令数 • FREQ:普通CPU频率系数 • A ...

  4. 解决install_github安装R包时无法打开(cannot open)URL?

    最近安装github上的R包,经常显示Error in utils::download.file(url, path, method = method, quiet = quiet, : 无法打开UR ...

  5. 【数据库】本地KEGG数据库如何拆分子库?

    目录 KEGG本地库文件 按物种拆分KEGG数据库 1.获得物种分类信息 2.获得物种分类的序列信息并建库 3.获得物种分类的K-ko对应文件 根据相似性原理,序列相似,功能相似,所有功能注释无非是用 ...

  6. 全基因组选择育种(GS)简介

    全基因组选择(Genomic selection, GS)是一种利用覆盖全基因组的高密度标记进行选择育种的新方法,可通过早期选择缩短世代间隔,提高育种值(Genomic Estimated Breed ...

  7. LightningChart JS v.3.3.0全新版本现已发布!

    LightningChart JS v.3.3.0已经发布啦!!! 欢迎了解更多关于最新的性能改进.新的用户界面功能和新的图表类型的信息! WebGL兼容性和新的UI功能 WebGL是Lightnin ...

  8. Spring Boot 热启动插件

    1. maven依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId ...

  9. 重学Git(一)

    一.最最最基础操作 # 初始化仓库 git init # 添加文件到暂存区 git add readme.md # 提交 git commit -m 'wrote a readme file' 二.简 ...

  10. 【leetcode】122.Best Time to Buy and Sell Stock II(股票问题)

    You are given an integer array prices where prices[i] is the price of a given stock on the ith day. ...