[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
반응형
'3.구현 > VC++' 카테고리의 다른 글
[MFC]Resizing Dialog (0) | 2012.08.14 |
---|---|
[MFC]CInternetConnection 등 사용 코드들 (0) | 2012.08.14 |
[MFC] 여기저기 긁어모은 코드들 (0) | 2012.08.14 |
[MFC] MainFrame/Document/VIew 프레임워크간 상호참조 (0) | 2012.08.14 |
[MFC] EasySize.h 매크로 풀어논 것 (0) | 2012.08.14 |