按钮OWERDRAW
时间: 2023-08-30 17:06:47 浏览: 37
按钮的OWNERDRAW(自绘)风格是指按钮的外观完全由应用程序自行绘制,而不是使用系统默认的按钮外观。这种风格可以让应用程序自由地控制按钮的样式、颜色、字体等,实现定制化的按钮。
在MFC中,可以通过设置按钮风格为 BS_OWNERDRAW,来启用自绘模式。一旦按钮被设置为 OWNERDRAW 风格,它就会发送 WM_DRAWITEM 消息给父窗口,用于绘制按钮。
在处理 WM_DRAWITEM 消息时,程序可以使用 CDC 对象绘制按钮的各个部分,包括边框、背景、文本和图标等。具体来说,可以使用 CDC 的 DrawFrameControl() 函数绘制按钮边框,使用 DrawText() 函数绘制文本,使用 DrawIcon() 函数绘制图标等。
以下是一个简单的示例,演示了如何绘制一个 OWNERDRAW 风格的按钮:
```cpp
void CMyDialog::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
if (nIDCtl == IDC_MYBUTTON)
{
CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
CRect rect = lpDrawItemStruct->rcItem;
UINT state = lpDrawItemStruct->itemState;
// 绘制背景
if (state & ODS_SELECTED)
{
pDC->FillSolidRect(rect, RGB(255, 0, 0)); // 按钮按下的颜色
}
else
{
pDC->FillSolidRect(rect, RGB(0, 255, 0)); // 按钮普通状态的颜色
}
// 绘制文本
CString strText;
GetDlgItemText(IDC_MYBUTTON, strText);
pDC->DrawText(strText, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
// 绘制边框
if (state & ODS_SELECTED)
{
pDC->DrawEdge(&rect, EDGE_SUNKEN, BF_RECT);
}
else
{
pDC->DrawEdge(&rect, EDGE_RAISED, BF_RECT);
}
}
}
```
这段代码实现了一个简单的 OWNERDRAW 风格按钮,当按钮被按下时,按钮会变成红色,否则为绿色。在绘制过程中,使用了 CDC 对象的 FillSolidRect() 函数来绘制背景,DrawText() 函数来绘制文本,DrawEdge() 函数来绘制边框。