Re: CWindow::Create Failure
"NickP" <a@a.com> wrote in message
news:%23urEpEh8GHA.2092@TK2MSFTNGP03.phx.gbl...
Hi there,
I have a class derived from CWindowImpl and I am handling the WM_CREATE
message via a message handler and map.
-----------
BEGIN_MSG_MAP(CMyWindow)
MESSAGE_HANDLER(WM_CREATE, OnCreate)
END_MSG_MAP()
LRESULT OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/,
BOOL& /*bHandled*/);
LRESULT CFlashView::OnCreate(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM
lParam, BOOL& /*bHandled*/)
{
#if FLASH
cWndChildWindow = CWindow::Create(WC_MYWINDOWCLASS, m_hWnd,
NULL, NULL, WS_CHILD);
cWndChildWindow.ShowWindow(SW_SHOW);
#endif
return(0);
}
-----------
In the OnCreate method I would like to create an instance of a child
window that needs to be displayed in this window. But for some reason I
am greeted with an Assertion Failure with the expression
m_hWnd == 0
...
ATLASSUME(m_hWnd == NULL)
Now is this telling me that m_hWnd needs to be 0? or can't be 0?
m_hWnd is the handle to CMyWindow and at this point it should have been
created right? This is really confusing me, if I pass 0 to the method it
Although I see you solved your problem, it might help to clarify this as
well.
When WM_CREATE is sent (it is sent, not posted), the window exists, but
CreateWindow has not yet returned. So if you had code looking like:
static HWND hMainWnd;
hMainWnd = ::CreateWindow(...);
Then hMainWnd would not be assigned yet during WM_CREATE. Instead, the HWND
is passed as the first parameter to WndProc. Since ATL doesn't share that
first parameter with you, I expect it has already used it to set m_hWnd and
initialize whatever lookup tables / hash dictionary it uses to map between
C++ objects and HWNDs.