embelog
Chapter12. ParentCenter 과제 본문
#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)