MFC 实现对话框 圆角 示例代码
时间: 2023-08-19 12:03:56 浏览: 185
以下是一个简单的 MFC 对话框圆角示例代码:
首先,在对话框类的头文件中添加以下代码:
```cpp
class CCustomDialog : public CDialogEx
{
// ...
protected:
afx_msg void OnPaint();
afx_msg BOOL OnEraseBkgnd(CDC* pDC);
DECLARE_MESSAGE_MAP()
private:
int m_nRoundRadius;
};
```
然后,在对话框类的实现文件中添加以下代码:
```cpp
BEGIN_MESSAGE_MAP(CCustomDialog, CDialogEx)
// ...
ON_WM_PAINT()
ON_WM_ERASEBKGND()
END_MESSAGE_MAP()
CCustomDialog::CCustomDialog(CWnd* pParent /*=nullptr*/)
: CDialogEx(IDD_CUSTOM_DIALOG, pParent)
{
m_nRoundRadius = 20; // 设置圆角半径为 20
}
void CCustomDialog::OnPaint()
{
CPaintDC dc(this);
CRgn rgn;
CRect rect;
GetClientRect(&rect);
rgn.CreateRoundRectRgn(rect.left, rect.top, rect.right, rect.bottom, m_nRoundRadius, m_nRoundRadius);
dc.SelectClipRgn(&rgn);
dc.FillSolidRect(rect, GetSysColor(COLOR_BTNFACE));
CDialogEx::OnPaint();
}
BOOL CCustomDialog::OnEraseBkgnd(CDC* pDC)
{
return TRUE;
}
```
这里重写了 OnPaint() 和 OnEraseBkgnd() 方法。OnPaint() 方法用于绘制圆角矩形背景,并在最后调用父类的 OnPaint() 方法以绘制对话框的内容。OnEraseBkgnd() 方法返回 TRUE,以避免重绘背景。
最后,在 OnInitDialog() 方法中添加以下代码:
```cpp
BOOL CCustomDialog::OnInitDialog()
{
CDialogEx::OnInitDialog();
// 设置对话框的边框为对话框圆角
ModifyStyleEx(0, WS_EX_LAYERED);
SetLayeredWindowAttributes(0, 255, LWA_ALPHA);
SetWindowPos(nullptr, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED);
return TRUE;
}
```
这里使用了 SetLayeredWindowAttributes() 方法将对话框的透明度设置为 255,以使圆角部分可见。最后,使用 SetWindowPos() 方法更新对话框的大小和位置,以使新的边框效果生效。
这样,一个简单的 MFC 对话框圆角效果就实现了。需要注意的是,这种方法只能在 Windows Vista 或更高版本上使用。
阅读全文