이번에는 Button 컨트롤에 색상을 넣는 법을 알아봅니다.
Button의 경우에는 버튼이 속한 다이얼로그에서 "WM_DRAWITEM" 이라는 이벤트를 이용해서 Button을 손수 그려주어야합니다.
"WM_DRAWITEM"의 경우에는 다이얼로그의 각 컨트롤 객체가 그려질 때 호출되는 이벤트입니다.
먼저 이벤트를 만들기 전에 Button의 속성중에서 "Style - Owner Draw(동작 - 소유자 그리기)"를 true로 해주어야합니다.
WM_DRAWITEM 이벤트 생성 (다이얼로그)
WM_DRAWITEM 메시지를 추가하여 아래와 같이 작성합니다.
void CMFC노리터Dlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// 색을 변경할 버튼(IDC_BUTTON1)을 그릴차례에 우리가 직접 색을 변경해줌
if (nIDCtl == IDC_BUTTON1)
{
CDC dc;
dc.Attach(lpDrawItemStruct->hDC);
{
RECT rtBtn = lpDrawItemStruct->rcItem; // 버튼의 크기 가져옴
dc.Draw3dRect(&rtBtn, RGB(255, 255, 255), RGB(0, 0, 0)); // 버튼의 외곽선
dc.FillSolidRect(&rtBtn, RGB(62, 123, 87)); // 버튼의 색상 (단색)
UINT nState = lpDrawItemStruct->itemState; // 버튼의 현재 상태
// 버튼이 선택되었을 때
if ((nState & ODS_SELECTED))
{
dc.DrawEdge(&rtBtn, EDGE_ETCHED, BF_RECT);
}
else
{
dc.DrawEdge(&rtBtn, EDGE_BUMP, BF_RECT);
}
dc.SetBkColor(RGB(62, 123, 87)); // 글자의 배경색상
dc.SetTextColor(RGB(0, 0, 0)); // 글자의 색상
CString strText = _T("");
GetWindowText(strText); // 현재 버튼의 글자
// 버튼에 글자 넣기 (가로 정렬 : 가운데, 세로 정렬 : 가운데, 한 줄 쓰기)
dc.DrawText(strText, &rtBtn, DT_CENTER | DT_VCENTER | DT_SINGLELINE);
}
dc.Detach();
}
CDialogEx::OnDrawItem(nIDCtl, lpDrawItemStruct);
}
프로그램 실행
클릭 전과 후가 별로 차이가 없다고 느낀다면 "EDGE_ETCHED"를 "EDGE_RAISED"으로 변경하고
"EDGE_BUMP" 를 "EDGE_SUNKEN"로 변경하시면 더 눈에 띄지만 촌스럽게(?) 바뀝니다.
'Study > MFC' 카테고리의 다른 글
[MFC] Check Box 컨트롤 (체크 박스) (0) | 2022.09.03 |
---|---|
[MFC] Combo Box 컨트롤 (콤보 박스) (0) | 2022.03.05 |
[MFC] Button 컨트롤 (버튼 컨트롤) (0) | 2022.02.17 |
[MFC] Tab 컨트롤 (0) | 2022.02.05 |
[MFC, ATL]레지스트리 읽기, 쓰기 (CRegKey) (0) | 2021.07.23 |