본문 바로가기

3.구현/VC++

[MFC] 컨트롤 배경 투명하게 만들기

[MFC] 컨트롤 배경 투명하게 만들기

(Ospace 07.07.02) 박재성

*간단하게 설명하기 위해서 이미지와 소스는 생략했다.

배경에 일정한 색 혹은 이미지를 깔고 그 위에 컨트롤을 배치할 경우가 있다. 그러면 글자 배경색이나 Seek bar의 배경이 그대로 남아 있는 경우가 있다.
이럴 경우 컨트롤의 배경색을 투명하게 만들어보자.
MFC에서는 OnCtlColor이라는 핸들러를 제공한다.

OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
  • 첫번째 인자 : pDC
    • 이부부은 잘 알 것이다. CDC로 Device Contect이고, 이는 각 컨트롤의 색을 변경할 수 있게 한다.
  • 두번째 인자: pWnd
    • 이는 각 컨트롤의 인스탄스를 넘겨받는다. 이를 통해서 각 컨트롤을 식별하고, 원하는 컨트롤의 색을 변경할 수 있다.
  • 세번째 인자: nCtlColor
    • 이는 컨트롤 타입을 말하면 다음과 같은 값을 가진다.
  • CTLCOLOR_BTN Button control
  • CTLCOLOR_DLG Dialog box
  • CTLCOLOR_EDIT Edit control
  • CTLCOLOR_LISTBOX List-box control
  • CTLCOLOR_MSGBOX Message box
  • CTLCOLOR_SCROLLBAR Scroll-bar control
  • CTLCOLOR_STATIC Static control

OnCtrlColor핸들러를 추가했을 경우 기본으로 추가되는 코드는 다음과 같다.

HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
  HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
  // TODO:  Change any attributes of the DC here
  // TODO:  Return a different brush if the default is not desired
  return hbr;
}

여기서 첫번재 TODO 밑에 원하는 값 처리를 해주면 된다.

HBRUSH CTestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
  HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
  // TODO:  Change any attributes of the DC here
  switch (pWnd->GetDlgCtrlID()) {
    case IDC_STATIC_NAME:
    case IDC_SEEKBAR:
      pDC->SetBkMode(TRANSPARENT); // 해당 컨트롤 투명하게
      hbr = (HBRUSH)GetStockObject(NULL_BRUSH); // NULL브러쉬
      break;
  }
  // TODO:  Return a different brush if the default is not desired
  return hbr;
}

이렇게 하면 끝이다. 간혹 Group Box에 캡션인 경우 캡션을 투명하게 하면 배경에 테두리 선이 그대로 보인다. 이경우 브러쉬를 해당 배경 색등으로 다시 칠해주면 어느정도 보강이 된다.

  case IDC_GROUPBOX:
     pDC->SetBkMode(TRANSPARENT); // 해당 컨트롤 투명하게
     hbr = CreateSolidBrush(RGB(xxx,xxx,xxx));
     break;

일단 배경은 투명이고 캡션이 있는 부분 배경색만 해당 색으로 다시 칠해준다.

참조: MSDN

반응형