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

Change button color without declaring member variable

本文关键字:按钮 颜色 情况下 声明 成员 变量      更新时间:2023-10-16

我正在尝试使用类函数setcolor CColorbutton按钮着色。当我声明按钮的成员变量时,它工作正常,但是当我通过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进行硬转换,但这非常危险!为什么?您获得的窗口对象只是一个临时的 CWnd 对象,没有其他成员变量。如果调用 CColorButton 的特定成员函数(该函数使用其他数据成员),则可能会销毁内存/堆/堆栈内容。

使用 MFC 控件类,始终需要内存中某处的特定对象来温和地强制转换 GetDlgItem 返回的指针!

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

如果未声明并正确初始化 CColorButton 变量,则程序中没有 CColorButton 对象。所以你在召唤不存在的东西。你要求解决这个问题,但你已经知道解决方案了!