MFC 无边框窗体实现用鼠标拖动窗体边缘实现窗体大小变化
时间: 2024-05-18 11:11:42 浏览: 15
可以通过以下步骤实现:
1. 在 MFC 应用程序中创建一个无边框窗体,可以通过在窗口类的 PreCreateWindow 函数中设置窗口样式来实现,例如:
```c++
BOOL CMyWnd::PreCreateWindow(CREATESTRUCT& cs)
{
if (!CWnd::PreCreateWindow(cs))
return FALSE;
cs.style &= ~WS_BORDER; // 去掉边框样式
cs.style |= WS_THICKFRAME; // 添加调整大小的样式
return TRUE;
}
```
2. 在窗体类中添加以下成员变量:
```c++
BOOL m_bDrag; // 标记是否正在拖动窗体边缘
CPoint m_ptOrigin; // 记录鼠标按下时的位置
```
3. 响应 WM_NCHITTEST 消息,判断鼠标位置是否在窗体边缘,并返回对应的鼠标样式:
```c++
UINT CMyWnd::OnNcHitTest(CPoint point)
{
UINT nHitTest = CWnd::OnNcHitTest(point);
if (nHitTest == HTCLIENT)
{
CRect rect;
GetWindowRect(&rect);
// 判断鼠标位置是否在窗体边缘
if (point.x < rect.left + 5)
nHitTest = HTLEFT;
else if (point.x > rect.right - 5)
nHitTest = HTRIGHT;
if (point.y < rect.top + 5)
nHitTest = HTTOP;
else if (point.y > rect.bottom - 5)
nHitTest = HTBOTTOM;
if (point.x < rect.left + 5 && point.y < rect.top + 5)
nHitTest = HTTOPLEFT;
else if (point.x < rect.left + 5 && point.y > rect.bottom - 5)
nHitTest = HTBOTTOMLEFT;
else if (point.x > rect.right - 5 && point.y < rect.top + 5)
nHitTest = HTTOPRIGHT;
else if (point.x > rect.right - 5 && point.y > rect.bottom - 5)
nHitTest = HTBOTTOMRIGHT;
}
return nHitTest;
}
```
4. 响应 WM_NCLBUTTONDOWN 消息,判断鼠标按下的位置是否在窗体边缘,如果是,则记录鼠标按下时的位置,并标记正在拖动边缘:
```c++
void CMyWnd::OnNcLButtonDown(UINT nHitTest, CPoint point)
{
if (nHitTest == HTLEFT || nHitTest == HTRIGHT || nHitTest == HTTOP ||
nHitTest == HTBOTTOM || nHitTest == HTTOPLEFT || nHitTest == HTTOPRIGHT ||
nHitTest == HTBOTTOMLEFT || nHitTest == HTBOTTOMRIGHT)
{
m_bDrag = TRUE;
m_ptOrigin = point;
SetCapture();
}
CWnd::OnNcLButtonDown(nHitTest, point);
}
```
5. 响应 WM_NCMOUSEMOVE 消息,如果正在拖动边缘,则根据鼠标移动的距离调整窗体大小:
```c++
void CMyWnd::OnNcMouseMove(UINT nHitTest, CPoint point)
{
if (m_bDrag)
{
CRect rect;
GetWindowRect(&rect);
int dx = point.x - m_ptOrigin.x;
int dy = point.y - m_ptOrigin.y;
switch (nHitTest)
{
case HTLEFT:
rect.left += dx;
break;
case HTRIGHT:
rect.right += dx;
break;
case HTTOP:
rect.top += dy;
break;
case HTBOTTOM:
rect.bottom += dy;
break;
case HTTOPLEFT:
rect.left += dx;
rect.top += dy;
break;
case HTTOPRIGHT:
rect.right += dx;
rect.top += dy;
break;
case HTBOTTOMLEFT:
rect.left += dx;
rect.bottom += dy;
break;
case HTBOTTOMRIGHT:
rect.right += dx;
rect.bottom += dy;
break;
}
MoveWindow(&rect);
}
CWnd::OnNcMouseMove(nHitTest, point);
}
```
6. 响应 WM_NCLBUTTONUP 消息,结束拖动边缘:
```c++
void CMyWnd::OnNcLButtonUp(UINT nHitTest, CPoint point)
{
if (m_bDrag)
{
m_bDrag = FALSE;
ReleaseCapture();
}
CWnd::OnNcLButtonUp(nHitTest, point);
}
```
以上就是实现用鼠标拖动窗体边缘实现窗体大小变化的步骤。
相关推荐
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)