본문 바로가기

프로그램언어/C++

API 리소스

리소스는 사전적 의미로 자원이란 의미를 가지고 있다.

 

소스코드는 개발자가, 리소스는 디자이너가 하는 식으로 분담 작업을 한다. 또한 리소스를 수정하더라도 프로그램을 다시 컴파일하지 않아도 되므로 개발 속도가 빨라진다. 소스코드와 리소스가 어떤 과정을 거처서 어느 시점에 결합이 되는 모식도를 보도록 한다.

 

소스 코드와 리소스는 각각 컴파일되어서 소스 코드는 *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:  
        break;

     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