sw2007/02/13 11:22

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 )

Posted by redef
TAG ,

댓글을 달아 주세요