본문 바로가기

소프트웨어/Win32

Win32] Menu 만들기

WIn32 API정복 참고


작성 소스

https://github.com/ManSung-Kim/Win32Study/blob/master/StudyWin32/Menu.cpp



Android에서 xml을 통해 layout을 관리하는 것처럼, Win32는 .rc파일과 resource.h를 기반으로 Resource들을 관리한다(Layout을 작성한다)



1.솔루션탐색기에서 '리소스 파일'오른클릭->추가->리소스(.rc)->생성된 .rc파일 더블클릭 해서 사용자 메뉴 작성


2. 저장하면 resource.h파일이 생성되는데 여기에는 ID값이 define으로 mapping되어있다.

(ID생성규칙은 ID_큰매뉴_작은메뉴)


3. WinMain에서 WNDCLASS를 초기화할때

WndClass.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1); // menu resource add


와같이 make int resource를 불러주면 해당 layout이 적용된다.


4. 메시지처리

Menu ID의 Message는 WM_COMMAND로 날라온다.

그리고 Menu ID는 wParam의 low word(==loword)에 담겨오기때문에 wParam을 LOWORD 매크로로 실행하면 나온다.

switch(iMessage) {
	case WM_COMMAND:
		switch(LOWORD(wParam)) { // wParam의 low word에 resource id값이 날라온다.
		case ID_FILE_MENU1:
			MessageBox(hWnd,TEXT("Menu 1"),TEXT("Menu1 Caption"),MB_OK);
			break;
		case ID_FILE_MENU2:
			MessageBox(hWnd,TEXT("Menu 1"),TEXT("Menu1 Caption"),MB_OK);
			break;
		case ID_FILE_EXIT:
			DestroyWindow(hWnd);
			break;		
		}
		return 0;




# Accelator 생성(단축키생성)

1. 매뉴 컴포넌트를 더블클릭해서 Caption의 값을 바꾼다.

&뒤에 위치하는 char가 메뉴에 포커스가 있을때 눌리는 단축키가 된다. \t는 키조합 단축키의 설명을 위해 띄어쓰기를 해준 것이다.




2. .rc에서 accelator를 resource로 추가한다. 


리소스뷰에서 오른쪽클릭->리소스추가->Accelator 클릭. 그리고 Accelator 테이블이 생성되면 더블클릭해서 ID를 하나 새로 만들고

사용할 키 조합을 만들고 저장하면 된다. 위의 스크린샷의 단축키는 ALT + virtual key A 로 등록된다.




3. 이렇게 등록한 후 WinMain에서 Accelator를 load해야 단축키가 정상 동작한다.



...

HACCEL hAccel; // global accelator 선언

...

int APIENTRY WinMain(HINSTANCE hInstance, ... {

...

hAccel = LoadAccelerators(hInstance, MAKEINTRESOURCE(ID_ACCELERATOR40004)); // accelator load

while(GetMessage(&Message,0,0,0) ) {

if(!TranslateAccelerator(hWnd, hAccel, &Message)) // accelator에 기술된 키 들어오면 true 리턴해서 아래 구문으로 안들어가게함

{

TranslateMessage(&Message);

DispatchMessage(&Message);

}

}

return Message.wParam;

}



소스를보면 메뉴ID값을 얻을때 매크로를 이용해 handle 값을 얻어온것처럼 MAKE INT RESOURCE를 이용한다.

작성후 메뉴를 누르고 '1'을 누르거나, 아무것도 선택하지 않고 ALT+A를 누르면 Menu1이 실행되는것을 확인할 수 있다.




그외. Icon 역시 마찬가지로 "리소스 파일"에서 추가하면 된다.

'소프트웨어 > Win32' 카테고리의 다른 글

Win32] Edit  (0) 2016.01.17
Win32] CheckBox  (0) 2016.01.17
Win32] Button  (0) 2016.01.17
Win32] Bitmap Bitblt, StretchBlt  (0) 2016.01.17
Win32 공부를 시작하면서..  (0) 2016.01.06
Win32 첫 소스(기본소스)  (0) 2016.01.06
VS2010] Resource .rc 다른편집기에서 열려있습니다.  (0) 2016.01.06