{
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成员变量,该变量先初始化
改用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.
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
哥们你说的对,我跟踪了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不愿意思给我们修改!?!
hWndChild = ::GetNextWindow(hWndChild, GW_HWNDNEXT))
循环执行::SendMessage(hWndChild, message, wParam, lParam);
这时的message 是 通过CWnd::ExecuteDlgInit(void * 0x00000000)函数里 WM_INITIALUPDATE
在wizard(CTRRL + W)里 所有的控件包括对话框,都没有可以进行WM_INITAIALUPDATE添加的进行的虚拟函数!我估计是对话框这样的程序是MFC不愿意思给我们修改!?!
#6
这个问题,不管我的做法是不是正确,但你的肯定是合理的,让他的生命时间长一点。
#7
如果象这样:
class CComboBoxNew : public CComboBox
那这个组合框里的编缉框,它的背景色又怎么改变
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成员变量,该变量先初始化
改用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.
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
哥们你说的对,我跟踪了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不愿意思给我们修改!?!
hWndChild = ::GetNextWindow(hWndChild, GW_HWNDNEXT))
循环执行::SendMessage(hWndChild, message, wParam, lParam);
这时的message 是 通过CWnd::ExecuteDlgInit(void * 0x00000000)函数里 WM_INITIALUPDATE
在wizard(CTRRL + W)里 所有的控件包括对话框,都没有可以进行WM_INITAIALUPDATE添加的进行的虚拟函数!我估计是对话框这样的程序是MFC不愿意思给我们修改!?!
#6
这个问题,不管我的做法是不是正确,但你的肯定是合理的,让他的生命时间长一点。
#7
如果象这样:
class CComboBoxNew : public CComboBox
那这个组合框里的编缉框,它的背景色又怎么改变
class CComboBoxNew : public CComboBox
那这个组合框里的编缉框,它的背景色又怎么改变
#8
楼主这个,我有个例子,加我QQ给你