embelog

Chapter12. ParentCenter 과제 본문

윈도우즈 API 정복

Chapter12. ParentCenter 과제

길동마누라 2021. 7. 26. 04:56
#include <Windows.h>
#include "resource.h"

HINSTANCE g_hInst;
LPCTSTR lpszClass = TEXT("Chapter12");

LRESULT CALLBACK WndProc(
	HWND hWnd,
	UINT iMessage,
	WPARAM wParam,
	LPARAM lParam
);

BOOL CALLBACK DialogProc(
	HWND hDlg,
	UINT iMessage,
	WPARAM wParam,
	LPARAM lParam
);

void MoveToParentCenter(HWND hDlg);

int APIENTRY WinMain(
	HINSTANCE hInstance,
	HINSTANCE hPrevInstance,
	LPSTR lpszCmdParam,
	int nCmdShow
) {
	HWND hWnd;
	MSG Message;
	WNDCLASS WndClass;
	g_hInst = hInstance;

	WndClass.cbClsExtra = 0;
	WndClass.cbWndExtra = 0;
	WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
	WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
	WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	WndClass.hInstance = hInstance;
	WndClass.lpfnWndProc = WndProc;
	WndClass.lpszClassName = lpszClass;
	WndClass.lpszMenuName = NULL;
	WndClass.style = CS_HREDRAW | CS_VREDRAW;

	RegisterClass(&WndClass);


	hWnd = CreateWindow(lpszClass, lpszClass, WS_CAPTION | WS_SYSMENU | WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
		NULL, (HMENU)NULL, hInstance, NULL);

	ShowWindow(hWnd, nCmdShow);

	HACCEL hAccel = NULL;

	while (GetMessage(&Message, NULL, 0, 0)) {
			TranslateMessage(&Message);
			DispatchMessage(&Message);
	}

	return (int)Message.wParam;
}


//과제 Parent Center
LRESULT CALLBACK WndProc(
	HWND hWnd,
	UINT iMessage,
	WPARAM wParam,
	LPARAM lParam
) {
	static HWND hButton;
	switch (iMessage) {

	case WM_CREATE:
		return 0;

	case WM_LBUTTONDOWN:

		DialogBox(
			g_hInst,
			MAKEINTRESOURCE(IDD_DIALOG1),
			hWnd,
			DialogProc
		);

		return 0;

	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;

	}

	return DefWindowProc(hWnd, iMessage, wParam, lParam);
}



BOOL CALLBACK DialogProc(
	HWND hDlg,
	UINT iMessage,
	WPARAM wParam,
	LPARAM lParam
) {

	switch (iMessage) {

	case WM_INITDIALOG:
		MoveToParentCenter( hDlg );
		return TRUE;

	case WM_COMMAND:
		switch (LOWORD(wParam)) {
		case IDOK:
		case IDCANCEL:
			EndDialog( hDlg, IDOK);
			return TRUE;
		}

		return FALSE;
	}

	return FALSE;
}

void MoveToParentCenter(HWND hDlg) {
	RECT rctWnd;
	RECT rctDlg;
	HWND hWnd = NULL;
	hWnd = GetParent(hDlg);

	GetClientRect(hWnd, &rctWnd);
	ClientToScreen(hWnd, (POINT*)&rctWnd);
	ClientToScreen(hWnd, (POINT*)&rctWnd.right);
	GetClientRect(hDlg, &rctDlg);

	MoveWindow(
		hDlg,
		((rctWnd.right + rctWnd.left) / 2 - (rctDlg.right - rctDlg.left) / 2),
		((rctWnd.bottom + rctWnd.top) / 2 - (rctDlg.bottom - rctDlg.top) / 2),
		rctDlg.right - rctDlg.left,
		rctDlg.bottom - rctDlg.top,
		FALSE
	);

	return;
}

대화상자의 속성 중에 화면상의 절대 위치를 지정하거나 화면의 중아에 대화상자가 나타나도록 하는 속성이 있다.

그러나 부모의 중앙에 나타나는 속성은 없으므로 함수를 직접 만들어 써야 한다.

 

대화 상자의 핸들을 주면 이 대화사아자를 부모 윈도의 중앙으로 이동시키는 다음 함수를 구현해 보자.

 

Void MoveToParentCenter(HWND hWnd)