#include "resource.h"
WndClass.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam)
{
switch(iMessage) {
case WM_COMMAND:
switch(LOWORD(wParam)) {
case ID_FILE_MENU1:
MessageBox(hWnd, TEXT("첫 번째 메뉴를 선택했습니다."),
TEXT("MenuDemo"), MB_OK);
break;
}
}
}위의 내용 추가
resource.h파일 안에는 메뉴 항목의 ID가 정의되어 있음
/{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by Menu.rc
//
#define ID_FILE_MENU1 40002
#define ID_FILE_MENU2 40003
#define ID_FILE_EXIT 40004
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 102
#define _APS_NEXT_COMMAND_VALUE 40005
#define _APS_NEXT_CONTROL_VALUE 1000
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
이 ID를 보고 어떠한 행동을 취하게 됨
메뉴를 누를 시 WM_COMMAND메세지 발생
LOWORD(wParam)를 이용하여 어떤 메뉴 항목이 선택되었는지 확인
아이콘, 커서
1. 리소스 추가 대화상자를 이용해서 아이콘, 커서 추가
2. 아래 소스를 추가
WndClass.hCursor=LoadCursor(hInstance, MAKEINTRESOURCE(IDC_CURSOR1));
//hInstance(핸들), 즉 자기 자신이 정의하고 있는 IDC_CURSOR1 커서를 읽어옴
WndClass.hIcon=LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1));
//hInstance(핸들), 즉 자기 자신이 정의하고 있는 IDI_ICON1 아이콘을 읽어옴
#define MAKEINTRESOURCE(i) (LPSTR)((DWORD)((WORD)(i)))
정수 타입의 리소스 ID를 문자열 포인터형으로 캐스팅
액셀러레이터(accelerator)
단축키 : 메뉴 이름에 &을 넣어 Alt키와 함께 사용하는 키, 반드시 Alt키와 함께 사용해야 하며 메뉴에 있는 항목을 키보드로 선택하는 빠른 방법
액셀러레이터 : 메뉴와 상관없이 언제든지 사용할 수 있음
1. caption속성 설정
caption속성
Menu&1\tCtrl+A
Menu&2\tCtrl+B
&Exit\tCtrl+C
2.액셀러레이터 생성
ID : 액셀러레이터가 실행되었을 때 WM_COMMAND메세지와 함께 해당되는 ID가 전달되어 WndProc()함수에서 ID에 맞게 처리하게 됨
3. 소스 추가
hAccel = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR1));
//hInstance(핸들), 즉 자기 자신이 정의하고 있는 IDR_ACCELERATOR1 액셀러레이터를 읽어옴
while(GetMessage(&Message, NULL, 0, 0)) {
if(!TranslateAccelerator(hWnd, hAccel, &Message)) {
TranslateMessage(&Message);
DispatchMessage(&Message);
}
}HACCEL LoadAccelerators(HINSTANCE hInstance, LPCTSTR lpTableName);
리소스로부터 액셀러레이터 테이블을 읽어들임
IDR_ACCELERATOR1은 정수 값이므로 MAKEINTRESOURCE()함수를 이용하여 문자열포인터로 형 변환
int TranslateAccelerator(HWND hWnd, HACCEL hAccTable, LPMSG lpMsg);
키보드 메세지를 WM_COMMAND메세지로 변경하여 액셀러레이터가 동작하도록 함
lpMsg의 키보드 입력값을 읽어 이 키값이 hAccTable에 있는지 먼저 살펴보고 있을 경우 그 키에 해당하는 WM_COMMAND메세지를 hWnd윈도우로 전달하고 TRUE를 리턴, 실패시는 false 리턴
TranslateAccelerator()함수를 if절 안에 넣어 엑셀러레이터가 입력되었을 경우 TranslateMessage()함수, DispatchMessage()함수가 실행되지 못하도록 함
문자열 테이블
int LoadString(HINSTANCE hInstance, UINT uID, LPTSTR lpBuffer, int nBufferMax);
1번째 인수 : 문자열 리소스를 가진 인스턴스 핸들
2번째 인수 : 읽어올 문자열의 ID를 줌
3번째 인수 : 문자열을 읽을 버퍼 지정
4번째 인수 : 버퍼의 길이
문자열 리소스를 사용하는 이유
1. 문자열 자체가 코드와 분리됨으로써 문자열만 따로 관리할 수 있으며 프로젝트를 유지하는 데 큰 도움을 준다
2. 다국어 버전을 쉽게 만들 수 있음
3. 문자열을 고쳐도 소스를 다시 컴파일할 필요가 없어 개발속도도 빨라짐