본문 바로가기
개발/mfc

mfc, button 글자,바닦에 빛깔 입히기 색 변경

by 즐기며 2023. 12. 19.

빛깔 색 변경 관련 글 입니다.

 

 Static Text 글자,바닦에 빛깔 입히기                      https://bahk33.tistory.com/235 

 button 글자,바닦에 빛깔 입히기  색 변경      본글  https://bahk33.tistory.com/87

 

---------------------------

1. 버튼의 빛깔을 바꿀 수 있게 허용

1)   버튼 속성 의 Owner DrawTrue 로 합니다.

먼저 이벤트를 만들기 전에 Button의 속성중에서 "Style - Owner Draw(동작 - 소유자 그리기)"를 true로 해주어야합니다.

 

 

 

2. ~.h 에 추가 할거

1) 처리 함수 (OnDrawItem) 를 정의 합니다.

public:
afx_msg void OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct);

 

 

 

3.~.cpp 에 추가 할거

1) Draw Message 를 처리 하겠다고 ON_WM_DRAWITEM 추가

// Draw Message 를 처리 하겠다고 정의
BEGIN_MESSAGE_MAP(CDLG_Task, CDialog)
// 생략
// ON_WM_CTLCOLOR()
ON_WM_DRAWITEM() // OnDrawItem() 에 필요
// 생략
END_MESSAGE_MAP()

 

 

2) 처리 함수(OnDrawItem) 추가

함수는 3 단계 입니다

> 빛깔을 바꾸는 조건 설정

> 바닥 빛깔 바꾸기

> 글자 빛깔 바꾸기

///////////////////////////////////////////////////////////////
// Button Color  처리 함수
void CDlg_Set::OnDrawItem(int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct) {
  int m;
  
  // 빛깔을 바꾸는 조건,  m= 0: 일반, 1: 바꾸는 상황 
  switch (nIDCtl) {
  case IDC_task_BUT_Out1:
    m = (m_pDlg -> m_useOut & 1) != (m_pDlg -> m_useOut_Old & 1);
    break;
  case IDC_task_BUT_Out2:
    m = (m_pDlg -> m_useOut & 2) != (m_pDlg -> m_useOut_Old & 2);
    break;
  case IDC_task_BUT_Out3:
    m = (m_pDlg -> m_useOut & 4) != (m_pDlg -> m_useOut_Old & 4);
    break;
  case IDC_task_BUT_Out4:
    m = (m_pDlg -> m_useOut & 8) != (m_pDlg -> m_useOut_Old & 8);
    break;
  }

// 바닥 빛깔 바꾼다.
  switch (nIDCtl) {
  case IDC_task_BUT_Out1:
  case IDC_task_BUT_Out2:
  case IDC_task_BUT_Out3:
  case IDC_task_BUT_Out4:
    CDC dc;
    RECT rect;

    dc.Attach(lpDrawItemStruct -> hDC); //Get the Button DC to CDC
    rect = lpDrawItemStruct -> rcItem; //Store the Button rect to local rect

    if (m) {
      dc.Draw3dRect( & rect, RGB(200, 200, 200), RGB(20, 20, 20));
      dc.FillSolidRect( & rect, RGB(255, 255, 0)); // 바닥 빛깔
    } else {
      dc.Draw3dRect( & rect, RGB(200, 200, 200), RGB(20, 20, 20));
      dc.FillSolidRect( & rect, RGB(255, 255, 255));
    }

    //Show the Effect of Click Event
    UINT state = lpDrawItemStruct -> itemState;
    if ((state & ODS_SELECTED)) {
      dc.DrawEdge( & rect, EDGE_SUNKEN, BF_RECT);
    } else {
      dc.DrawEdge( & rect, EDGE_RAISED, BF_RECT);
    }
    
    
//글자 빛깔 바꾸기, Draw Color Text
    if (m) {
      dc.SetBkMode(TRANSPARENT); //  dc.SetBkColor(RGB(255,255,0)); //Setting the Text Background Color
      dc.SetTextColor(RGB(255, 0, 0)); //Setting the Text Color, 글자 빛깔
    } else {
      dc.SetBkMode(TRANSPARENT); //  dc.SetBkColor(RGB(255,255,0)); //Setting the Text Background Color
      dc.SetTextColor(RGB(0, 0, 0)); //Setting the Text Color
    }

    TCHAR 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(); //Detach the Button DC  break;
  }

  CDialog::OnDrawItem(nIDCtl, lpDrawItemStruct);
}

 

 

수고 하셨읍니다.