owner-drawn 버튼 컨트롤을 만드는 과정이다.
1. 다이얼로그 프로젝트를 하나 만든다.
2. 다이얼로그위에 Button 컨트롤(IDC_BUTTON_COLOR)을 하나 올려놓는다.
3. 버튼 컨트롤의 속석중 "Styles" 탭의 속성중 Owner draw속성을 체크한다.
4. 클래스위저드에서 WM_DRAWITEM 메세지를 추가 후 OnDrawItem을 아래와 같이 수정한다.
void CBtncolorDlg::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Add your message handler code here and/or call default
if(nIDCtl == IDC_BUTTON_COLOR)
{
CDC dc;
RECT rect;
dc.Attach(lpDrawItemStruct->hDC);//버튼의 DC를 얻어서 CDC에게로..
rect = lpDrawItemStruct->rcItem;
dc.Draw3dRect(&rect, RGB(255, 255, 255), RGB(0, 0, 0));
dc.FillSolidRect(&rect, RGB(100, 100, 255));//버튼위에 나타날 색상을 정의
UINT state = lpDrawItemStruct->itemState;//현재 버튼의 상태
if(state & ODS_SELECTED)
{
dc.DrawEdge(&rect, EDGE_SUNKEN, BF_RECT);
}
else
{
dc.DrawEdge(&rect, EDGE_RAISED, BF_RECT);
}
dc.SetBkColor(RGB(100, 100, 255));//텍스트의 배경색
dc.SetTextColor(RGB(255, 0, 0));//텍스트 색
char buffer[MAX_PATH];//버튼의 제목 저장
ZeroMemory(buffer, MAX_PATH);
::GetWindowText(lpDrawItemStruct->hwndItem, buffer, MAX_PATH);//버튼의 제목을...
dc.DrawText(buffer, &rect, DT_CENTER | DT_VCENTER|DT_SINGLELINE);//버튼위에 제목을 다시 그리자.
dc.Detach();
}
CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
}
by Redef( http://www.redef.pe.kr )
댓글을 달아 주세요