본문 바로가기
프로그래밍/MFC

[MFC] Static Text Control (문자&배경색)

by 호군 2011. 1. 4.
반응형
링크 : http://blog.naver.com/halflove?Redirect=Log&logNo=40087432232




 WM_CTLCOLOR 메세지는 자식컨트롤을 그리려고 할 때 호출되는 윈도우메세지 입니다.
그래서 부모 클래스에서 WM_CTLCOLOR 메세지 발생 할 경우 자식컨트롤 중 Button, DialogBox, Edit, ListBox, MessageBox, ScrollBar, Static Control에 대해서 배경 및 글자색 등을 제어 할 수 있습니다.
 그러면 이 글의 본론인 Static Text 컨트롤의 배경색이나 글씨색을 바꿔봅시다. 먼저 리소스 뷰 탭에서 dialog를 띄운 후 메세지 탭에서 WM_CTLCOLOR 메세지에 대한 함수를 추가 합니다. 글로 설명이 부족하신 분은 아래의 붉은 박스를 참고해주세요.


함수를 추가하면, 아래의 OnCtlColor() 함수가 추가됩니다.(함수이름은 WM_CTLCOLOR 메세지의 함수를 추가 하실 때 결정하신 이름입니다)
HBRUSH CtestDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)

{

        HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

 

        // TODO:  여기서DC의특성을변경합니다.

 

        // TODO:  기본값이적당하지않으면다른브러시를반환합니다.

        return hbr;

} 


두 주석 사이에 아래 코드를 삽입한다.

CRect rect;

UINT nID = pWnd->GetDlgCtrlID();

if(nCtlColor == CTLCOLOR_STATIC)

{    

        if(nID == /*Static Text Control ID*/)

        {

               //pDC->SetBkMode(TRANSPARENT);      // 배경투명

               //pDC->SetTextColor(RGB(0, 0, 0));  // 글자 색
               //pDC->SetBkColor(RGB(0, 128, 0));  // 배경 색

               return (HBRUSH)::GetStockObject(NULL_BRUSH);

        }

}


반환하는 HBRUSH를 WHITE_BRUSH로 준다면 하얀색 배경이 그려지게 됩니다. SetBkMode()를 주석을 풀어주고, NULL_BRUSH의 HBRUSH를 반환 해준다면 투명한 컨트롤을 만들 수 있습니다. 위의 예제를 참고한다면 충분히 원하는 동작을 할 수 있을 것이라고 생각이 드네요.
 저는 WinCE에서 MFC를 사용하였습니다. 제가 사용했을 때는 SetBKColor()는 배경색을 설정하고, 반환하는 HBRUSH는 처음 Painting 될 때의 색상을 결정하였습니다.

추가적으로 글씨의 크기와 글씨체를 변경 하는 소스코드도 알아보겠습니다. GetFont() 함수로 CFont 객체를 만들어서 사용하였습니다.

void CTestDlg::InitStaticText()
{
        CFont* pFont;
        LONG lfWidth = 50, lfHeight = 200, lfWeight = FW_BOLD;

        pFont = GetFont(lfWidth, lfHeight, lfWeight);
        GetDlgItem(IDC_STATIC)->SetFont(pFont);

        pFont->Detach();
        delete pFont;    

}

CFont* CTestDlg::GetFont(LONG lfWidth, LONG lfHeight, LONG lfWeight)
{
        CFont* pFont;
        LOGFONT logFont;

       
font = new CFont();
        memset(&logFont, 0, sizeof(LOGFONT));
        logFont.lfWidth = lfWidth;
        logFont.lfHeight = lfHeight;
        logFont.lfWeight = lfWeight;
        _tcscpy( logFont.lfFaceName, _T("사용자글자") );
        pFont->CreateFontIndirectW(&logFont);

        return pFont;       
}


GetFont()함수는 CFont객체를 만들기 위한 함수 입니다. 글씨의 가로, 세로, 글씨체 정보를 이용하여 만들어지게 됩니다. 그리고 GetDlgItem() 함수로 리소스ID로 컨트롤의 포인터를 얻어와서 컨트롤의 Font를 설정 합니다.
그리고 Detach() 함수를 사용하여 분리 시킵니다.(이 부분은 정확히 모르겠네요... 아시는 분은 설명좀..)
그리고 new로 생성한 Font 객체를 해제 합니다.
 
이렇게 하여 컨트롤에 관한 글씨와 배경을 설정 할 수 있을 듯합니다. 도움이 되셨기를..

반응형