16,472
社区成员
发帖
与我相关
我的任务
分享
class AppInit
{
public:
AppInit(HINSTANCE instance);
~AppInit();
void initMainWnd();
LRESULT CALLBACK msgProc(UINT msg, WPARAM wParam, LPARAM lParam);
int go();
HWND getHwnd();
private:
HWND m_hWnd;
HINSTANCE m_hInstance;
};
AppInit *gApp = 0;
LRESULT CALLBACK MainWndProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
if (gApp != 0)
{
return gApp->msgProc(msg, wParam, lParam);
}
else
{
return DefWindowProc(hwnd, msg, wParam, lParam);
}
}
LRESULT CALLBACK AppInit::msgProc( UINT msg, WPARAM wParam, LPARAM lParam )
{
switch (msg)
{
case WM_CLOSE:
DestroyWindow(m_hWnd);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
default:
return DefWindowProc(m_hWnd, msg, wParam, lParam);
}
return 0;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
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);
}
}
//---------------------------------------------------------------------------
AppInit::AppInit(HINSTANCE instance):m_hWnd(0),m_hInstance(instance)
{
initMainWnd();
}
//---------------------------------------------------------------------------
AppInit::~AppInit()
{
}
//---------------------------------------------------------------------------
HWND AppInit::getHwnd()
{
return m_hWnd;
}
//.................
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//Dx代码
{
}
}
return (int)msg.wParam;
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
AppInit app(hInstance);
gApp =&app;
gApp->go();
return 0;
}
当我把initMainWnd里面内容放到go函数里面的时候就发现无法创建窗口。