[MFC] 툴바 구현하기 - Step2
작업 내용.
1. 툴바에 표시된 버튼 영역을 마우스로 클릭했을 때 버튼이 눌러진 효과를 그리는 기능을 추가.
2. 마우스를 클릭한 상태로 버튼 영역을 벗어나면 버튼 클릭이 취소되는 효과도 함께 구현.
3. 툴바의 버튼을 눌렀다가 해제하면 대화 상자로 WM_COMMAND 메시지를 전송하여 대화 상자에서 툴바 버튼 메시지를 사용.
step 1)
클래스 마법사에 마우스 이벤트를 체크 할 OnMouseMove메시지를 추가 합니다.
이 함수는 아래와 같은 조건을 처리 합니다.
(1) 마우스가 클릭이 안된 상태
(2) 마우스가 클릭된 상태
a. 마우스가 버튼 영역내에 있는 경우
b. 버튼 영역 밖에 있다가 영역으로 들어온 경우
c. 마우스가 버튼 영역 밖에 있는 경우
d. 버튼 안에 있다가 버튼 밖으로 나온 경우
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
void WJ_ToolBar::OnMouseMove(UINT nFlags, CPoint point)
{
if (!m_clicked_flag) { // 마우스가 클릭이 안된 상태
CheckButtonInToolBar(point); // 버튼의 위치만 표시한다.
}
else { // 마우스가 클릭된 상태
if (m_select_rect.PtInRect(point)) { // 마우스가 버튼 영역내에 있는 경우!
if (m_clicked_flag == 2) { // 버튼 영역 밖에 있다가 영역으로 들어온 경우!
m_clicked_flag = 1; // 버튼 내부에 있음을 설정
DrawPushButton(m_btn_list + m_select_index); // 버튼을 눌러진 상태로 그린다.
}
}
else { // 마우스가 버튼 영역 밖에 있는 경우
if (m_clicked_flag == 1) { // 버튼 안에 있다가 버튼 밖으로 나온 경우!
m_clicked_flag = 2; // 마우스가 버튼 외부에 있음을 설정
DrawPopButton(m_btn_list + m_select_index); // 버튼을 기본 형태로 다시 그림
}
}
}
CWnd::OnMouseMove(nFlags, point);
}
|
cs |
step 2)
버튼이나 메뉴 버튼 같은 곳에서 작업을 하면 wm_command 메시지가 발생합니다. 그래서 On_command()함수를 사용해서 작업할 겁니다.
버튼 클릭시 부모Dlg에 wm_command 메시지를 보내기 위해서 아래 코드를 추가합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
void WJ_ToolBar::OnLButtonUp(UINT nFlags, CPoint point)
{
if (m_clicked_flag) { // 마우스가 클릭된 상태라면 처리한다.
m_clicked_flag = 0; // 마우스 클릭이 해제되었다고 설정
ReleaseCapture(); // SetCapture 상태를 해제한다.
ToolBar_CommandData *p_btn = m_btn_list + m_select_index; // 선택된 버튼의 정보
DrawPopButton(p_btn); // 버튼이 눌러졌던 형태를 기존 형태로 복구한다.
if (m_select_rect.PtInRect(point)) { // 버튼 영역 내에서 마우스가 해제된 경우!
// 부모 윈도우로 이 버튼이 눌러졌음을 WM_COMMAND 메시지로 알린다.
GetParent()->PostMessage(WM_COMMAND, MAKEWPARAM(p_btn->command_id, 0), 0);
// GetParent()함수 대신 SendMessage()함수를 이용해도 됨.
// SendMessage()함수는 보내고 기다린다면 PostMessage()함수는 보내기만 한다.
}
}
CWnd::OnLButtonUp(nFlags, point);
}
//-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|
cs |
그리고 발생된 메시지를 부모가 받기 위한 방법이 몇가지 있습니다.
이 중에 하나 택해서 사용하시면 됩니다.
클래스 마법사에서 가상함수에 OnCommand 가상 함수를 추가합니다.


1) Dlg.cpp에 메시지 맵에 그림1번과 같이 메시지를 등록
2) Dlg.cpp에 그림2번과 같이 함수 추가
3) Dlg.h에 그림3번과 같이 함수 원형 추가
실행 결과
궁금한 내용이 있으시다면 댓글이나 아래 링크(카톡 1:1 오픈체팅방입니다.)를 통해 물어보셔도 됩니다.
https://open.kakao.com/o/sEEyABod