공부 중 메모/winAPI

0a_윈도우 생성 함수 간소화, 창 2개 띄우기.

라이피 (Lypi) 2018. 8. 4. 17:32
반응형

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;
}


반응형