编辑- 添加了与最初未包含的 m_hWndClient 和 WndProc 相关的代码。为了简明扼要,我错误地认为它是无关的。
以下运行后
HWND m_hWndFrame;
HWND m_hWndClient; // added in Edit2
...
m_hWndFrame = CreateWindowEx(...)
m_hWndFrame
为 NULL 并GetLastError
给出“错误 1400 - 无效的窗口句柄”,但这工作正常:
HWND m_hWndFrame = NULL;
HWND m_hWndClient = NULL; // added in Edit2
...
m_hWndFrame = CreateWindowEx(...)
我的WndProc
样子是这样的:
LRESULT CALLBACK ProgramManager::WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
CLIENTCREATESTRUCT clientCreate;
HINSTANCE hInstance = GetModuleHandle(NULL);
RECT clientRect;
switch (uMsg)
{
case WM_CREATE:
clientCreate.hWindowMenu = NULL;
clientCreate.idFirstChild = IDM_FIRSTCHILD ;
GetClientRect(hwnd,&clientRect);
s_instance->m_hWndClient = CreateWindowEx(WS_EX_CLIENTEDGE, TEXT ("MDICLIENT"), NULL,
WS_CHILD | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, 0, 0, clientRect.right,
clientRect.bottom, hwnd, (HMENU)ID_MDI_CLIENT, hInstance,
(LPVOID)&clientCreate);
return 0 ;
case WM_CLOSE:
DestroyWindow(hwnd);
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
}
return DefFrameProc(hwnd,m_hWndClient,uMsg,wParam,lParam);
}
我的项目现在可以工作了(经过很多头发撕裂),但我不明白为什么初始化一个仅用于保存返回值的变量很重要。
显然,假设一个变量为 NULL 或 0 而没有初始化,然后使用或测试内容(例如if (!m_unitialisedVariable)
)将会以灾难告终,但在这种情况下为什么重要?在调用“CreateWindowEx”之前不需要m_hWndFrame
特别包含任何内容(至少根据 VS2010 中的帮助),那么为什么它会影响“CreateWindowEx”的结果呢?