我想设置Edit背景色?

时间:2021-04-19 14:47:51
我通过继承CEdit类,改写了
HBRUSH CEditPlus::CtlColor(CDC* pDC, UINT nCtlColor)  

{

    pDC->SetBkColor(color);

return CreateSolidBrush(color);
}
注:color 已经通过别一函数来设值。
有如下几个小问题或疑问:1.return CreateSolidBrush();这句会不会泄露内存资源
                        2.如果return NULL,那么整个函数操作就像没更改Edit框,不知道这个虚函数处于什么地位。换句话说,Edit框的背景在什么时候,通过发送ON_WM_CTLCOLOR_REFLECT消息来调用。
                        3:CEditPlus成员变量作为对话框的成员变量,当对话框构造时,其成员也构造,此时没有创建窗体。而在对话框的OnInitDialog()函数里,通过调用CEditPlus类型变量的成员函数,如SetWindowText等函数没有出错,说明些时窗体(m_hwnd)已经建立了,我想问的是CEditPlus窗体什么时候建立的。是在发送ON_WM_INITDIALOG之前?还是在发ON_WM_INIDIALOG消息之前还有其他什么消息?具体是什么消息使相应控件的变量获得窗体(create)
                         4.是不是当对话框建立起来时,其他什么控件的窗体也必须全部建立起来。

8 个解决方案

#1


补充:在ON_WM_INIDIALOG之前有ON_WM_CREATE消息,但通过调用对话框中控件的成员函数,会出现错误,说明此时还没有建立相应的窗体,那么在ON_WM_CREATE之后在ON_WM_INIDIALOG之前,是通过什么操作建立控件窗体的?是通过发送什么消息吗?如果真通过什么消息是谁发向谁来建立的(对话框发送给控件,还是控件获得什么消息,建好之后,再回传一个消息吗?)其次通过发送消息,是通过什么相应函数来创建的?(是create/createex )

#2


再补充:在处理ON_WM_CREATE消息此时对话框的窗体已经建立起来,而相应控件的窗体没有建立(m_hWnd).!
那到底各控件什么时候建立窗体的?

#3


return CreateSolidBrush();
改用return一个CBrush成员变量,该变量先初始化

#4


WM_CTLCOLOR
The framework calls this member function when a child control is about to be drawn. 

先创建父窗口,再创建子窗口,没有老子哪里来的儿子呢
The WM_INITDIALOG message is sent to the dialog box procedure immediately before a dialog box is displayed. Dialog box procedures typically use this message to initialize controls and carry out any other initialization tasks that affect the appearance of the dialog box. 

#5


引用 4 楼 visualeleven 的回复:
WM_CTLCOLOR
The framework calls this member function when a child control is about to be drawn. 

先创建父窗口,再创建子窗口,没有老子哪里来的儿子呢
The WM_INITDIALOG message is sent to the dialog box procedure immediate……
哥们你说的对,我跟踪了CTmp_8Dlg::OnInitDialog() --》CDialog::OnInitDialog()--》CWnd::ExecuteDlgInit(const char * 0x00000066)--》CWnd::ExecuteDlgInit(void * 0x00000000)--》CWnd::SendMessageToDescendants(HWND__ * 0x003413f4, unsigned int 868, unsigned int 0, long 0, int 0, int 0) 然后通过 for (HWND hWndChild = ::GetTopWindow(hWnd); hWndChild != NULL;
hWndChild = ::GetNextWindow(hWndChild, GW_HWNDNEXT))
循环执行::SendMessage(hWndChild, message, wParam, lParam);
        这时的message 是 通过CWnd::ExecuteDlgInit(void * 0x00000000)函数里 WM_INITIALUPDATE
        在wizard(CTRRL + W)里 所有的控件包括对话框,都没有可以进行WM_INITAIALUPDATE添加的进行的虚拟函数!我估计是对话框这样的程序是MFC不愿意思给我们修改!?!

#6


引用 3 楼 visualeleven 的回复:
return CreateSolidBrush();
改用return一个CBrush成员变量,该变量先初始化
这个问题,不管我的做法是不是正确,但你的肯定是合理的,让他的生命时间长一点。

#7


如果象这样:
class CComboBoxNew : public CComboBox

那这个组合框里的编缉框,它的背景色又怎么改变

#8


楼主这个,我有个例子,加我QQ给你

#1


补充:在ON_WM_INIDIALOG之前有ON_WM_CREATE消息,但通过调用对话框中控件的成员函数,会出现错误,说明此时还没有建立相应的窗体,那么在ON_WM_CREATE之后在ON_WM_INIDIALOG之前,是通过什么操作建立控件窗体的?是通过发送什么消息吗?如果真通过什么消息是谁发向谁来建立的(对话框发送给控件,还是控件获得什么消息,建好之后,再回传一个消息吗?)其次通过发送消息,是通过什么相应函数来创建的?(是create/createex )

#2


再补充:在处理ON_WM_CREATE消息此时对话框的窗体已经建立起来,而相应控件的窗体没有建立(m_hWnd).!
那到底各控件什么时候建立窗体的?

#3


return CreateSolidBrush();
改用return一个CBrush成员变量,该变量先初始化

#4


WM_CTLCOLOR
The framework calls this member function when a child control is about to be drawn. 

先创建父窗口,再创建子窗口,没有老子哪里来的儿子呢
The WM_INITDIALOG message is sent to the dialog box procedure immediately before a dialog box is displayed. Dialog box procedures typically use this message to initialize controls and carry out any other initialization tasks that affect the appearance of the dialog box. 

#5


引用 4 楼 visualeleven 的回复:
WM_CTLCOLOR
The framework calls this member function when a child control is about to be drawn. 

先创建父窗口,再创建子窗口,没有老子哪里来的儿子呢
The WM_INITDIALOG message is sent to the dialog box procedure immediate……
哥们你说的对,我跟踪了CTmp_8Dlg::OnInitDialog() --》CDialog::OnInitDialog()--》CWnd::ExecuteDlgInit(const char * 0x00000066)--》CWnd::ExecuteDlgInit(void * 0x00000000)--》CWnd::SendMessageToDescendants(HWND__ * 0x003413f4, unsigned int 868, unsigned int 0, long 0, int 0, int 0) 然后通过 for (HWND hWndChild = ::GetTopWindow(hWnd); hWndChild != NULL;
hWndChild = ::GetNextWindow(hWndChild, GW_HWNDNEXT))
循环执行::SendMessage(hWndChild, message, wParam, lParam);
        这时的message 是 通过CWnd::ExecuteDlgInit(void * 0x00000000)函数里 WM_INITIALUPDATE
        在wizard(CTRRL + W)里 所有的控件包括对话框,都没有可以进行WM_INITAIALUPDATE添加的进行的虚拟函数!我估计是对话框这样的程序是MFC不愿意思给我们修改!?!

#6


引用 3 楼 visualeleven 的回复:
return CreateSolidBrush();
改用return一个CBrush成员变量,该变量先初始化
这个问题,不管我的做法是不是正确,但你的肯定是合理的,让他的生命时间长一点。

#7


如果象这样:
class CComboBoxNew : public CComboBox

那这个组合框里的编缉框,它的背景色又怎么改变

#8


楼主这个,我有个例子,加我QQ给你