CWnd::OnCreate() and CWnd::GetDlgItem()
Larry Siden -- lsiden@jade.bioimage.com Tuesday, April 16, 1996 Env: VC++ 1.5 on Win 3.11 Background: My app's frame window creates a dialog bar, which is represented by the class CColorBar. CColorBar is derived from CDialogBar. CColorBar responds to WM_ON_CREATE and initializes its child controls. Problem: CColorBar::OnCreate() invokes this->CWnd::GetDlgItem to retrieve objects that represent its various child controls. GetDlgItem(), however, is returning NULL. I have already confirmed that this->CColorBar::CWnd::m_hWnd is not NULL. I have also validiated the argument (nID) to GetDlgItem() by checking in the .rc file. Question: What other tools are at my disposal? What else do I need to look for? ============================================================================ Larry Siden, Senior Software Engineer phone: 313-930-9900 x211 (w) Bio Image, Inc. 777 E. Eisenhower Pky, Suite 950 email: (w) lsiden@bioimage.com Ann Arbor, MI 48108 (h) 73677.1646@compuserve.com
John & Annette Elsbree -- elsbree@msn.com Thursday, April 18, 1996 [Mini-digest: 5 responses] Larry - At the moment the control bar receives the WM_CREATE message, its own window has been created, but its child windows have not yet been created. You should wait to access the child windows until you receive WM_INITDIALOG. John (not speaking for Microsoft) -----From: "Frederic Steppe"I guess the controls are not net created at the time the WM_CREATE message is sent. You may try to implement some 'InitialUpdate' mechanism to initialize your controls. By the way, I think (not sure) that each control will receive a WM_INITIALUPDATE message after they are all created. The easiest way could be to override the Create function to CColorBar::Create, where you call the base class and initialize your controls. Frederic Steppe (frederics@msn.com) -----From: Kuruvilla Mathew Hi ! If you are using custom controls and the custom control ( .DLL, .VBX ) is not being loaded prior to the creation of the control then the GetDlgItem() will return a NULL because it cannot find the class registration and all the works associated with the child window class. If you are using stock controls and getting this problem probably you are out of handles or out of user heap etc. - Mat -----From: craigtt@ccmail.PE-Nelson.COM Larry, I can only offer a couple of suggestions to try. It sounds like you're getting into the creation process after the window has been created but before the dialog template has been loaded and initialized. 1. Are you calling CDialogBar::OnCreate() in your override before you try to access the control? 2. Possibly try overriding CDialogBar::Create instead. Call the base class first and if that succeeds, then do the control manipulation. Tim Craig PE-Nelson -----From: lsiden@jade.bioimage.com (Larry Siden) Thanks!!! > The controls don't yet exist when OnCreate is being called. If you look in > dlgbar.cpp, you'll see what's happening. CDialogBar::Create calls > CreateDialog. This will cause WM_INITDIALOG to be sent. I think you can grab > this in your CColorBar. Since CColorBar is not derived from CDialog, there is no OnInitDialog() to override. However, I can still explicitly initialize all the child-controls from the main frame class. Read on... Here is my reply to the list-server: I figured it out! CDialogBar::OnCreate() is not the appropriate place to initialize child controls. Instead, the frame must first invoke pDbar->Create(), and only then initialize the child controls either by itself or by invoking a function in the CDialogBar derived class. I don't know why this is so, but that's what I had to do to make it work. The other headache I had using the CDialogBar is that it does not handle its own messages without over-riding its WindowProc() not to pass the WM_COMMAND type messages to its parent. (See the C/C++ Q&A column in the July 95 issue of MSJ.) This is important since my app is a full OLE server and if it had to handle all the WM_COMMAND msgs for the CDialogBar in the main window, I would have to write all the message handlers twice: once for the CFrameWnd and once for the CIPFrameWnd. It seems much better and intuitive for the dialog bar to handle its own child notifications. The other thing I'm having trouble with is CDialogBar::OnUpdateCmdUI(). When it searches for message handlers for each control, it seems to be searching the message map of the frame window, not the message map of the dialog bar! I haven't been able to verify this or understand why this is so. Maybe someone can help me out here. Maybe I just need to override the OnUpdateCmdUI to explicitly update my controls, then call the default, but I want to make sure there's not a better way. I'll restate the question: How do I install ON_UPDATE_COMMAND_UI handlers for non-button controls that are embedded in a dialog bar? ============================================================================ Larry Siden, Senior Software Engineer phone: 313-930-9900 x211 (w) Bio Image, Inc. 777 E. Eisenhower Pky, Suite 950 email: (w) lsiden@bioimage.com Ann Arbor, MI 48108 (h) 73677.1646@compuserve.com
Larry Siden -- lsiden@jade.bioimage.com Monday, April 22, 1996 Thanks to all for your many replies. One final question: Does CWnd::Create() wait until WM_INITDIALOG has been handled before returning? If so, then I can safely access all the child-controls immediately after CWnd::Create() returns successfully. If not, then I must provide a handler for WM_INITDIALOG so access the controls and set up their contents and initial state.
Crucial Software -- crucial@ix.netcom.com Wednesday, April 24, 1996 >> Thanks to all for your many replies. One final question: Does >> CWnd::Create() wait until WM_INITDIALOG has been handled before >> returning? My understanding is that Windows "fabricates" WM_INITDIALOG in the handler for WM_CREATE when you're creating a dialog box. So, once Create() has returned, your dialog should be up and running fully. -- Brad Wilson, Crucial Software crucial@ix.netcom.com +1 (810) 620-9803 Custom software engineering services for Microsoft Windows NT and Windows 95 "You wear guilt . Like shackles on your feet . Like a halo in reverse I can feel . The discomfort in your seat . And in your head it's worse"
| Вернуться в корень Архива |