Notice
Recent Posts
Recent Comments
Link
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Archives
Today
Total
관리 메뉴

codingfarm

3. 메시지 박스 (Message Box) 본문

Windows/윈도우즈 API

3. 메시지 박스 (Message Box)

scarecrow1992 2020. 11. 23. 23:58

메시지 박스 : 조그만 별도의 윈도우를 열어서 사용자에게 정보를 전달하거나 질문을 하는 장치

MessageBox 함수 호출 한번으로 비교적 간단하게 만들 수 있다.

int MessageBox(
    HWND    hWnd,
    LPCTSTR lpText,
    LPCTSTR lpCaption,
    UINT    uType
);
매개변수 기능
hWnd $\bullet$ 메시지 박스의 오너(Owner) 윈도우
$\bullet$ 메시지 박스가 떠 있는동안 오너 윈도우는 사용할 수 없는 상태가 된다.
lpText 메시지 박스에 출력할 문자열
lpCaption 메시지 박스의 타이틀 바에 나타날 제목 문자열
uType 메시지 박스에 어떤 종류의 버튼이 나타날 것인가를 지정하는 여러가지 플래그들

 

uType에 심을 수 있는 값은 아래와 같다.

설명
MB_ABORTRETRYIGNORE Abort, Retry, Ignore 세 개의 버튼이 나타난다.
MB_OK OK 버튼 하나만 나타난다.
MB_OKCANCEL OK, Cancel 두 개의 버튼이 나타난다.
MB_RETRYCANCEL Retry, Cancel 두 개의 버튼이 나타난다.
MB_YESNO Yes, No 두 개의 버튼이 나타난다.
MB_YESNOCANCEL Yes, No, Cancel 세 개의 버튼이 나타난다.

 

버튼 종류를 지정하는 값 외에 아이콘을 출력하는 다음과같은 플로그도 사용할 수 있다.

버튼 종류 플로그와 아이콘 ㅡㄹ래그를 OR연산자로 연결하여 uType 인수에 지정한다.

아이콘
MB_ICONEXCLAMATION
MB_ICONWARNING
MB_ICONINFORMATION
MB_ICONASTERISK
MB_ICONQUESTION
MB_ICONSTOP
MB_ICONERROR
MB_ICONHAND

 

 

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE g_hInst;
LPCTSTR lpszClass = TEXT("TextOut");

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)GetStockObject(WHITE_BRUSH);
	WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
	WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	WndClass.hInstance = hInstance;
	WndClass.lpfnWndProc = (WNDPROC)WndProc;
	WndClass.lpszClassName = lpszClass;
	WndClass.lpszMenuName = NULL;
	WndClass.style = CS_HREDRAW | CS_VREDRAW;
	RegisterClass(&WndClass);

	hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
		NULL, (HMENU)NULL, hInstance, NULL);
	ShowWindow(hWnd, nCmdShow);

	while (GetMessage(&Message, 0, 0, 0)) {
		TranslateMessage(&Message);
		DispatchMessage(&Message);
	}
	return Message.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	switch (iMessage) {
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_LBUTTONDOWN:
		MessageBox(hWnd, TEXT("마우스 왼쪽 버튼을 눌렀습니다."),
			TEXT("메시지 박스"), MB_ICONINFORMATION | MB_RETRYCANCEL);
		return 0;
	}
	return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}

위 코드를 실행하여 나온 window 창에서 좌클릭을 하면 아래와 같은 메시지 박스가 출력된다.

 

MessageBox의 리턴함수를 통해 통해 사용자가 메시지박스에서 어떤 버튼을 눌렀는지 알 수 있다.

설명
IDABORT Abort버튼을 눌렀다.
IDCANCEL Cancel 버튼을 눌렀다.
IDIGNORE Ignore 버튼을 눌렀다.
IDNO No버튼을 눌렀다.
IDOK OK 버튼을 눌렀다.
IDRETRY Retry 버튼을 눌렀다.
IDYES Yes 버튼을 눌렀다.

 

#include <windows.h>

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
HINSTANCE g_hInst;
LPCTSTR lpszClass = TEXT("TextOut");

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)GetStockObject(WHITE_BRUSH);
	WndClass.hCursor = LoadCursor(NULL, IDC_ARROW);
	WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
	WndClass.hInstance = hInstance;
	WndClass.lpfnWndProc = (WNDPROC)WndProc;
	WndClass.lpszClassName = lpszClass;
	WndClass.lpszMenuName = NULL;
	WndClass.style = CS_HREDRAW | CS_VREDRAW;
	RegisterClass(&WndClass);

	hWnd = CreateWindow(lpszClass, lpszClass, WS_OVERLAPPEDWINDOW,
		CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
		NULL, (HMENU)NULL, hInstance, NULL);
	ShowWindow(hWnd, nCmdShow);

	while (GetMessage(&Message, 0, 0, 0)) {
		TranslateMessage(&Message);
		DispatchMessage(&Message);
	}
	return Message.wParam;
}

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
	HDC hdc;
	PAINTSTRUCT ps;
	switch (iMessage) {
	case WM_DESTROY:
		PostQuitMessage(0);
		return 0;
	case WM_LBUTTONDOWN:
		
		int ret = MessageBox(hWnd, TEXT("마우스 왼쪽 버튼을 눌렀습니다."),
			TEXT("메시지 박스"), MB_ICONINFORMATION | MB_RETRYCANCEL);

		hdc = GetDC(hWnd);
		SetTextAlign(hdc, TA_CENTER);
		
		switch (ret) {
		case IDRETRY:
			TextOut(hdc, 100, 100, TEXT("Retry Click"),11);
			break;

		case IDCANCEL:
			TextOut(hdc, 100, 100, TEXT("Cancel Click"), 12);
			break;
		}
		
		ReleaseDC(hWnd, hdc);
		return 0;
	}
	return(DefWindowProc(hWnd, iMessage, wParam, lParam));
}

위 코드는 어느 버튼이 눌렸는지 화면의 출력을 통해 확인할 수 있다.

'Windows > 윈도우즈 API' 카테고리의 다른 글

4. 입력 - 키보드 입력  (0) 2020.11.30
3. 메시지 비프  (0) 2020.11.30
3. 그래픽 출력  (0) 2020.11.19
3. 문자열의 출력(TextOut, DrawText)  (0) 2020.11.19
3. DC(Device Context)  (0) 2020.11.19
Comments