c++ - 在不声明成员变量的情况下更改按钮颜色

标签 c++ c mfc visual-c++

我正在尝试使用 CColorbutton 类函数 setcolor 为按钮着色。当我声明了按钮的成员变量时它工作正常但是当我直接通过 GetDlgItem(IDC_BUTTON1) 获取句柄时它不工作。谁能告诉我这个问题的解决方案?

CColorButton* pWnd = (CColorButton*)GetDlgItem(id+i); pWnd->SetColor(RGB(0,0,0),RGB(200, 153, 204));

最佳答案

首先:如果不为按钮控件声明变量,您将无法运行它!

为什么?窗口变量并使用 DDX-Control 或使用 CWNd::SubclassWindow 是在 MFC 中进行子类化的方式。如果没有子类化,则消息不会由 CCOlorButton 中使用的代码处理。

是的,您可以使用 GetDlgItem 和我对 CColorButton 进行硬转换,但这非常危险!为什么?你得到的 window 对象只是一个临时的 CWnd 对象,没有额外的成员变量。如果您调用 CColorButton 的特定成员函数,它使用额外的数据成员,您可能会破坏您的内存/堆/堆栈内容。

对于 MFC 控件类,您总是需要内存中某处的特定对象来优雅地转换 GetDlgItem 返回的指针!

如果您有成员函数,则不需要强制转换。如果(出于任何其他原因)您需要转换 CWnd 指针,明智的做法是在出现问题时使用 STATIC_DOWNCAST/DYNAMIC_DOWNCAST 获取 ASSERT。

关于c++ - 在不声明成员变量的情况下更改按钮颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19906251/

相关文章:

c++ - 为什么不使用 NULL autoPtr 终止程序?

c++ - 理解带有命名空间污染的 TOTW 153 示例

c++ - C++11 互斥量是在用户空间中实现的吗?

c - 我如何从C调用以self作为参数的lua函数?

c - c中for循环问题中的特殊字符读取

windows - MFC中如何获取子菜单?

c++ - 返回奇怪值的指针的引用

c++ - 调试字体链接

c++ - GDI绘制的MFC的CScrollView如何实现缩放

c - SNMPd : Cannot open/proc/bus/pci