728x90
300x250

[MFC] 윈도우 프로그래밍 기초 - 팝업메뉴 만들기(리소스의 이해)

 

오늘 실습은 팝업 메뉴 만드는 방법에 대해 실습할 계획입니다.

실습과 더불어 간단하게 리소스의 큰 그림을 이해할 수 있도록 작성하였습니다.

 

 

 

 출력 결과

 


1. 프로젝트 생성하기

 

1. Visual Studio 2013을 켭니다.

2. 새 프로젝트를 만듭니다.

 

 

프로젝트 명은 Lecture로 하겠습니다.

 

3. 다음은 MFC 프로그램에 대한 기본 환경 설정입니다.

아래와 같이 설정하고 마침을 누르겠습니다.

 

 


2. 리소스 뷰에 대한 설명(숲 그리기)

 

2-1. 리소스란?

사전적 의미로 자원이란 의미를 가지고 있습니다.

전쟁으로 비유하면,

 

 

 

리소스는 위의 그림과 같은 관계가 될 수 있습니다.

 

Figure 2-1. <Source And Resource> - Relational Model

 

 

소스코드와 리소스는 각각 컴파일되어서, 소스코드는 *.obj로 변환되고, 리소스 파일은 *.rc로 컴파일이 됩니다.

이들이 Link 단계에서 결합 후에 Execution File로서 결합됩니다.

 

이번 실습에서의 큰 그림은 아래와 같이 소개할 수 있습니다.

 

 

2-2. 리소스 뷰

 

앞서 설명한 이야기를 이해하였으면, 실제 리소스가 MFC에서 어떻게 사용되는지 소개하겠습니다.

프로젝트를 앞서 생성했으면, 왼쪽에 리소스 뷰란 탭을 클릭하면 아래와 같은 창을 살펴볼 수 있습니다.

 

 

 

 

 리소스 뷰

 리소스 파일의 위치 (솔루션 탐색기)

 

리소스 파일 생성에 관해 말씀드리면, MFC 라이브러리를 이용하지 않는 프로그램이면 이용하면 리소스에 대해 관리가 될 수 있다고 보이나 MFC를 이용한 파일이면 굳이 자동으로 생성되는 만큼 별도로 추가 구성을 할 필요가 없습니다.

 

.rc라는 파일은 즉, 다수의 리소스를 모아놓은 하나의 집합이라고 정의할 수 있습니다.

 

2-3. 리소스 식별 접두어 (관례)

* 사용자 정의 리소스 식별 매크로의 접두어

 

설명

접두어

아이콘

IDI_

커서

IDC_

비트맵

IDB_

문자열 항목

IDS_ 또는 IDM_

메뉴

IDR_

메뉴 항목

IDM_

엑셀러레이터

IDR_

엑셀러레이터 키

IDM_

도구 모음

IDR_ 

도구 모음 버튼

IDM_

대화 상자

IDD_

컨트롤

IDC_

 

* MFC 내장 리소스 식별 매크로의 접두어

 

설명

접두어

아이콘 

AFX_IDI_

커서

AFX_IDC_

비트맵

AFX_IDB_

버전

VS_VERSION

문자열 항목

AFX_IDS_ 또는 ID_

메뉴 항목

ID_

엑셀러레이터

AFX_IDR_

엑셀러레이터 키

ID_

도구 모음 버튼

ID_

대화 상자

AFX_IDD_

컨트롤

AFX_IDC_ 또는 ID_

 

2-4. 리소스 뷰 간단하게 살펴보기

 

 


3. 실습(팝업 메뉴 만들기)

 

이번 실습은 "팝업 메뉴 만들기"라는 주제로 실습을 하겠습니다.

 

3-1. 메뉴 만들기

 

 

리소스 추가를 클릭합니다.

 

 

Menu를 선택하고 새로 만들기(N)을 클릭합니다.

 

 

 

3-2. 아래와 같이 메뉴를 꾸며주기.

 

 

 

 

 

 메뉴 구성하기

 리소스뷰 - 방금 만든 메뉴 리소스 ID 변경 -> IDR_POPUP

 

3-3. 클래스 뷰의 CMainFrame 설정하기

WM_CONTEXTMENU라는 영역에 OnContextMenu를 생성하는 방법을 실습해보겠습니다.

 

 

 

 

 

 

<Add> OnContextMenu를 클릭하면

MainFrm.cpp과 MainFrm.h의 파일에 자동 생성되어 구현할 수 있는 상태로 코드가 생성됩니다.

즉, MainFrm.cpp의 함수 원형을 변경할 경우, MainFrm.h 쪽도 저장하셔야합니다.

 

(참고)

 

 

 

 기본 생성된 MainFrm.h의 OnContextMenu 원형 구조

 

 

 

 

 기본 생성된 MainFrm.cpp의 구현 구조

 

3-4. 코딩하기

 

 
void CMainFrame::OnContextMenu(CWnd *pWnd, CPoint point)
{
      CMenu popup;
      CMenu* pMenu;

      popup.LoadMenuW(IDR_POPUP);
      pMenu = popup.GetSubMenu(0);

      pMenu->TrackPopupMenu(TPM_LEFTALIGN || TPM_RIGHTBUTTON, point.x, point.y, this);

}

수정) MainFrm.cpp

 void CMainFrame::OnContextMenu(CWnd *pWnd, CPoint point);

수정) MainFrm.h

 

(참고) 팝업 메뉴 소스코드 분석

 

* < LoadMenu() >의 원형

 

* BOOL CMenu::LoadMenu(LPCTSTR lpszResourceName) 

 

메뉴 리소스를 읽어오는 함수를 의미합니다.

 

* < GetSubMenu() >의 원형

 

* CMenu *CMenu::GetSubMenu(int nPos) const 

 

GetSubMenu() 함수는 메뉴 표시줄에서 하위 메뉴를 구하는 함수입니다.

즉, 구하고자 하는 함수의 하위 메뉴는 0부터 시작함.

 

 

* <TrackPopupMenu() > 의 원형

 

* BOOL CMenu::TrackPopupMenu( UINT nFlags, int x, int y, CWnd *pWnd, LPCRECT lpRect = NULL ) 

 

uFlags에는 여러가지 조합으로 사용가능

인수 uFlags에는 여러 가지 값을 조합하여 설정할 수 있는데, 팝업 메뉴의 정렬과 동작 설정 값을 비트 OR 연산자로 연결해 지정할 수 있음.

 

<팝업 메뉴의 정렬 설정 값>

값 

내용 

TPM_LEFTALIGN

팝업 메뉴를 지정한 위치에서 좌측 정렬 

TPM_RIGHTALIGN

팝업 메뉴를 지정한 위치에서 우측 정렬 

TPM_CENTERALIGN

팝업 메뉴를 지정한 위치에서 가운데 정렬

TPM_TOPALIGN

팝업 메뉴를 지정한 위치에서 위쪽 정렬

TPM_BOTTOMALIGN

팝업 메뉴를 지정한 위치에서 바닥 정렬

TPM_VCENTERALIGN

팝업 메뉴를 지정한 위치에서 수직 중앙 정렬

 

<팝업 메뉴의 동작 설정 값>

 

내용

TPM_LEFTBUTTON

마우스 왼쪽 버튼 클릭시 메뉴 수행

TPM_RIGHTBUTTON

마우스 오른쪽 버튼 클릭시 메뉴 수행

TPM_NONOTIFY

메뉴 항목이 선택되었을 때 통지 메시지를 보내지 않음

TPM_RETURNCMD 

메뉴 항목이 선택되었을 때 선택된 메뉴 항목의 ID를 반환 

 

* int x, int y

-> Point의 좌표 (eg: point.x, point y)

 

* pWnd

pWnd는 팝업 메뉴를 소유하고 있는 윈도우를 지정해주면 됨.

-> pWnd

 

3-5. 컴파일 해보기

마우스 오른쪽 버튼을 클릭해보면, 아래와 같이 정상 동작함을 확인할 수 있습니다.

 

 

반응형
728x90
300x250

[MFC] 윈도우 프로그래밍 기초 - 강좌 소개

 

이 강의는 아마도 제 생각엔 지금 2015년 기준에서 최신의 Visual Studio 2013 기반 C++ MFC 글이 될 수 있을 거 같습니다.

 


1. 제작 배경

 

주인장이 참으로 친절하게 일일이 Visual Studio 2008 책부터 구글링까지 다 동원해가면서 제작하고 있습니다.

나름대로 생각해보고 또 생각해서 다양한 정보들을 여러 참조해서 지구상에서 제일 쉬운 MFC 글을 만들어 보고 싶어서 기획했습니다. 

 


2. 흐름은

 

1. Win32 프로그래밍의 이해 (원리만)

-> 우리는 직접 노가다 하면서 Win32 프로그래밍은 하지 않습니다.

     MFC라는 게 Win32 프로그래밍을 기반으로 하고 있기에 잠시 체험(Experience)용으로? 만들었다고 생각하시면 됩니다.

2. MFC 개념 이해

    -> MFC 계층도 소개

    -> 몇개 이론 및 실습

3. 메시지 출력

4. 기본 컨트롤 익숙해지기

5. 필수 대화상자 몇개 다뤄보기.

6. 공통 컨트롤

7. 그리기 도구(GDI)

8. 라이브러리 작성법

-> 동적(Dynamic), 정적(Static) 둘 다 실습

9. 멀티스레드

10. 프로세스 통신(IPC)

 

이 정도까지 강좌를 만들어볼 계획입니다.

 

그러나 시간적인 한계도 있을 수 있기에 몇 가지는 생략될 수도 있습니다.

 


3. 실습 환경은?


Visual Studio 2013 Update 4 기준으로 작성했습니다.

 


4. MFC와 Windows API의 차이

 

번호

항목명

설명(Description)

1

MFC

 

MFC(Microsoft Foundation Class)는 Win32를 통해 C++ 개체 지향 래퍼를 제공하여 네이티브 데스크톱 응용 프로그램을 신속하게 개발할 수 있습니다. ATL(액티브 템플릿 라이브러리)은 COM 개발을 간단하게 하는 래퍼 라이브러리이며 ActiveX 컨트롤을 만드는 데 광범위하게 사용됩니다.

Visual Studio Community Edition 이상을 사용하여 MFC 또는 ATL 프로그램을 만들 수 있습니다.

Express 버전은 MFC 또는 ATL을 지원하지 않습니다.

Visual Studio 2015에서 Visual C++는 선택적 구성 요소이며 MFC와 ATL 구성 요소는 Visual C++ 아래의 선택적 하위 구성 요소입니다.

Visual Studio를 처음 설치할 때 이러한 구성 요소를 선택하지 않으면 처음으로 MFC 또는 ATL 프로젝트를 만들거나 열려고 할 때 설치하라는 메시지가 표시됩니다. 

Windows API


비공식 WinAPI 인 Windows API는 Microsoft Windows 운영 체제에서 사용할 수있는 Microsoft의 핵심 API (Application Programming Interface) 집합입니다.

이름 Windows API는 일반적으로 자체 이름(예: Win32 API)으로 참조되는 여러 가지 다른 플랫폼 구현을 집합 적으로 나타냅니다. 버전 섹션을 참조하십시오.

거의 모든 Windows 프로그램은 Windows API와 상호 작용합니다.
Windows NT 계열의 운영 체제에서는 Windows 시작 프로세스 초기에 시작된 프로그램과 같이 작은 숫자가
기본 API를 사용합니다.

개발자 지원은 소프트웨어 개발 키트 인 Microsoft Windows SDK의 형태로 제공되며 Windows API 및 관련 Windows 인터페이스를 기반으로 소프트웨어를 작성하는 데 필요한 설명서와 도구를 제공합니다.

Windows API (Win32)는 주로 프로그래밍 언어 C에 초점을두고 있습니다.
C#의 노출 된 함수와 데이터 구조는 최신 버전의 문서에서 해당 언어로 기술되어 있습니다.

그러나 API는 호출 및 콜백에 대한 규정 된 호출 규칙과 함께 (잘 정의 된) 저수준 데이터 구조를
처리 할 수있는 모든 프로그래밍 언어 컴파일러 또는 어셈블러에서 사용할 수 있습니다.
마찬가지로, API 함수의 내부 구현은 역사적으로 여러 언어로 개발되었습니다.

C는 객체 지향 프로그래밍 언어가 아니지만 Windows API와 Windows는 역사적으로 객체 지향으로

설명되었습니다.

 

MFC (Microsoft Foundation Class Library), VCL (Visual Component Library), GDI + 등이 객체지향 구조를
보다 명확하게 만드는 객체 지향 언어에 대한 많은 래퍼 클래스 및 확장 (Microsoft 및 기타)
.
예를 들어 Windows 8은 Windows API와 WinRT API를 제공합니다.이 API는 C++로 구현되며 디자인에 의해

객체지향적입니다

 

가장 정확한 정보는 아래의 링크에 접속하면 API 기능에 대해서 자세히 찾아볼 수 있습니다.

1. https://docs.microsoft.com/ko-kr/windows/desktop/apiindex/windows-api-list

 

MFC에 대한 정보입니다. 아래의 링크에 접속하면 자세히 찾아볼 수 있습니다.

https://msdn.microsoft.com/ko-kr/library/65dtx4a4.aspx

 


6. 참고자료(Reference)

 

1. MFC 개념, 마이크로소프트, https://msdn.microsoft.com/ko-kr/library/kkcb3t0w.aspx

2. Windows API Index, , 마이크로소프트, https://docs.microsoft.com/ko-kr/windows/desktop/apiindex/windows-api-list

3. Windows API Index, , 마이크로소프트, https://msdn.microsoft.com/ko-kr/library/65dtx4a4.aspx

4. MFC 데스크톱 응용 프로그램, 마이크로소프트, https://msdn.microsoft.com/ko-kr/library/d06h2x6e.aspx

반응형

+ Recent posts