读书人

新手createwindow多次调用的有关问题

发布时间: 2012-03-15 11:50:38 作者: rapoo

新手求助,createwindow多次调用的问题
#include <WINDOWS.H>
#include <STDIO.H>

HINSTANCE hInstance1;//存放hinstance

LRESULT CALLBACK WinFirstProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);

int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd
)
{
WNDCLASS wndclass;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
wndclass.hCursor=LoadCursor(NULL,IDC_CROSS);
wndclass.hIcon=LoadIcon(NULL,IDI_ERROR);
wndclass.hInstance=hInstance;
wndclass.lpfnWndProc=WinFirstProc;
wndclass.lpszClassName="xxoo";
wndclass.lpszMenuName=NULL;
wndclass.style=CS_HREDRAW | CS_VREDRAW;
RegisterClass(&wndclass);
hInstance1=hInstance;
HWND hwnd1=CreateWindow("xxoo","xbox",WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL);
hwnd1=CreateWindow("xxoo","xbox",WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd1,SW_SHOWNORMAL);

UpdateWindow(hwnd1);
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}

return 0;
}

LRESULT CALLBACK WinFirstProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
switch(uMsg)
{
case WM_CREATE:
MessageBox(hwnd,"create","Caption",MB_OKCANCEL);
CreateWindow("xxoo","xbox1",WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance1,NULL);
break;
case WM_LBUTTONDBLCLK:
MessageBox(hwnd,"First Window.","Caption",MB_OKCANCEL);
break;
case WM_CLOSE:
if(IDOK==MessageBox(hwnd,"Are you sure to cancle?","Caption",MB_OKCANCEL))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}
代码如上,一个最简单的窗口程序。我有2个问题:
首先,在winmain函数中调用2次createwindow好像都是成功的(调试时看到句柄都是有值的),那么createwindow可以重复创建同一个名称的窗口还是覆盖掉了?
其次,在wm_create消息中再次调用createwindow函数。因为createwindow函数在返回前会发送wm_create消息,于是觉得程序应该在wm_create中陷入死循环。但实际结果是,出现了10多次的messagebox,之后就不出现了。请问windows是不是有什么机制保护使这种死循环不会发生?
求高手们指点,拜谢!

[解决办法]
首先,在winmain函数中调用2次createwindow好像都是成功的(调试时看到句柄都是有值的),那么createwindow可以重复创建同一个名称的窗口还是覆盖掉了?
================
可以重复创建的。
[解决办法]
1、窗口是通过句柄来唯一识别的,和名称没什么关系,同名窗口可以有很多
2、有可能是句柄耗尽导致调用失败,然后也就没有WM_CREATE消息了,消息的循环调用和递归函数还是有区别的

读书人网 >VC/MFC

热点推荐