64,646
社区成员
发帖
与我相关
我的任务
分享
class AppInit
{
public:
AppInit(HINSTANCE instance);
~AppInit();
void initMainWnd();//注册窗口类,创建窗口
LRESULT CALLBACK msgProc(UINT msg, WPARAM wParam, LPARAM lParam);
int go();//消息循环
private:
HWND m_hWnd;
HINSTANCE m_hInstance;
};
//-----------------------------------------------
int WINAPI WinMain(...)
{
gApp =&AppInit(hInstance);//gApp是个全局的AppInit *,并初始化为0
gApp->go();
}
LRESULT CALLBACK MainWndProc(...)//这是注册窗口类时的窗口过程函数
{
if (gApp != 0)
{
return gApp->msgProc(msg, wParam, lParam);
}
else
{
return DefWindowProc(hwnd, msg, wParam, lParam);
}
}
go()函数就是消息循环,本来initMainWnd()是放到默认构造函数中的,但考虑到CreateWindow时,gApp还是0,
就不能处理WM_CREATE消息了,所以就把initMainWnd()移到go函数中了,却发现CreateWindow失败,返回值是0,
GetLastError也是0。。。求大神解答!
http://u.115.com/file/t7b7c7626d
void AppInit::initMainWnd()
{
WNDCLASS wc;
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.hCursor = LoadCursor(0, IDC_ARROW);
wc.hIcon = LoadIcon(0, IDI_ERROR);
wc.hInstance = m_hInstance;
wc.lpfnWndProc = MainWndProc;
wc.lpszClassName = "CLASS";
wc.lpszMenuName = NULL;
wc.style = CS_HREDRAW | CS_VREDRAW;
if ( !RegisterClass(&wc) )
{
MessageBox(0, "RegisterClass FAILED!", 0, 0);
PostQuitMessage(0);
}
m_hWnd = CreateWindow("CLASS", "Tetris", WS_OVERLAPPEDWINDOW
&~WS_MAXIMIZEBOX&~WS_THICKFRAME, 200, 100, 900, 500, NULL,
NULL, m_hInstance, NULL);
if ( !m_hWnd )
{
MessageBox(0, "CreateWindow FAILED!", 0, 0);
PostQuitMessage(0);
}
}
int AppInit::go()
{
ShowWindow(m_hWnd, SW_SHOW);
UpdateWindow(m_hWnd);//若放到initMainWnd则失去第一次处理WM_PAINT消息的机会
MSG msg;
msg.message = WM_NULL;
while (msg.message != WM_QUIT)
{
if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
}
}
return (int)msg.wParam;
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,PSTR lpCmdLine,int nShowCmd )
{
AppInit app(hInstance);
gApp =&app;
return gApp->go();
}