반응형
CoreHeader.h
#pragma once #include <Windows.h> #define WINMAIN(hinst) int WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine,int nCmdShow) #define WNDPROC(WndProc) LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) #define CREATEDEFAULTWINDOW(windowName,hInstance) CreateWindowEx(0, windowName, windowName, WS_OVERLAPPEDWINDOW, 0, 0, 800, 600, NULL, NULL, hInstance, NULL) int g_iWindowNum = 0; WNDPROC(WndProc_1) { switch (iMsg) { case WM_CREATE: g_iWindowNum++; break; case WM_DESTROY: g_iWindowNum--; if (g_iWindowNum == 0) { PostQuitMessage(0); } break; } return DefWindowProc(hwnd, iMsg, wParam, lParam); } WNDPROC(WndProc_2) { switch (iMsg) { case WM_CREATE: g_iWindowNum++; break; case WM_DESTROY: g_iWindowNum--; if (g_iWindowNum == 0) { PostQuitMessage(0); } break; } return DefWindowProc(hwnd, iMsg, wParam, lParam); }
WINMAIN.cpp
//WinMain과 MsgProc, CreateWindow함수의 인자를 간략히 한 매크로 함수를 몇개 만들고, 윈도우를 2개 띄우는 함수. //각각 다른 메시지 처리 함수를 사용하며, 윈도우 창이 모두 꺼졌을때 프로그램이 종료되도록 하였다. #include "CoreHeader.h" WINMAIN(hInst) { //윈도우 클래스 등록 1 WNDCLASSEX Wnd_1; ZeroMemory(&Wnd_1, sizeof(WNDCLASSEX)); Wnd_1.cbSize = sizeof(WNDCLASSEX); Wnd_1.hInstance = hInst; Wnd_1.lpfnWndProc = WndProc_1; Wnd_1.lpszClassName = L"window_1"; if (RegisterClassEx(&Wnd_1) == false) { return 1; } //윈도우 클래스 등록 2 WNDCLASSEX Wnd_2; ZeroMemory(&Wnd_2, sizeof(WNDCLASSEX)); Wnd_2.cbSize = sizeof(WNDCLASSEX); Wnd_2.hInstance = hInst; Wnd_2.lpfnWndProc = WndProc_2; Wnd_2.lpszClassName = L"window_2"; if (RegisterClassEx(&Wnd_2) == false) { return 1; } HWND hwnd_1; hwnd_1 = CREATEDEFAULTWINDOW(L"window_1", hInst); if (hwnd_1 == NULL) { return 1; } ShowWindow(hwnd_1, SW_SHOW); HWND hwnd_2; hwnd_2 = CREATEDEFAULTWINDOW(L"window_2", hInst); if (hwnd_2 == NULL) { return 1; } ShowWindow(hwnd_2, SW_SHOW); MSG msg; ZeroMemory(&msg, sizeof(MSG)); while (true) { //두번째 인자값을 NULL을 주면 어떻게 되는거지...? //- hWnd가 NULL이면, 현재의 thread를 호출한 윈도우와 관련된 메시지를 보게된다. if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) { TranslateMessage(&msg); DispatchMessage(&msg); if (msg.message == WM_QUIT) { break; } } else { //IdleTime } } return 0; }
반응형