대화상자 만들기
아래 그림과 같이 리소스메뉴을 클릭
리소스에서 Dialog를 선태갛고 새로만들기 버튼 클릭
Dialog가 생성된다.
대화상자 보이기
int DialogBox( HINSTANCE hInstance, // 애플리케이션 인스턴스 LPCTSTR lpTemplate, // 대화상자 ID HWND hwnd, // 부모 윈도우 핸들 DLGPROC lpDialogFunc // 대화상자의 프로시저 함수 ); |
대화상자 종료하기
BOOL EndDialog(HWND hDlg, int nResult); // nResult는 0값을 넣는다. |
#include <windows.h> #include <TCHAR.H> #include "resource.h" LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam); BOOL CALLBACK DlgProc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam); HINSTANCE hInst;
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { HWND hwnd; MSG msg; WNDCLASS WndClass; hInst = hInstance; WndClass.style = CS_HREDRAW | CS_VREDRAW; WndClass.lpfnWndProc = WndProc; WndClass.cbClsExtra = 0; WndClass.cbWndExtra = 0; WndClass.hInstance = hInstance; WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); WndClass.hCursor = LoadCursor(NULL, IDC_ARROW); WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); WndClass.lpszMenuName = NULL; WndClass.lpszClassName = _T("Window Class Name"); RegisterClass(&WndClass); hwnd = CreateWindow(_T("Window Class Name"), _T("Window Title Name"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam; }
BOOL CALLBACK DlgProc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam) { switch (iMsg) { case WM_INITDIALOG: return 1; case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: EndDialog(hDlg, 0); break; case IDCANCEL: EndDialog(hDlg, 0); break; } break; } return 0; }
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { switch (iMsg) { case WM_CREATE: break; case WM_LBUTTONDOWN: DialogBox(hInst, MAKEINTRESOURCE(IDD_DIALOG1), hwnd, DlgProc); break; case WM_DESTROY: PostQuitMessage(0); break; } return DefWindowProc(hwnd, iMsg, wParam, lParam); }
|
실행결과]
WM_COMMAND 메시지
메시지를 보낸곳 | wParam | lParam | |
HIWORD | LOWORD | ||
컨트롤 | 컨트롤에 따른 통지 정보 | 컨트롤 ID | 컨트롤 핸들 값 |
버튼 컨트롤의 통지 메시지
통지 메시지 | 설명 |
BN_CLICKED | 버튼 클릭 |
BN_DBLCK | 버튼 더블클릭 |
BN_DISABLE | 버튼 비활성화 |
BN_DOUBLECLICKED | 라디오 버튼이나 BS_OWNERDRAW 스타일 버튼에서 버튼을 더블클릭 |
BN_HILITE | 버튼 선택시 발생 |
BN_UNHILITE | 버튼에서 다른 윈도우로 전환시 발생 |
BN_SETFOCUS | 버튼에 포커스가 갔을 때 |
BN_KILLFOCUS | 버튼에서 포커스가 사라졌을 때 |
BN_PAINT | 버튼이 다시 그려질 때 |
WM_INITDIALOG 메시지 (대화상자가 처음 생성될 때 발생하는 메시지)
wParam | 대화상자에서 제일 먼저 키보드로 입력받을 컨트롤의 핸들 값 |
lParam | 부가 정보를 저장하며 일반적으로 0값 |
GetDlgItem() 함수 : 대화상자에 있는 컨트롤의 핸들 값을 얻어온다.
HWND GetDlgItem ( HWND hDlg, // 컨트롤이 있는 대화상자의 핸들 int nIDDlgItem // 컨트롤 ID ); |
EnableWindow() 함수 : 윈도우나 컨트롤을 사용, 불가능 상태로 만드는 함수
BOOL EnableWindow ( HWND hwnd, // 대상이 되는 윈도우나 컨트롤의 핸들 BOOL bEnable // TRUE이면 사용 가능, FALSE이면 사용 불가능 상태로 만듦 ); |
다이얼로그박스에 버튼 추가히기
"출력하기"버튼을 만들어 다이얼로그에 출력하고 "끝내기"버튼을 만들어 다이얼로그창을 닫는다.
BOOL CALLBACK DlgProc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam) { HDC hdc;
switch (iMsg) { case WM_INITDIALOG: return 1; case WM_COMMAND: switch (LOWORD(wParam)) { case ID_BUTTON_PRINT: hdc = GetDC(hDlg); TextOut(hdc, 0, 0, _T("Hello World"), 11); ReleaseDC(hDlg, hdc); break; case ID_BUTTON_END: EndDialog(hDlg, 0); break; case IDOK: EndDialog(hDlg, 0); break; case IDCANCEL: EndDialog(hDlg, 0); break; } break; } return 0; } |
실행 결과]
마우스 왼쪽버튼을 클릭하고 출력버튼을 누르면
끝내기 버튼을 누르면 다이얼로그창이 닫힌다.
버튼 컨트롤을 활성화와 비활성화를 만들어보자.
BOOL CALLBACK DlgProc(HWND hDlg, UINT iMsg, WPARAM wParam, LPARAM lParam) { HDC hdc; HWND hButton;
switch (iMsg) { case WM_INITDIALOG: hButton = GetDlgItem(hDlg, ID_PAUSE); EnableWindow(hButton, FALSE); return 1; case WM_COMMAND: switch (LOWORD(wParam)) { case ID_START: hButton = GetDlgItem(hDlg, ID_START); EnableWindow(hButton, FALSE); hButton = GetDlgItem(hDlg, ID_PAUSE); EnableWindow(hButton, TRUE); break; case ID_PAUSE: hButton = GetDlgItem(hDlg, ID_START); EnableWindow(hButton, TRUE); hButton = GetDlgItem(hDlg, ID_PAUSE); EnableWindow(hButton, FALSE); break; case ID_CLOSE: EndDialog(hDlg, 0); break; case ID_BUTTON_PRINT: hdc = GetDC(hDlg); TextOut(hdc, 0, 0, _T("Hello World"), 11); ReleaseDC(hDlg, hdc); break; |
실행결과]
다이얼로그가 로드되면서 정지버튼이 비활성화 되고, 시작버튼을 클릭하면 정지버튼은 활성화, 시작버튼을 비활성화되고, 정버튼을 클릭하면 시작버튼은 활성화되고, 정지버튼은 비활성화된다.
종료버튼을 클릭하면 다이얼로그 창이 닫힌다.