본문 바로가기
개발/C++,MFC

[MFC, C++] 텍스트를 투명 + 겹치지 않게 메소드

by 언제나초심. 2012. 10. 10.
반응형


텍스트를 투명하게 하는 건 아래와 같습니다.


HBRUSH CDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);
    UINT nID = pWnd->GetDlgCtrlID();

    //글자를 투명하게 만들기 위해서.
    switch(nCtlColor) {
        case CTLCOLOR_STATIC:
        {
            if(nID == IDC_STATIC) {
                pDC->SetTextColor(RGB(0, 0, 0));
                pDC->SetBkColor(RGB(255, 255, 255));
                pDC->SetBkMode(TRANSPARENT);
                return (HBRUSH)GetStockObject(NULL_BRUSH);
            }
        }
    }
    return hbr;
}



그런데 이러면 글자가 겹치니까 아래와 같은 메서드를 만들어줍니다.


void CDlg::SS_InvalidTextUpdate(UINT Id){
    CRect useRect;
    GetDlgItem(Id)->GetWindowRect(useRect);
    ScreenToClient(&useRect);
    InvalidateRect(useRect);
}



그리고 실제 사용하는 부분에서는 


SS_InvalidTextUpdate(IDC_STATIC);
m_static.SetWindowText("string"); 

이런식으로 글자 바꾸기 전에 호출을 해줍니다.




설명을 하자면,


글씨가 자꾸 겹치기 때문에, 글씨를 쓰기 전에 그 영역 부분의 크기를 가져와서, InvalidateRect 시킨 것입니다. 



대충 자세히는 몰라도, Paint 부분이 동작하는 걸로 봐서, 말그대로 그 영역만 새로고침 시키는 개념이 되는 것 같으므로,


전체를 invalid 시키면 너무 반짝반짝거릴 것이기 때문에, 해당 영역부분만 쉬리릭 새로고침 하는 것입니다. 


더 테스트를 해봐야 할 것 같지만, 잘 동작하는 것으로 보이네요.

반응형