리소스는 사전적 의미로 자원이란 의미를 가지고 있다.
소스코드는 개발자가, 리소스는 디자이너가 하는 식으로 분담 작업을 한다. 또한 리소스를 수정하더라도 프로그램을 다시 컴파일하지 않아도 되므로 개발 속도가 빨라진다. 소스코드와 리소스가 어떤 과정을 거처서 어느 시점에 결합이 되는 모식도를 보도록 한다.
소스 코드와 리소스는 각각 컴파일되어서 소스 코드는 *obj 파일이 되고, 리소스는 *.rc 파일이 되어 최종 실행 파일이 만들어지기 전 링크 단계에서 결합된다.
메뉴 만들기
솔루션 탐색기에서 리소스 파일을 클릭하고 마우스 오른쪽 버튼을 누르면 아래와 같이 나타난다. 여기서 리소스메뉴를 클릭한다.
대화상자에서 "Menu"선택하고 새로만들기 버튼을 클릭한다.
솔루션 탐색기의 리소스 파일에 Win32Project1.rc 파일이 생성되고 리소스탭기를 선택하면 Menu - IDR_MENU1이 생성된것을 알수 있다.
메뉴의 항목보기
파일(속성 설정) | 편집(속성 설정) | 도움말(속성 설정) | |||
caption | ID | caption | ID | caption | ID |
파일 | 편집 | 도우말 | |||
새글 | ID_FILENEW | 취소하기 | ID_EDITUNDO | 프로그램 정보 | ID_INOFRM |
열기 | ID_FILEOPEN | 복사하기 | ID_EDITCOPY | ||
저장 | ID_FILESAVE | 붙여넣기 | ID_EDITPASTE | ||
끝내기 | ID_EXIT |
소스코드 추가
#include "resource.h" ... WndClass.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1); |
MAKEINTERSOURCE() 함수
LPTSTR MAKEINTERSOURCE( WORD wInteger // 리소스에 대한 정수형 상수 ); |
WM_COMMAND메시지
컨트롤러에 이벤트가 발생하면 WM_COMMAND메시지가 발생한다. 이 메시지는 이벤트가 발생했는지는 알지만 어떤 항목이 선택했는지는 모른다. 어떤 메뉴 항목을 선택했는지는 wParam 변수에 저장된다. 선택된 메뉴 항목의 ID는 정수값으로 저장된다.
wParam | |
HIWORD | LOWORD |
컨트롤이 보내주는 통지메시지, 메뉴가 선택된 경우는 0이되고 액셀러레이터가 선택된 경우는 1이 된다. | 메뉴나 액셀러레이터, 컨트롤의 ID |
MessageBox() 함수
int MessageBox( HWND hwnd, // 윈도우 핸들 LPCTSTR lpText, // 메시지 박스에 나타나는 문자열 LPCTSTR opCaption, // 제목 표시줄에 표시할 문자열 UINT uType // 메시지 박스에 보여주는 버튼의 조합 ); |
버튼의 종류 | 버튼 | 설명 |
MB_ABORTRETRYGNORE | [중단(A)][다시시도(R)][무시(I)] | "중단, 다시시도, 무시" 세 개의 버튼이 달린 메시지 박스 |
MB_CANCELTRYCONTINUE | [취소][다시 시도(T)][계속(C)] | "취소, 다시시도, 계속" 세 개의 버튼이 달린 메시지 박스 |
MB_HELP | [확인][도움말] | "확인, 도움말" 두 개의 버튼이 달린 메시지 박스 |
MB_OK | [확인] | "확인" 한 개의 버튼이 달린 메시지 박스 |
MB_OKCANCEL | [확인][취소] | "확인, 취소" 두 개의 버튼이 달린 메시지 박스 |
MB_RETRYCANCEL | [다시 시도(R)][취소] | "다시 시도, 취소" 두 개의 버튼이 달린 메시지 박스 |
MB_YESNO | [예(Y)][아니오(N)] | "예, 아니오" 두 개의 버튼이 달린 메시지 박스 |
MB_YESNOCANCEL | [예(Y)][아니오(N)][취소] | "예, 아니오, 취소" 세 개의 버튼이 달린 메시지 박스 |
아이콘의 종류 | 설명 |
MB_ICONEXCLAMATION | ![]() |
MB_ICONWARNNG | ![]() |
MB_ICONINFORMATION | ![]() |
MB_ICONASTERISK | ![]() |
MB_ICONQUESTION | ![]() |
MB_ICONSTOP | ![]() |
MB_ICONERROR | ![]() |
MB_ICONHAND | ![]() |
리턴값 | 설명 |
IDABORT | 중단(Abort) 버튼을 눌렀을 때 |
IDCANCEL | 취소(Cancel) 버튼을 눌렀을 때 |
IDCONTINUE | 계속(Continue) 버튼을 눌렀을 때 |
IDIGNORE | 무시(Ignore) 버튼을 눌렀을 때 |
IDNO | 아니오(No) 버튼을 눌렀을 때 |
IDOK | 확인(OK) 버튼을 눌렀을 때 |
IDRETRY | 다시시도(Retry) 버튼을 눌렀을 때 |
IDYES | 예(Yes) 버튼을 눌렀을 때 |
윈도우에 메뉴 붙이기
#include <windows.h> #include <TCHAR.H> #include "resource.h"
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam); int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { HWND hwnd; MSG msg; WNDCLASS WndClass; WndClass.style = CS_HREDRAW | CS_VREDRAW WndClass.lpfnWndProc = WndProc; WndClass.cbClsExtra = 0; WndClass.cbWndExtra = 0; WndClass.hInstance = hInstance WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); WndClass.hCursor = LoadCursor(NULL, IDC_ARROW); 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("Window Title Name"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL ); ShowWindow(hwnd, nCmdShow); UpdateWindow(hwnd); while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return (int)msg.wParam; }
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { switch (iMsg) { case WM_CREATE: case WM_DESTROY: PostQuitMessage(0); break; } return DefWindowProc(hwnd, iMsg, wParam, lParam); } |
커멘드 메시지 처리하기
LRESULT CALLBACK WndProc(HWND hwnd, UINT iMsg, WPARAM wParam, LPARAM lParam) { int answer;
switch (iMsg) { case WM_CREATE: break; case WM_COMMAND: switch (LOWORD(wParam)) { case ID_FILENEW: MessageBox(hwnd, _T("새파일을열겠습니까), _T("새파일선택"), MB_OKCANCEL); break; case ID_EXIT: answer = MessageBox(hwnd, _T("파일을저장하고끝내겠습니까), _T("끝내기선택"), MB_YESNOCANCEL); if (answer == IDYES || answer == IDNO) PostQuitMessage(0); break; } break; case WM_DESTROY: PostQuitMessage(0); break; } return DefWindowProc(hwnd, iMsg, wParam, lParam); } |
실행 결과]
'프로그램언어 > C++' 카테고리의 다른 글
공용 대화상자 사용하기2 (0) | 2020.09.25 |
---|---|
API 공용 대화상자 사용1 (0) | 2020.09.25 |
API 그리기 모드(Draw Mode) (0) | 2020.09.23 |
API 마우스 (0) | 2020.09.22 |
API 타이머 (0) | 2020.09.21 |