相同是项目遇到的问题,要求是无边框的对话框要实现鼠标的拖动改变大小。无边框对话框跟有边框的实现肯定不一样喽。

我上网搜到一种方法是:


须要处理下面这三个消息:
WM_NCHITTEST  WM_SETCURSOR  WM_NCLBUTTONDOWN 
消息处理函数:
UINT CXXXDlg::OnNcHitTest(UINT nHitTest, CPoint point)
{CRect rect;GetWindowRect(&rect);if(point.x <= rect.left+3)return HTLEFT;else if(point.x >= rect.right-3)return HTRIGHT;else if(point.y <= rect.top+3)return HTTOP;else if(point.y >= rect.bottom-3)return HTBOTTOM;else if(point.x <= rect.left+10 && point.y <= rect.top+10)return HTTOPLEFT;else if(point.x >= rect.right-10 && point.y <= rect.top+10)return HTTOPRIGHT;else if(point.x <= rect.left+10 && point.y >= rect.bottom-10)return HTBOTTOMLEFT;else if(point.x >= rect.right-10 && point.y >= rect.bottom-10)return HTBOTTOMRIGHT;return 0;
}BOOL CXXXDlg::OnSetCursor(HWND hWnd, UINT nHitTest, UINT message)
{if(nHitTest == HTCAPTION || nHitTest == HTSYSMENU ||nHitTest == HTMENU || nHitTest == HTCLIENT){SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)));}else if(nHitTest == HTTOP || nHitTest == HTBOTTOM){SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZENS)));}else if(nHitTest == HTLEFT || nHitTest == HTRIGHT){SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZEWE)));}else if(nHitTest == HTTOPLEFT || nHitTest == HTBOTTOMRIGHT){SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZENWSE)));}else if(nHitTest == HTTOPRIGHT || nHitTest == HTBOTTOMLEFT){SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZENESW)));}else{SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_ARROW)));}
}void CXXXDlg::OnNcLButtonDown(UINT nHitTest, CPoint point)
{if(nHitTest == HTTOP)SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_TOP, MAKELPARAM(point.x, point.y));else if(nHitTest == HTBOTTOM)SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_BOTTOM, MAKELPARAM(point.x, point.y));else if(nHitTest == HTLEFT)SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_LEFT, MAKELPARAM(point.x, point.y));else if(nHitTest == HTRIGHT)SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_RIGHT, MAKELPARAM(point.x, point.y));else if(nHitTest == HTTOPLEFT)SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_TOPLEFT, MAKELPARAM(point.x, point.y));else if(nHitTest == HTTOPRIGHT)SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_TOPRIGHT, MAKELPARAM(point.x, point.y));else if(nHitTest == HTBOTTOMLEFT)SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_BOTTOMLEFT, MAKELPARAM(point.x, point.y));else if(nHitTest == HTBOTTOMRIGHT)SendMessage(WM_SYSCOMMAND, SC_SIZE | WMSZ_BOTTOMRIGHT, MAKELPARAM(point.x, point.y));
}


上面的做法有点问题,像在推断时, 左右,上下先推断了。那左上,左下,右上,右下就没法做了。
全部就有了改进的方法:
UINT CTestDlg::OnNcHitTest( CPoint point )
{
CPoint ptCur;
CRect rect;
GetCursorPos( &ptCur );
GetWindowRect( &rect );if( CRect(rect.left, rect.top, rect.left+3, rect.top+3).PtInRect( ptCur ) )
return HTTOPLEFT;
else if( CRect(rect.right-3, rect.top, rect.right, rect.top+3).PtInRect( ptCur ) )
return HTTOPRIGHT;
else if( CRect(rect.left, rect.bottom-3, rect.left+3, rect.bottom).PtInRect( ptCur ) )
return HTBOTTOMLEFT;
else if( CRect(rect.right-3, rect.bottom-3, rect.right, rect.bottom).PtInRect( ptCur ) )
return HTBOTTOMRIGHT;
else if ( CRect(rect.left, rect.top, rect.left+3, rect.bottom).PtInRect( ptCur ) )
return HTLEFT;
else if( CRect(rect.right-3, rect.top, rect.right, rect.bottom).PtInRect( ptCur ) )
return HTRIGHT;
else if( CRect(rect.left, rect.top, rect.right-128, rect.top+3).PtInRect( ptCur ) ) // 128 Min,Max,Close
return HTTOP;
else if( CRect(rect.left, rect.bottom-3, rect.right, rect.bottom).PtInRect( ptCur ) )
return HTBOTTOM;return CDialog::OnNcHitTest(point);
}BOOL CTestDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message)
{
CPoint ptCur;
CRect rect;
GetCursorPos( &ptCur );
GetWindowRect( &rect );if ( rect.Width() >= m_nCxFullScreen-3 && rect.Height() >= m_nCyFullScreen-3 )
return CDialog::OnSetCursor(pWnd, nHitTest, message);if( CRect(rect.left, rect.top, rect.left+3, rect.top+3).PtInRect( ptCur ) || CRect(rect.right-3, rect.bottom-3, rect.right, rect.bottom).PtInRect( ptCur ) )
{
SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZENWSE)));
return 0;
}
else if( CRect(rect.left, rect.bottom-3, rect.left+3, rect.bottom).PtInRect( ptCur ) || CRect(rect.left, rect.bottom-3, rect.left+3, rect.bottom).PtInRect( ptCur ) )
{
SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZENESW)));
return 0;
}
else if( CRect(rect.left, rect.top, rect.right-128, rect.top+3).PtInRect( ptCur ) || CRect(rect.left, rect.bottom-3, rect.right, rect.bottom).PtInRect( ptCur ) )
{
SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZENS)));
return 0;
}
else if( CRect(rect.left, rect.top, rect.left+3, rect.bottom).PtInRect( ptCur ) || CRect(rect.right-3, rect.top, rect.right, rect.bottom).PtInRect( ptCur ) )
{
SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZEWE)));
return 0;
}return CDialog::OnSetCursor(pWnd, nHitTest, message);
}void CTestDlg::OnNcLButtonDown(UINT nHitTest, CPoint point)
{
switch( nHitTest )
{
case HTTOP:
SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_TOP, MAKELPARAM(point.x, point.y));
return;
case HTBOTTOM:
SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_BOTTOM, MAKELPARAM(point.x, point.y));
return;
case HTLEFT:
SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_LEFT, MAKELPARAM(point.x, point.y));
return;
case HTRIGHT:
SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_RIGHT, MAKELPARAM(point.x, point.y));
return;
case HTTOPLEFT:
SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_TOPLEFT, MAKELPARAM(point.x, point.y));
return;
case HTTOPRIGHT:
SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_TOPRIGHT, MAKELPARAM(point.x, point.y));
return;
case HTBOTTOMLEFT:
SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_BOTTOMLEFT, MAKELPARAM(point.x, point.y));
return;
case HTBOTTOMRIGHT:
SendMessage( WM_SYSCOMMAND, SC_SIZE | WMSZ_BOTTOMRIGHT, MAKELPARAM(point.x, point.y));
return;
default:
CDialog::OnNcLButtonDown( nHitTest, point );
}

无边框对话框拖动改变大小的实现总结相关推荐

  1. 无边框对话框改变大小

    [转载]无边框对话框改变大小2008-07-11 07:13 P.M.实现效果需要处理以下这三个消息: WM_NCHITTEST WM_SETCURSOR WM_NCLBUTTONDOWN 消息处理函 ...

  2. php 页面拖动改变大小,鼠标拖动改变DIV等网页元素的大小的实现方法

    1.初次实现 1.1 html代码 div change width by drag div change width by drag 1.2 js代码 var eleLeft = $('#myDiv ...

  3. WinForm 无边框窗体 拖动工作区移动窗体

    方案1 : 通过重载消息处理实现.重写窗口过程(WndProc),处理一些非客户区消息(WM_NCxxxx),C#中重写窗口过程不用再调用SetWindowLong API了,直接overide一个W ...

  4. MFC无边框对话框实现拖动

    解决无标题栏窗口的拖动问题有两种方案,一种方案是使用常规思路来处理鼠标拖拽事件,当窗口获得WM_LBUTTONDOWN(OnLButtonDown)时,通过设置标志并调用CWnd::SetCaptur ...

  5. qgraphicsview 添加矩形框并拖动改变大小_如何用手机巧影软件为视频添加字幕

    欢迎大家观看七夜视频工作室教程,我是七夜. 我们这次要讲的内容是如何用手机巧影软件为视频添加字幕,本次教程为图文教程非常简单! 我们的教程需要用到的软件是 巧影,很强大的视频剪辑软件,以后所有教程都会 ...

  6. QT无边框窗体改变大小 很顺畅

    近期,做项目用到无边框窗体,令人蛋疼的是无边框窗体大小的改变要像右边框那样,上下左右四周,而且要流畅. 网上也找了些代码,发现居然还要连接到windows事件,这显然不合常理,后来自己新建了demo, ...

  7. 基于Android T代码分析: 在freeform窗口的标题栏拖动时移动窗口流程和拖动freeform窗口边沿改变大小流程

    基于Android T代码分析: 在freeform窗口的标题栏拖动时移动窗口流程和拖动freeform窗口边沿改变大小流程在线看Android源代码网址: http://aospxref.com/a ...

  8. c#中WinForm中拖拽窗体实现移动功能(无边框模态窗体)

    在WindowsForm 应用程序中,如果将窗体的FormBorderStyle属性设置为none,这时,用鼠标拖拽窗体时就无法实现移动的功能了,下面就是解决方案. 在FormBordeStyle属性 ...

  9. 【最终版】PyQt5 自定义标题栏,实现无边框,最小化最大化关闭事件,窗口拖动移动,窗口改变大小,仿百度网盘色调美化,添加内容窗口

    [最终版]PyQt5 自定义标题栏,实现无边框,最小化最大化关闭事件,窗口拖动移动,窗口改变大小,仿百度网盘色调美化,添加内容窗口 文章目录 [最终版]PyQt5 自定义标题栏,实现无边框,最小化最大 ...

最新文章

  1. 『TensorFlow』数据读取类_data.Dataset
  2. Yann LeCun推荐!自监督学习、全景FPN...内容平台的四大技术指南
  3. Git commit message和工作流规范
  4. linux命名管道 c版本 python版本
  5. 冲上热搜!快手宣布取消大小周
  6. 10-200-022-使用-概念-并行度Parallelism
  7. Spring_对缓存的支持
  8. python 异步定时任务
  9. 飘动图片广告html代码,基于JavaScript代码实现随机漂浮图片广告
  10. 联想电脑重装系统F12开机项选择无USB启动选项
  11. 动环监控设备维护与故障处理,动环监控系统调试
  12. saas系统项目总结
  13. Python私有属性与私有方法
  14. 各种光流算法介绍和原理
  15. 安卓小游戏:飞机大战
  16. 当我们聊策略的时候,我们在聊什么?策略 Strategy。
  17. 深度学习研究基因组学
  18. 微信小程序:使用canvas 生成图片 并分享
  19. 大数据时代,为什么很多JAVA程序员会转型做JAVA大数据
  20. 鼠标移动到图片上实现图片的放大缩小

热门文章

  1. python qq聊天机器人_Python QQBot库的QQ聊天机器人
  2. python函数调用的例子_Python案例|混用C函数
  3. java常用类的特征_Java常用类-包装类
  4. 后端根据百度地图真实路径距离_做地图功能的设计,有哪些容易被我们忽略的思考?...
  5. 水凝胶 静电纺丝_【再生医学前沿】Nature子刊:静电纺丝玩出新花样!静电射流偏转的超快3D打印亚微米结构...
  6. python读取行政区txt文件实现行政区树_数据库的点数据根据行政区shp来进行行政区处理,python定时器实现...
  7. 阿里实人认证android,Android客户端接入
  8. flutter html 加载_Flutter开发:项目加载本地html文件的步骤
  9. python判断线程结束_判断Threading.start新线程是否执行完毕的实例
  10. 大数据只做三件事,对用户的理解、对信息的理解、对关系的理解