본문 바로가기

デベロップメント/Win32 API

메세지 박스

원문 http://wisdom.sakura.ne.jp/system/winapi/win32/win5.html



메세지를 표시

여기서는, Windows 프로그램에서 간단한 함수 중 하나로써

한편으로는 더 깊은 메세지 박스에 대해서 설명합니다 (얕보고 덤비면 안됩니다)


메세지 박스는 유저에 어떤 경고를 할 때에 사용합니다.
윈도우 생성 작업의 필요는 없고, 초심자라도 간단히 습득할 수 있습니다.

드디어, GUI 프로그램 최초의 일보(一歩)를 내딛을 수 있겠죠♪


메세지 박스를 표시할때에는 MessageBox() 함수를 호출합니다.

범용성에 걸쳐있습니다만, 간이(簡易) 다이얼로그 박스로써 활용하는 것이 가능합니다.


int MessageBox(HWND hWnd , LPCTSTR lpText , LPCTSTR lpCaption , UINT uType);


첫번째 인수로는, 오너 윈도우(부모 윈도우)를 지정합니다.

이것은, 지금은 없으므로 NULL로 하는 것으로 하겠습니다.

첫번째 인수를 NULL로 지정하면, 오너 윈도우를 가지지 못한 메세지 박스가 됩니다.

HWND형(型) 같은 것에 대해서도, 나중에 자세히 설명하겠습니다.


LPCTSTR형은 설명하지 않아도 상상(想像)이 되겠죠.

확장 문자 대응의 정수 문자열에 대한 32비트 포인터 입니다.

CONST TCHAR*에도 맞는 형태겠죠.


여기서 새로운 UINT형이라고 하는게 나왔습니다.

이름에서부터 상상되도록, 이건 정수형(整数型)의 데이터 형태입니다.

UINT는, Win16(Windows Version 3.0과 3.1)에서는 16비트 부호없는 정수

이후 Win32에서는 32비트 부호없는 정수를 표현합니다.


두번째 인수는, 메세지 박스로 표시하는 메인의 문자열을

두번째 인수는, 메세지 박스의 프레임으로 표시되는 타이틀을 지정합니다.


마지막 인수로는, 메세지 박스의 형태를 표현하는 정수를 지정합니다.

메세지 박스는 버튼의 수나 아이콘같은게 복수(複数)로 준비되어 있습니다.


반환 값은, 어떤 버튼이 눌렸는가를 표시하는 정수를 반환합니다.

반환값에 대해서는 나중에 자세히 설명하겠습니다.


즉시 메세지 박스를 표시해 봅시다.

마지막 인수는, 일단 이 경우에는 MB_OK를 지정해주세요.

#include <windows.h>

int WINAPI WinMain(
		HINSTANCE hInstance ,
		HINSTANCE hPrevInstance ,
		PSTR lpCmdLine ,
		int nCmdShow ) {
	MessageBox(NULL , TEXT("Kitty on your lap") ,
			 TEXT("메세지 박스") , MB_OK);
	return 0;
}

이 프로그램을 실행하면, OK버튼만이 있는 심플한 메세지 박스가 표시됩니다.

프로그램은 메세지 박스가 닫힐때까지 끝나지 않습니다.


인수의 종료로 지정한 정수입니다만, 매우 다양한 정수가 준비되어 있습니다.
전부 기억하기에는 시간이 걸리므로, 이건 필요한 때에 도움말을 참고하면 좋겠죠.


복수의 항목을 지정할 때는, 정수를 논리합(論理和)으로 가산(加算)합니다.

#include <windows.h>

int WINAPI WinMain(
		HINSTANCE hInstance ,
		HINSTANCE hPrevInstance ,
		PSTR lpCmdLine ,
		int nCmdShow ) {
	MessageBox(NULL , TEXT("Kitty on your lap") ,
			TEXT("메세지 박스") ,
			MB_OK | MB_ICONINFORMATION);
	return 0;
}

이 프로그램은 정보 메세지를 표시합니다.

메세지 박스에 「i」의 아이콘이 붙어있어요.



반환 값

메세지 박스의 버튼 중에서, 어떤 버튼이 눌렸는가는

MessageBox() 함수의 반환 값으로 알 수 있습니다.


눌린 버튼의 플래그는 역시 정수로써 준비되어 있습니다.

예를들어, 눌린 버튼이 「예」 버튼이라면 IDYES, 「아니오」라면 IDNO가 됩니다.

「예」 「아니오」 버튼이 있는 메세지 박스는 MB_YESNO를 네번째 인수를 줍니다.

#include <windows.h>

int WINAPI WinMain(
		HINSTANCE hInstance ,
		HINSTANCE hPrevInstance ,
		PSTR lpCmdLine ,
		int nCmdShow ) {
	int on_button;
	on_button = MessageBox(NULL , TEXT("Do you like Nekomimi?") ,
			TEXT("질문입니다") , MB_YESNO | MB_ICONQUESTION );

	if (on_button == IDYES)
		MessageBox(NULL , TEXT("You are nice!") ,
				 TEXT("메세지 박스") , MB_OK);
	else MessageBox(NULL , TEXT("Be Killed!") ,
				 TEXT("메세지 박스") , MB_OK);
	return 0;
}

이것만으로도, 「예」인가 「아니오」만으로 게임을 만들 수 있겠네요.

심리 게임 등이 있다면, 그걸로도 마음 가는대로 만들 수 있겠지요.


참고로 MB_ICONQUESTION은 의문부호의 아이콘를 표시합니다.



문자열 포맷

C언어 프로그래머라면, sprintf()함수의 편리함은 알고 있겠죠

서식 제어 문자로 표현한 문자열을 버퍼에 저장할 수 있습니다.


Win32의 경우에, Unicode와 형태의 관계에서 sprintf()를 사용 할 수는 없습니다.
거기서 wsprintf() 함수를 사용합니다.


int wsprintf(LPTSTR lpOut , LPCTSTR lpFmt , ...);


lpOut에는 포맷한 문자열을 저장하는 포맷을

lpFmt에는 NULL로 끝나는 서식 제어 문자열에 대한 포인터를 지정합니다.

함수가 성공하면, 버퍼에 저장된 종단(終端())의 NULL을 포함하지 않는 문자수를 반환하고

함수가 실패하면 서식 제어 문자열의 길이보다도 작은 값이 반환됩니다.


서식 제어 문자열에 대해서는 C언어의 printf() 함수와 같습니다.

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
			PSTR lpCmdLine , int nCmdShow ) {
	CHAR chStr[128];

	wsprintf(chStr , "인스턴스 핸들 : %d" , hInstance);
	MessageBox(NULL , chStr , TEXT("Kitty on your lap") , MB_OK);

	return 0;
}

이 프로그램에는, 간이(簡易)로 CHAR 배열을 사용하고 있습니다만,

LPTSTR형의 포인터로 동적으로 확보한 영역의 포인터를 전하는게 좋겠죠.


이것을 컴파일하고 실행하면, hInstance의 정수표현이 메세지 박스에 표시됩니다.



문자열 함수

Win32가 Unicode의 관계에서 ANSI C표준 문자열 함수를 사용할 수 없습니다.

정확하게는, 사용하지 못하는건 아닙니다만 이식성(移植)이 저하됩니다.

이건 위의 wsprintf() 함수의 예로 충분히 이해했을거라고 생각합니다.


Win32 API는 strcpy()나 strcat() 등의 문자열 함수의 Windows 표준을 제공하고 있습니다

문자열을 버퍼에 복사하는 lstrcpy() 함수도 쓰입니다.


LPTSTR lstrcpy(LPTSTR lpString1, LPCTSTR lpString2);

lpString1은 lpString2를 복사한 버퍼에 대한 포인터를 지정합니다.

버퍼는 충분한 사이즈를 가지고 있을 필요가 있습니다.

lpString2에는 lpString1로 복사한 문자열에 대한 포인터를 지정합니다.

함수가 성공하면, 버퍼에 대한 포인터가, 실패하면 NULL이 반환됩니다.

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
			PSTR lpCmdLine , int nCmdShow) {
	TCHAR * str1 = TEXT("Kitty on your lap");
	TCHAR str2[32];

	lstrcpy(str2 , str1);
	MessageBox(NULL , str2 , str2 , MB_OK);
	return 0;
}

프로그램을 실행하면 "Kitty on your lap"이라고 적힌 메세지 박스가 출현합니다.

여기서부터, str2에 str1이 복사 되어있는 것을 알 수 있습니다.

이것 이외에 문자열을 지정 문자수만큼 복사하는 함수도 있습니다

lstrcpyn() 함수는, 지정 문자열의 포인터부터 버퍼에 지정 문자열 수 만큼 복사합니다.

LPTSTR lstrcpyn(
	LPTSTR lpString1 , LPCTSTR lpString2,
	int iMaxLength
);

lpString1은 lpString2를 복사한 버퍼에 대한 포인터를 지정합니다.

버퍼는 충분한 사이즈를 가지고 있을 필요가 있습니다.

lpString2에는 lpString1로 복사된 문자열에 대한 포인터를 지정합니다.

iMaxLength는 NULL 문자도 포함한 복사할 문자열 수를 지정합니다.

함수가 성공했다면, 버퍼에 대한 포인터가, 실패했다면 NULL이 반환됩니다.


그러나 이 함수를 사용하려면, 복사하는 문자열의 문자수를 알 필요가 있습니다.

정수로써 이해하고 있다면 확실하지만, 그렇지 않은 문자열도 있겠죠

문자열의 문자수를 취득하려면 lstrlen() 함수를 사용합니다.


int lstrlen(LPCTSTR lpString);

lpString에는 문자열에 대한 포인터를 지정합니다.

함수는 바이트 수(ANSI), 또는 문자 수(Unicode)를 반환합니다.

lstrcpyn() 함수는 NULL 문자도 포함한 문자 수를 지정하지 않으면 안되는 것에 대해서

lstrlen() 함수는 NULL 문자를 포함하지 않은 문자 수를 반환하는 곳에 주의해주세요.

#include <windows.h>
int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance , PSTR lpCmdLine , int nCmdShow) { TCHAR * str1 = TEXT("Kitty on your lap"); TCHAR str2[32]; lstrcpyn(str2 , str1 , lstrlen(str1) + 1); MessageBox(NULL , str2 , str2 , MB_OK); return 0; }

전의 프로그램과 결과는 같습니다만, 처리 과정(処理過程)이 다릅니다.

lstrcpyn() 함수를 사용해, 문자열을 버퍼에 복사하고 있습니다.


문자열을 결합하는 것에서는, ANSI C로 strcat() 함수를 사용하고 있습니다.
여기까지의 이름 규칙에서 예상됩니다만, Win32에서는 lstrcat()을 사용합니다.


LPTSTR lstrcat(LPTSTR lpString1, LPCTSTR lpString2);


lpString1은 lpString2를 NULL 문자부터 결합한 문자열에 대한 포인터
그 포인터가 가리키는 문자열의 말미(末尾)로 lpString2이 결합되고

그 포인터가 가리키는 버퍼는 충분히 사이즈를 보유하고 있을 필요가 있습니다.

lpString2에는 lpString1로 결합된 문자열에 대한 포인터를 지정합니다.

성공하면 결합된 문자열에 대한 포인터, 실패하면 NULL이 반환됩니다.

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance ,
			PSTR lpCmdLine , int nCmdShow) {
	TCHAR str1[128] = TEXT("Kitty on your lap\n");
	TCHAR * str2 = TEXT("Tokyo mew mew");

	lstrcat(str1 , str2);
	MessageBox(NULL , str1 , str2 , MB_OK);
	return 0;
}

프로그램을 실행하면, 최초의 str1과 str이 결합된 문자열이 표시됩니다.



MessageBox()

int MessageBox(HWND hWnd , LPCTSTR lpText , LPCTSTR lpCaption , UINT uType);

메세지 박스가 표시됩니다.

hWnd - 오너 윈도우를 지정합니다. NULL의 경우는 오너 윈도우를 가지지 않습니다.
lpText - 메세지 박스에 표시한 메인 문자열을 지정합니다
lpCaption - 타이틀바에 표시된 문자열을 지정합니다.
uType - 메세지 박스의 내용을 플래그로 지정합니다.

반환값 - 메세지 박스의 눌린버튼을 정수치(整数値)로 반환합니다.


정수

해설
버튼
MB_ABORTRETRYIGNORE

[중지], [재시도], [무시] 푸시 버튼을 표시합니다.

MB_OK

[OK] 푸시 버튼을 표시합니다. Default 입니다.

MB_OKCANCEL

[OK]、[취소] 푸시 버튼을 표시합니다.

MB_RETRYCANCEL

[재시도]、[취소] 푸시 버튼을 표시합니다.

MB_YESNO

[예]、[아니오] 푸시 버튼을 표시합니다.

MB_YESNOCANCEL

[예]、[아니오]、[취소] 푸시 버튼을 표시합니다.

아이콘

MB_ICONEXCLAMATION
MB_ICONWARNING
느낌표 아이콘을 표시합니다.
MB_ICONINFORMATION
MB_ICONASTERISK

말풍선의 안에 소문자의 「 i 」가 있는 아이콘을 표시합니다.

MB_ICONQUESTION

물음표의 아이콘을 표시합니다.

MB_ICONSTOP
MB_ICONERROR
MB_ICONHAND
정지

디폴트 푸시

MB_DEFBUTTON1

최초의 버튼을 디폴트 푸시 버튼으로 합니다.
Default 입니다.

MB_DEFBUTTON2

2번째 버튼을 디폴트 푸시 버튼으로 합니다.

MB_DEFBUTTON3

3번째 버튼을 디폴트 푸시 버튼으로 합니다.

MB_DEFBUTTON4

4번째 버튼을 디폴트 푸시 버튼으로 합니다.

동작
MB_APPLMODAL

유저는, 메세지 박스에 대응하지 않으면
hWnd 파라미터로 지정된 윈도우에서 작업을 계속 할 수 없습니다.
다른 어플리케이션의 윈도우로 이동해 작업을 할 수 있습니다.
Default 입니다.

MB_SYSTEMMODAL

메세지 박스가
WS_EX_TOPMOST 스타일을 가지고 이외는 MB_APPLMODAL과 같습니다.
유저가 바로 알아차릴 필요가 있도록 중대한 오류를 알려야 할 때에 사용합니다.

MB_TASKMODAL

hWnd 파라미터가 NULL일 때에
현재의 태스크에 속한 모든 톱 레벨 윈도우가 무효가 되는 것을 제외하고
MB_APPLMODAL과 같습니다
호출하는 측(側)의 어플리케이션 (또는 라이브러리)가
유효한 윈도우의 핸들을 갖지 않고
또, 다른 어플리케이션을 중단하지 않은 채
현재의 어플리케이션을 다른 윈도우에 대한 입력을 중지 하고 싶을 때에 사용합니다.

그 외

MB_DEFAULT_DESKTOP_ONLY

현재 입력을 취득할 데스크탑은
디폴트의 데스크탑이 아니면 안됩니다.
그 외의 경우에는, 함수가 실패합니다.
디폴트 데스크탑은, 유저가 로그온한 후에

어플리케이션이 기동할 테스크톱입니다.

MB_HELP

[헬프] 푸시 버튼을 추가합니다.
유저가 헬프 버튼을 선택하거나 F1키를 누르거나 해서
헬프 이벤트를 작성할 수 있습니다.

MB_RIGHT

텍스트를 우측 정렬합니다.

MB_RTLREADING

오른쪽에서 왼쪽으로 텍스트를 표시합니다.
히브리어나 아라비아어를 지원하고 있는 시스템에서 유효(有効)합니다.

MB_SETFOREGROUND

메세지 박스를 Foreground 윈도우에 합니다.
Windows 시스템은 내부에 SetForegroundWindow 함수를 호출합니다.

MB_TOPMOST

메세지 박스를 최전면 윈도우 (WS_EX_TOPMOST)로 작성합니다.

MB_SERVICE_NOTIFICATION

Windows NT 전용입니다.
호출 측(側)이 유저에 이벤트를 통지할 때의 서비스를 지정합니다.
유저가 로그온 하지 않았을 때에도
현재 액티브된 데스크탑에 메세지 박스를 표시합니다.
이 플래그를 세트할 때에
hWnd 파라미터에 NULL을 지정해주세요.

MB_SERVICE_NOTIFICATION_NT3X

Windows NT 전용입니다.
이 값은, Windows NT 버전 3.51로
MB_SERVICE_NOTIFICATION라고 정의된 값과 같습니다.

반환 값

IDABORT

[중지] 버튼이 선택 되었습니다.

IDCANCEL

[취소] 버튼이 선택 되었습니다.

IDIGNORE

[무시] 버튼이 선택 되었습니다.

IDNO

[아니오] 버튼이 선택 되었습니다.

IDOK

[OK] 버튼이 선택 되었습니다.

IDRETRY

[재시도] 버틑이 선택 되었습니다.

IDYES

[네] 버튼이 선택 되었습니다.

wsprintf()

int wsprintf(LPTSTR lpOut , LPCTSTR lpFmt , ...);


지정된 인수를 서식제어 문자열에 따라 포맷하고 버퍼에 저장합니다.

lpOut - 버퍼에 대한 포인터를 지정합니다.
lpFmt - NULL로 끝나는 서식 제어 문자열에 대한 포인터를 지정합니다.
... - 0개 이상의 인수를 지정합니다.

반환 값 - 성공하면 저장된 글자 수, 실패하면 문자열의 길이보다 짧은 값

lstrcpy()

LPTSTR lstrcpy(LPTSTR lpString1, LPCTSTR lpString2);

 

문자열을 복사합니다.

lpString1 - lpString2를 복사한 버퍼에 대한 포인터를 지정합니다.
lpString2 - lpString1에 복사한 문자열에 대한 포인터를 지정합니다.

반환 값 - 버퍼에 대한 포인터, 실패하면 NULL

lstrcpyn

LPTSTR lstrcpyn(
	LPTSTR lpString1 , LPCTSTR lpString2,
	int iMaxLength
);

지정 문자열 수 만큼, 문자열을 복사합니다.

lpString1 - lpString2를 복사한 버퍼의 포인터를 지정합니다.
lpString2 - lpString1에 복사한 문자열에 대한 포인터를 지정합니다.
iMaxLength - 복사한 NULL을 포함한 문자열 수를 지정합니다.

반환 값 - 버퍼에 대한 포인터, 실패하면 NULL

int lstrlen(LPCTSTR lpString)

문자열의 문자 수를 반환합니다.

lpString - 조사할 문자열에 대한 포인터를 지정합니다.

반환 값 - 문자 수를 반환합니다.

LPTSTR lstrcat(LPTSTR lpString1, LPCTSTR lpString2);

문자열을 다른 문자열로 결합합니다.

lpString1 - lpString2를 결합한 문자열에 대한 포인터
lpString2 - lpString1에 결합된 문자열에 대한 포인터를 지정합니다.

반환 값 - 결합한 문자열에 대한 포인터, 실패하면 NULL




이전 페이지
목차
다음 페이지