핵심 API로 배우는 윈도우 프로그래밍
[windowAPI] 제5장 단축키
딴짓거리
2022. 12. 4. 22:54
핵심 API로 배우는 윈도우 프로그래밍 5장을 공부하고 정리한 내용입니다.
4장에서 각종 메뉴의 활용을 배웠다.
5장의 첫번째 챕터는 메뉴에 단축키를 할당하는 법을 배운다.
여러가지 작업을 하는데 일일히 메뉴를 클릭해 기능을 실행하는 것은 매우 번거로운 일이다.
개념있는 프로그램은 이런 단순 작업에 관련된 메뉴에는 대부분 단축키를 할당해 놓았다.
단축키는 어떻게 매핑하면 될까?
리소스에 accelerator를 추가해야한다.
리소스에 Accelerator를 추가하게 되면 이런식으로 단축키를 매핑할 수 있는 메뉴가 나온다.
ID에는 내가 생성해놓은 메뉴의 ID목록이 조회되고
보조키 + 키를 이용하여 단축키를 지정해야한다.
단축키를 매핑하고 싶은만큼 Accelerator를 추가해 메뉴마다 단축키를 할당해주면 된다.
엑셀러레이터 또한 리소스이다. ID를 지정해주고 코드에 메뉴처럼 삽입해주어야 사용할 수 있다.
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow)
{
HWND hwnd;
MSG msg;
WNDCLASS WndClass;
HACCEL hAcc;
hAcc = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDR_ACCELERATOR5_1));
WndClass.style = CS_HREDRAW | CS_VREDRAW;
WndClass.lpfnWndProc = WndProc;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hInstance = hInstance;
WndClass.hIcon = LoadIcon(NULL, IDI_QUESTION); //윈도우 아이콘
WndClass.hCursor = LoadCursor(NULL, IDC_IBEAM); //커서 모양
WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //배경 색
WndClass.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1); //메뉴 이름
WndClass.lpszClassName = _T("Window Class Name"); //윈도우 클래스 이름
RegisterClass(&WndClass);
hwnd = CreateWindow(_T("Window Class Name"),
_T("Cobaltbru's First Window"), //윈도우 타이틀 이름
WS_OVERLAPPEDWINDOW, //윈도우 스타일
200, //윈도우 위치 X
300, //윈도우 위치 Y
600, //윈도우 가로
400, //윈도우 세로
NULL,
NULL,
hInstance,
NULL
);
ShowWindow(hwnd, nCmdShow); //윈도우 기본 출력 함수
UpdateWindow(hwnd);
while (GetMessage(&msg, NULL, 0, 0))
{
if (!TranslateAccelerator(hwnd, hAcc, &msg))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return (int)msg.wParam;
}
늘 복사붙여넣기하던 WinMain 함수에 추가할 것이 있다.
LoadAccelerator() 함수를 이용해 내가 추가한 Accelerator를 불러와야한다.
또한 GetMesssage() 함수를 계속해서 호출해서 입력받은 키가 내가 지정한 단축키에 해당하는지 계속해서 검사해야 한다.
간단한 내용이다.
이건 4장에 있어야되는 내용같은데 왜 5장에 들어가있는지 모르겠다.