VC 自定义控件重绘:CButton的OwnerDraw实现

需积分: 9 6 下载量 142 浏览量 更新于2024-07-24 收藏 117KB DOC 举报
"VC 重绘CBUTTON" 在Microsoft Visual C++ (VC++) 的MFC环境中,开发人员经常需要自定义控件的外观以满足特定的界面设计需求。在标题提到的“VC 重绘CBUTTON”中,我们主要讨论的是如何自定义CButton控件的绘制,包括颜色、背景、字体和形状等方面。 首先,自画控件的基本步骤是创建一个以待重绘控件类(如CButton)为基类的派生类。例如,我们可以创建一个名为CMyButton的类,它继承自CButton: ```cpp class CMyButton : public CButton ``` 接着,我们需要在派生类中重载`DrawItem`虚函数。`DrawItem`是专门用于自定义控件绘制的函数,只有在控件具有"OwnerDraw"属性时才会被调用。如果派生类中没有`DrawItem`,也可以通过处理`WM_NCPAINT`消息来实现自绘。`DrawItem`函数允许我们完全控制控件的显示,比如改变背景色、文字颜色、边框样式等。 为了使控件具备“OwnerDraw”属性,我们通常会在派生类的`PreSubclassWindow`函数中设置。这是因为`PreSubclassWindow`在控件创建后、消息处理之前被调用,是设置控件属性的理想时机: ```cpp void CMyButton::PreSubclassWindow() { CButton::PreSubclassWindow(); ModifyStyle(0, BS_OWNERDRAW); // 设置按钮为自绘模式 } ``` 在`DrawItem`函数中,我们将实现自定义绘制逻辑。例如,我们可以控制按钮的背景、文本颜色和形状: ```cpp void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC); CRect rect = lpDrawItemStruct->rcItem; // 绘制背景 pDC->FillSolidRect(rect, RGB(255, 255, 255)); // 使用白色填充 // 设置文字颜色和字体 pDC->SetTextColor(RGB(0, 0, 0)); CFont font; font.CreatePointFont(12, _T("Arial")); pDC->SelectObject(&font); // 绘制按钮文本 pDC->TextOut(rect.left + 5, rect.top + 5, m_buttonText); // 绘制边框 pDC->DrawEdge(rect, EDGE_RAISED, BF_RECT); } ``` 除了`DrawItem`,还可以使用`OnNCPaint`函数来处理非客户区的绘制,例如窗口边框。子类化可以通过以下三种方式实现: 1. 使用`SubclassDlgItem`函数在对话框中子类化控件。 2. 在`CDialog`派生类的`OnInitDialog`中使用`SetWindowLong`和`GetWindowLong`函数来替换控件的窗口过程。 3. 直接在控件创建时使用`Create`函数,指定自定义窗口类。 自绘控件是提升应用程序界面视觉效果的重要手段,通过自定义绘制,我们可以创建出独特且符合应用风格的界面元素。在VC++中,MFC提供了一套完整的机制,使得这一过程变得相对简单和高效。