CMyButton, DrawItem(..) 我们如何在 CButton 派生类中让 BaseClass 首先绘制

问题描述 投票:0回答:1

我有设置了

BS_OWNERDRAW
样式的按钮。
我不想重新发明整个轮子来绘制按钮,只添加一个简单的方面。 我已经对此进行了测试,但是 BaseClass
CButton::DrawItem(lpDrawItemStruct)
在这里没有任何绘制。里面是空的。
我是不是漏掉了什么?

void CMyButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
    // Call the base class to draw the standard button appearance
    ModifyStyle(BS_OWNERDRAW, 0);       // remove BS_OWNERDRAW style
    CButton::DrawItem(lpDrawItemStruct);
    ModifyStyle(0, BS_OWNERDRAW);       // add BS_OWNERDRAW style back

    // Draw now my stuff
    :
}
c++ windows mfc
1个回答
0
投票

你是对的,通过所有者绘制控件,你感觉像是重新发明轮子,这是因为微软没有提供一些

DoStandardDrawing()
功能(允许在调用之前和之后进行自定义),所以你必须这样做一切都是你自己。更糟糕的是,没有任何官方文档说明所有者绘制控件应该执行什么绘制操作才能实现标准外观(开发人员可以修改该外观以实现某些自定义)。只有一些例子,或者像 codeproject 这样的网站上的教程可以追溯到 2000 年代初期(所以你会得到一个漂亮的 Win2K 外观!)。

此外,我发现自己绘制所有内容非常费力,因为您必须考虑所有按钮状态组合(已选择、已选择、按下、悬停等)才能首先实现标准外观和行为(然后看看如何修改它)。

但是由于您的应用程序使用 MFC 库,因此您可以从 CMFCButton 派生类。它提供了许多自定义选项,如数据成员和受保护的(但虚拟的,因此可重写的)函数成员。您可以在 afxbutton.cpp 中看到它们的默认实现(并添加或删除内容或完全修改它)。如果您想要的自定义可以通过修改数据成员或仅调用公共函数来实现(在 VS 的属性编辑器中,或在

OnInitDialog()
中),那么您可能需要定义一个新类。最好在旁边放置一个标准按钮(用于测试),以比较它们的外观和行为。

© www.soinside.com 2019 - 2024. All rights reserved.