[MFC] 无边框窗口的Resize拖动效果的实现(上)
2017-03-30 14:24
411 查看
众所周知:当窗口是Resizing类型时 会自带resize效果(鼠标悬停在窗口边缘时 会有resize光标 点击拖动可以修改窗口的宽高)
但是 实际的窗口程序因为考虑到界面美化 通常需要去掉自带的border 这样窗口就没有自带的resize功能了
针对这类窗口 如何实现resize效果?实现这几个消息的响应函数即可:
WM_NCHITTEST
WM_SETCURSOR
WM_NCLBUTTONDOWN
代码如下:
demo下载(VS2013)
实际上这种方法 也有一个潜在的问题,我另一篇博文中会提出其不足,并给出另一种实现resize的方法,具体请参考这篇博文
但是 实际的窗口程序因为考虑到界面美化 通常需要去掉自带的border 这样窗口就没有自带的resize功能了
针对这类窗口 如何实现resize效果?实现这几个消息的响应函数即可:
WM_NCHITTEST
WM_SETCURSOR
WM_NCLBUTTONDOWN
代码如下:
#define RESIZE_REGION_SIZE 5 LRESULT CMyDlg::OnNcHitTest(CPoint pt) { RECT rcWindow; ::GetWindowRect(m_hWnd, &rcWindow); // 最好将四个角的判断放在前面 if (pt.x <= rcWindow.left + RESIZE_REGION_SIZE && pt.y <= rcWindow.top + RESIZE_REGION_SIZE) return HTTOPLEFT; else if (pt.x >= rcWindow.right - RESIZE_REGION_SIZE && pt.y <= rcWindow.top + RESIZE_REGION_SIZE) return HTTOPRIGHT; else if (pt.x <= rcWindow.left + RESIZE_REGION_SIZE && pt.y >= rcWindow.bottom - RESIZE_REGION_SIZE) return HTBOTTOMLEFT; else if (pt.x >= rcWindow.right - RESIZE_REGION_SIZE && pt.y >= rcWindow.bottom - RESIZE_REGION_SIZE) return HTBOTTOMRIGHT; else if (pt.x <= rcWindow.left + RESIZE_REGION_SIZE) return HTLEFT; else if (pt.x >= rcWindow.right - RESIZE_REGION_SIZE) return HTRIGHT; else if (pt.y <= rcWindow.top + RESIZE_REGION_SIZE) return HTTOP; else if (pt.y >= rcWindow.bottom - RESIZE_REGION_SIZE) return HTBOTTOM; return HTCAPTION; // 为了实现“鼠标按下客户区时也能移动主窗口” //return __super::OnNcHitTest(pt); } BOOL CMyDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) { switch (nHitTest) { case HTTOP: case HTBOTTOM: SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZENS))); return TRUE; case HTLEFT: case HTRIGHT: SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZEWE))); return TRUE; case HTTOPLEFT: case HTBOTTOMRIGHT: SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZENWSE))); return TRUE; case HTTOPRIGHT: case HTBOTTOMLEFT: SetCursor(LoadCursor(NULL, MAKEINTRESOURCE(IDC_SIZENESW))); return TRUE; default: return __super::OnSetCursor(pWnd, nHitTest, message); } } void CMyDlg::OnNcLButtonDown(UINT nHitTest, CPoint point) { switch (nHitTest) { case HTTOP: SendMessage(WM_SYSCOMMAND, SC_SIZE | WMSZ_TOP, MAKELPARAM(point.x, point.y)); break; case HTBOTTOM: SendMessage(WM_SYSCOMMAND, SC_SIZE | WMSZ_BOTTOM, MAKELPARAM(point.x, point.y)); break; case HTLEFT: SendMessage(WM_SYSCOMMAND, SC_SIZE | WMSZ_LEFT, MAKELPARAM(point.x, point.y)); break; case HTRIGHT: SendMessage(WM_SYSCOMMAND, SC_SIZE | WMSZ_RIGHT, MAKELPARAM(point.x, point.y)); break; case HTTOPLEFT: SendMessage(WM_SYSCOMMAND, SC_SIZE | WMSZ_TOPLEFT, MAKELPARAM(point.x, point.y)); break; case HTTOPRIGHT: SendMessage(WM_SYSCOMMAND, SC_SIZE | WMSZ_TOPRIGHT, MAKELPARAM(point.x, point.y)); break; case HTBOTTOMLEFT: SendMessage(WM_SYSCOMMAND, SC_SIZE | WMSZ_BOTTOMLEFT, MAKELPARAM(point.x, point.y)); break; case HTBOTTOMRIGHT: SendMessage(WM_SYSCOMMAND, SC_SIZE | WMSZ_BOTTOMRIGHT, MAKELPARAM(point.x, point.y)); break; default: __super::OnNcLButtonDown(nHitTest, point); } }
demo下载(VS2013)
实际上这种方法 也有一个潜在的问题,我另一篇博文中会提出其不足,并给出另一种实现resize的方法,具体请参考这篇博文
相关文章推荐
- [MFC] 无边框窗口的Resize拖动效果的实现(下):子窗口覆盖,导致主窗口热点区无法响应WM_NCHITTEST
- C# 实现窗口无边框,可拖动效果
- mfc如何快速实现无边框窗口阴影效果
- MFC实现父窗口不透明,子窗口半透明效果
- MFC 中实现窗口淡入淡出、逐步放大显示效果
- 【转】MFC 无边框窗口的拖动
- (转)无边框窗口实现拖垃效果
- 无边框窗口实现拖垃效果
- vc++ mfc中拖动效果的实现
- java中 实现无标题无边框的窗体能够用鼠标拖动改变窗口大小
- 无边框窗口实现拖拉效果
- 无边框窗口实现拖拉效果
- 无边框窗口实现拖垃效果
- MFC 中实现在客户区拖动来拖动窗口的方法总结
- 可拖动拉伸的左右分栏效果,本例子是用Table以及JS来实现的,左右分栏可改变,拖动中间的边框就可实现宽度的调整,点击时可设置为隐藏左侧列表。
- MFC无边框的窗体实现用鼠标拖动窗体边缘实现窗体大小变化
- 【转】MFC中无边框窗口的拖动
- 无边框窗口实现拖垃效果
- node-webkit无边框窗口用纯JS实现拖动改变大小
- MFC 无边框窗体实现用鼠标拖动窗体边缘实现窗体大小变化