1. 메뉴
- 윈도우에서 가장 보편적으로 사용되는 사용자 인터페이스
- 해당 애플리케이션이 갖고 있는 기능을 사용자에게 알려주고 사용자 선택에 따라 기능을 수행할 수 있도록 매개 역할을 함
메뉴의 종류
- 풀 다운 메뉴: 사용자가 메뉴 카테고리 하나를 선택하면 선택된 카테고리 아래로 메뉴가 뚝 떨어지면서 애플리케이션의 기능을 작동시킬 수 있는 메뉴항목이 나타남
- 캐스캐이딩 메뉴: 풀다운 메뉴에서 변형된 형태로, 메뉴 항목의 오른쪽에 또 하나의 서브 메뉴가 나타남
- 팝업 메뉴 또는 문맥 메뉴: 애플리케이션 영역의 중간에서 자유롭게 튀어나오는 메뉴, 대표적인 팝업 메뉴는 오른쪽 마우스 버튼을 클릭하면 나오는 단축 메뉴
메뉴 리소스
- 리소스 뷰의 Menu에서 IDR_MAINFRAME 더블 클릭하면 기본 메뉴
기본 메뉴
- [파일], [편집], [보기], [도움말]
메뉴 속성 항목
- ID: 메뉴 항목에 대한 리소스 ID로 메뉴 항목 식별
- Caption: 메뉴 항목에 출력되는 문자열로 엑세스 키 설정시 & 붙이기
- Separator: 메뉴 항목들을 구분하는 분리선 설정
- Prompt: 메뉴 항목 선택 시 상태바에 출력될 문자열
메뉴 항목 선택 시 메시지
1. 명령 메시지 함수(WM_COMMAND)
- 프로그램 실행 중 사용자가 메뉴 항목 선택 -> WM_COMMAND 메시지 발생 + 메뉴의 ID가 추가적인 정보로 전달
- -> WM_COMMAND 메시지는 메뉴의 ID에 따라 여러 가지 동작을 하도록 사용
- 따라서 OnCommand() 메시지 핸들러 함수에서 모든 메시지 처리하지 않고, 특정 명령 메시지와 이를 처리하는 명령 메시지 핸들러 함수를 메시지 맵에 등록하는 기능을 함
- 어떤 명령 메시지를 처리하는 핸들러 함수를 어느 클래스에 만들 것인가는 명령 메시지 성격에 따라 프로그래머가 결정
- 사용자의 동작(메뉴 클릭)에 따라 여러 가지 동작을 수행하기 위해 사용되는 메시지
- 메뉴 항목을 선택했을 때의 명령 메시지는 해당 메뉴 항목을 처리하는 클래스에 속한 핸들러 함수에서 처리하는 것이 자연스럽습니다.
- WM_COMMAND 메시지 처리하는 함수 안에 메뉴 ID랑 그 메뉴 처리하는 이벤트 핸들러 함수가 들어감 BY OnCommand()
2. 사용자 인터페이스 갱신 메시지 함수
- UPDATE_COMMAND_UI 메시지는 메뉴 항목이 표시되기 전에 보내지는 메시지로 메뉴 항목을 변경하고자 할 때 사용
- 이 메시지를 처리하는 함수를 사용자 인터페이스 갱신 메시지(ui update message) 핸들러 함수라 하고 함수 이름이 OnUpdate로 시작
- 예를 들면 메뉴 항목을 선택 못하게 그레이 메뉴로 만들거나 메뉴 항목 앞에 체크 표시를 할 때 이 메시지 함수로 처리
- Enable(), SetCheck(), SetRadio, SetText() ...
간단한 메뉴와 단축키 만들기 실습
단축키
- 애플리케이션 메뉴를 돌아다닐 필요 없이 어떤 애플리케이션 기능을 작동시키기 위해 누를 수 있는 단일키 조합
- 리소스 뷰에서 Accelerator를 등록하여 설정
- "Ctrl + C"는 복사 기능을 수행하는 단축키
- 특정 키 조합으로 실행
엑세스 키
- Alt 키와 메뉴 항목에 밑줄이 그어진 문자를 동시에 누르면 해당하는 문자를 가진 메뉴 항목을 선택할 수 있음
- 메뉴에 출력할 문자열에서 액세스키를 설정한 문자 앞에 '&'를 붙이면 설정 가능
- 주로 "Alt" 키와 다른 키 조합으로 활성화
2. 툴바
툴바
- 한 줄 또는 여러 줄의 명령버튼을 포함하는 윈도우
- 툴바는 메뉴 명령의 시각적인 표현이기 때문에 메뉴의 동작에 대한 구현과 유사
툴바 리소스
- IDR_MAINFRAME 메뉴: 4비트의 기본 툴바
- IDR_MAINFRAME_256 메뉴: 24비트의 고급 툴바
3. 상태 표시줄
상태 표시줄
- 메인 프레임 하단부에 위치하여 특정 항목을 선택하면 해당 항목의 도움말이 출력되는 형태의 윈도우
- 팬(Pane)이라 불리는 표시 영역들로 나뉨
-> 고정되거나 변화할 수 있는 크기를 가짐
-> 제일 왼쪽의 팬은 가변의 팬
-> 고정크기 팬: CapsLock키 설정팬, Num Lock키 설정팬, Scroll Lock키 설정팬
상태 표시줄을 만드는 단계
① CStatusBar의 객체 생성
② CStatusBar::Create 함수를 사용하여 상태표시줄 윈도우 생성
③ 팬을 만들고, 그 크기를 지정
MFC 애플리케이션 마법사에서 생성된 상태 표시줄 코드
① 상태 표시줄의 멤버 변수 선언(MainFrm.h)
//나와 나를 상속받는 자식이 사용 가능함
protected: // control bar embedded members
CStatusBar m_wndStatusBar;
② 상태 표시줄을 분할하는 지시자 설정(MainFrm.cpp) - Pane 영역 구분
static UINT indicators[ ] =
{//기본적으로 4개로 구성
ID_SEPARATOR, // status line indicator(가변 크기 펜)
ID_INDICATOR_CAPS, //고정 크기 펜
ID_INDICATOR_NUM,
ID_INDICATOR_SCRL,
} ;
③ 윈도우 생성시 상태 표시줄을 생성하는 부분 (MainFrm.cpp)
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
//반환값이 -1이면 오류가 발생한 것으로 간주하고 -1을 반환
if (CFrameWndEx::OnCreate(lpCreateStruct) == -1)
return -1;
//m_wndStatusBar라는 멤버 변수를 통해 상태 표시줄을 생성
if (!m_wndStatusBar.Create(this))
{
//Create 함수가 실패하면 오류 메시지를 출력하고 -1을 반환
TRACE0("상태 표시줄을 만들지 못했습니다.\n");
return -1; // 만들지 못했습니다.
}
//m_wndStatusBar의 상태 표시줄 인디케이터를 설정(분할 지시자 설정)
// 배열과 배열의 크기를 인자로 전달
//indicators 배열의 전체 크기를 UINT 자료형의 크기로 나눈 값으로, 배열의 요소 개수를 의미
m_wndStatusBar.SetIndicators(indicators, sizeof(indicators)/sizeof(UINT));
return 0;
}
- 만약 indicators 배열이 16바이트 크기를 가지고 각 요소가 4바이트인 경우, sizeof(indicators)는 16를 반환하고, sizeof(UINT)는 4를 반환합니다. 따라서 sizeof(indicators)/sizeof(UINT)는 16/4로 계산되어 4가 됩니다. 이는 상태 표시줄이 4개의 분할 지시자로 나뉘어진다는 의미입니다.
상태 표시줄에 팬을 만들고 문자열 출력하기 실습
m_wndStatusBar.SetPaneInfo(1, ID_INDICATOR_POINT, SBPS_NORMAL, 200);
SetPaneInfo 함수는 상태 표시줄의 특정 패널에 대한 정보를 설정하는 역할을 합니다.
인자로 전달되는 값들은 다음과 같습니다:
첫 번째 인자인 1은 패널의 인덱스를 나타냅니다. 여기서는 1번 패널을 의미합니다.
두 번째 인자인 ID_INDICATOR_POINT는 해당 패널에 표시될 내용을 식별하는 ID 값입니다. 여기서는 ID_INDICATOR_POINT를 사용하여 해당 패널에 점(Point) 정보를 표시할 것임을 나타냅니다.
세 번째 인자인 SBPS_NORMAL은 패널의 스타일을 설정합니다. SBPS_NORMAL은 일반적인 스타일을 의미합니다.
네 번째 인자인 200은 패널의 너비를 설정합니다. 여기서는 200으로 지정하여 해당 패널의 너비를 200 픽셀로 설정합니다.
따라서 위의 코드는 상태 표시줄의 1번 패널에 점(Point) 정보를 표시하고, 일반적인 스타일을 적용하며, 패널의 너비를 200 픽셀로 설정하는 역할을 합니다.
CStatusBar::SetPaneText() 함수
- 팬에 문자열을 출력하는 함수
- BOOL SetPaneText(int nIndex, LPCTSTR lpszNewText, BOOL bUpdate = TRUE);
- nIndex: 문자열이 표시하고자 하는 팬의 번호
- lpszNewText: 출력하고자 하는 문자열
- bUpdate: True이면 팬의 SetPaneText() 함수를 추가한 메시지에 따라 초기 문자열이 출력하고자 하는 문자열로 변경, Falsedlaus 초기 문자열 이 변경되지 않음
- SetPaneText 함수의 세 번째 매개변수 bUpdate는 해당 팬의 텍스트를 업데이트할지 여부를 나타내는 불리언 값입니다. 이 값이 TRUE로 설정되면 함수 호출 후에 해당 팬의 텍스트가 지정한 문자열(lpszNewText)로 업데이트됩니다. FALSE로 설정되면 초기 텍스트가 변경되지 않습니다.
도킹 팬(Docking Pane) 윈도우
- Visual Studio 2008 SP1 Feature Pack부터 적용된 인터페이스 기술
도킹 팬 윈도우의 특징
- 툴 바 또는 다이얼로그 바와 같이 프레임 윈도우의 어떤 부분이라도 자유롭 게 도킹할 수 있음
- 탭(Tab) 윈도우를 이용한 중첩 가능 & 분할 윈도우를 이용한 영역 배치
- 캡션(Caption), 자동 숨기기(Auto hide), 컨텍스트 메뉴(Context menu) 등 유용한 기능을 가지고 있음
- 대화상자에 포함되는 모든 컨트롤들을 처리할 수 있고, 컨트롤이 보내는 메시지도 처리 가능
- 예) Visual Studio : 전체적인 인터페이스 레이아웃 설정을 자유자재로 변경할 수 있는 유연함을 제공함
개인정보 출력 도킹 팬 만들기 실습
- 도킹팬 윈도우 내부의 대화상자 폼으로 구성된 컨트롤을 이용 하여 이름, 성별, 취미를 선택하고 선택된 내용을 윈도우에 출 력하는 프로그램을 작성
- 도킹팬 클래스인 CInfoPane 을 생성 -> 이 클래스 내부에 개인 정보 대화상자 클래스의 객체를 선언 -> 도킹팬 클래스에서 개인 정보 대화상자를 가질 수 있음(CInfoCtrl m_ctrInfo)
- 결론: 도킹팬 클래스에 대화상자 클래스 객체를 넣고, 메인 프레임에 도킹팬 객체를 넣어서 관리한다.
일반적으로 도킹 팬은 메인 프레임에 속하며, 메인 프레임에서 도킹 팬을 관리하고 동작을 제어합니다. 도킹 팬은 메인 프레임의 일부로서, 메인 프레임과 도킹 팬 사이의 상호작용이 원활하게 이루어질 수 있습니다.
한편, 대화상자 객체는 도킹 팬 내부에서 사용되는 컨트롤들을 포함하고 초기화하는 역할을 합니다. 대화상자는 도킹 팬 내에서 사용되는 UI 요소들을 구성하며, 대화상자 객체를 도킹 팬 클래스 내에서 정의하는 것은 구조적인 이유로 이루어집니다. 도킹 팬 클래스는 도킹 팬의 동작과 관리를 담당하고, 대화상자 클래스는 도킹 팬 내의 UI를 구성하는 역할을 합니다. 이렇게 구성함으로써 도킹 팬과 대화상자의 역할과 책임을 분리할 수 있습니다.
CWnd::GetDlgItem() 함수
- 대화상자에 있는 컨트롤의 ID를 사용하여 컨트롤의 포인터를 검색하는 함수
- CWnd* GetDlgItem(int nID) const;
- nID: 검색할 컨트롤의 정수형 식별자 혹은 컨트롤 ID
CComboBox::SetCurSel() 함수
- Combo Box의 목록 상자에서 아이템을 선택하는 함수
- Int SetCurSel(int nSelect)
- nSelect: 선택할 아이템의 인덱스(인덱스는 0부터 시작)
CListBox::SetSel() 함수
- 다중 선택 List Box의 아이템을 선택할 때 사용하는 함수
- Int SetSel(int nIndex, BOOL bSelect = TRUE)
- nIndex : 설정할 List Box의 아이템 index
- bSelect: 선택영역을 선정하는 방법을 지정 TRUE(1): 아이템이 선택, FALSE(0): 아이템이 선택되지 않음
'윈도우프로그래밍' 카테고리의 다른 글
[윈도우 프로그래밍 7장] 그래픽 객체의 사용 (0) | 2023.06.05 |
---|---|
[윈도우 프로그래밍 5장] 도큐먼트, 파일 입출력 (0) | 2023.06.05 |
[윈도우 프로그래밍] 대화상자 (0) | 2023.04.16 |
[윈도우 프로그래밍] 윈도우 프로그래밍의 이해 (0) | 2023.04.16 |
[윈도우 프로그래밍] MFC 개요 및 아키텍처 (0) | 2023.04.16 |