OnDrawItem重载
时间: 2023-09-10 14:07:56 浏览: 52
在MFC中,如果想要自定义绘制一个控件的外观,可以通过重载控件的OnDrawItem函数来实现。OnDrawItem函数是在WM_DRAWITEM消息处理程序中被调用的,它提供了一个CDC类对象,可以用它来绘制自己的控件。
下面是一个简单的示例代码:
首先在资源文件中将按钮的Style属性设置为OwnerDraw,然后在窗口类的头文件中添加下面的声明:
```c++
afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct);
```
然后在窗口类的实现文件中添加下面的函数定义:
```c++
void CMyDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
if (nIDCtl == IDC_MY_BUTTON) // IDC_MY_BUTTON是按钮的ID
{
CDC dc;
dc.Attach(lpDrawItemStruct->hDC);
// 绘制按钮的背景
if (lpDrawItemStruct->itemState & ODS_SELECTED)
dc.FillSolidRect(&lpDrawItemStruct->rcItem, RGB(255, 0, 0)); // 设置选中状态的背景颜色为红色
else if (lpDrawItemStruct->itemState & ODS_FOCUS)
dc.FillSolidRect(&lpDrawItemStruct->rcItem, RGB(0, 255, 0)); // 设置获取焦点状态的背景颜色为绿色
else
dc.FillSolidRect(&lpDrawItemStruct->rcItem, RGB(0, 0, 255)); // 设置普通状态的背景颜色为蓝色
// 绘制按钮的文本
CString strText;
GetDlgItemText(IDC_MY_BUTTON, strText); // 获取按钮的文本
CRect rect = lpDrawItemStruct->rcItem;
dc.SetTextColor(RGB(255, 255, 255)); // 设置文本颜色为白色
dc.DrawText(strText, &rect, DT_CENTER | DT_VCENTER | DT_SINGLELINE); // 居中绘制文本
dc.Detach();
}
}
```
在上面的代码中,我们首先判断当前消息所涉及的控件是否是我们要处理的按钮,然后根据按钮的状态设置对应的背景颜色,最后绘制文本。
需要注意的是,在使用CDC类对象绘制控件时,不要忘记在函数结束时调用Detach()函数,以释放关联的DC对象。