mfc如何在标题栏自绘关闭按钮
时间: 2023-07-27 15:02:15 浏览: 298
在MFC中,可以通过自定义绘制标题栏的方式来实现自绘关闭按钮。
首先,需要在窗口类的OnNcCreate函数中添加以下代码,以使窗口支持非客户区的绘制:
```cpp
LRESULT CMyWnd::OnNcCreate(LPCREATESTRUCT lpCreateStruct)
{
LRESULT lRes = CWnd::OnNcCreate(lpCreateStruct);
DWORD style = ::GetWindowLongPtr(m_hWnd, GWL_STYLE);
::SetWindowLongPtr(m_hWnd, GWL_STYLE, style | WS_THICKFRAME | WS_MAXIMIZEBOX | WS_MINIMIZEBOX | WS_SYSMENU | WS_CLIPCHILDREN);
DWORD exStyle = ::GetWindowLongPtr(m_hWnd, GWL_EXSTYLE);
::SetWindowLongPtr(m_hWnd, GWL_EXSTYLE, exStyle | WS_EX_CLIENTEDGE);
return lRes;
}
```
接下来,在窗口类的OnNcPaint函数中自绘标题栏。首先调用父类的OnNcPaint函数绘制默认的标题栏,然后自己绘制关闭按钮:
```cpp
void CMyWnd::OnNcPaint()
{
CWnd::OnNcPaint();
CWindowDC dc(this);
CRect rect;
GetClientRect(rect);
CRect titleRect;
GetWindowRect(titleRect);
titleRect.bottom = titleRect.top + rect.top;
ScreenToClient(titleRect);
// 自绘关闭按钮
CRect closeRect;
int btnSize = GetSystemMetrics(SM_CYSMICON);
closeRect.left = titleRect.right - btnSize - 5;
closeRect.top = titleRect.top + (rect.top - btnSize) / 2;
closeRect.right = closeRect.left + btnSize;
closeRect.bottom = closeRect.top + btnSize;
dc.DrawFrameControl(closeRect, DFC_CAPTION, DFCS_CAPTIONCLOSE | (GetActiveWindow() == this ? DFCS_PUSHED : 0));
}
```
以上代码中,计算了自绘关闭按钮的位置和大小,并调用DrawFrameControl函数来绘制关闭按钮,DFC_CAPTION表示绘制标题栏的按钮,DFCS_CAPTIONCLOSE表示绘制关闭按钮,DFCS_PUSHED表示按钮处于按下状态。
最后,在窗口类的OnNcLButtonDown函数中处理关闭按钮的点击事件:
```cpp
void CMyWnd::OnNcLButtonDown(UINT nHitTest, CPoint point)
{
if (nHitTest == HTCLOSE || nHitTest == HTCAPTION)
{
CRect rect;
GetClientRect(rect);
CRect titleRect;
GetWindowRect(titleRect);
titleRect.bottom = titleRect.top + rect.top;
ScreenToClient(titleRect);
int btnSize = GetSystemMetrics(SM_CYSMICON);
CRect closeRect(titleRect.right - btnSize - 5, titleRect.top + (rect.top - btnSize) / 2, titleRect.right - 5, titleRect.top + (rect.top + btnSize) / 2);
if (closeRect.PtInRect(point))
{
PostMessage(WM_SYSCOMMAND, SC_CLOSE);
return;
}
}
CWnd::OnNcLButtonDown(nHitTest, point);
}
```
以上代码中,根据鼠标点击位置判断是否点击了关闭按钮,如果是,则发送关闭消息给窗口。
通过以上步骤,就可以在MFC中实现自绘关闭按钮。
阅读全文