보통 텍스트를 쓸때, 배경 색과 텍스트의 배경색이 틀려지면,
이상하게 글자 주변에만 기묘한 색이 되어 배경색과 따로 논다.
즉 글자만 색이 달라야 하는데, 글자를 기준으로 글자 크기만한
사각형이 다른 색이라면 정마리지 보기 싫어지게 된다.

그래서 이를 방지하기 위해 SetBkMode라는 메소드를 이용해,
SetBkMode(TRANSPARENT)  를 호출한다.

그러나 이것을 OnCtrlColor에서 사용하면 기묘한 결과를 얻어 낸다.


HBRUSH CTextCtrl::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
        HBRUSH hbr = CWnd::OnCtlColor(pDC, pWnd, nCtlColor);
        if(pWnd == m_pEdit) {
                pDC->SetBkMode(TRANSPARENT);
                pDC->SetTextColor(m_fontColor);
                return (HBRUSH)m_brush;
        }
        return hbr;
}

위의 내용이 바로 그 내용인데, 이렇게 해도 일단은 원하는 기능은 얻기는 한다.
그러나 문제가 있다. 스크롤이 되거나 새로운 글자가 입력될때, 이전 글자가 지워지지 않고
계속 겹쳐져 그려지는 문제이다. 이는 위의 Mode가 TRANSPARENT 여서 계속 겹쳐져서
그려지는 것 같다.

이를....
pDC->SetBkMode(TRANSPARENT);
    ->
pDC->SetBkColor(m_backColor);

로 변경해 준다.
이렇게 하면 비록 투명은 아니지만 그와 같은 효과를 얻게 된다. 더욱이 이전에 발생한 문제가
해결된다.

이 문제는 글자를 새롭게 입력을 받는 에디트 컨트롤을 child로 잡게 된 경우에 발생하는 문제다.

728x90
  1. 감사합니다 2014.10.22 09:09

    ㅜㅜㅜㅜㅜ덕분에 살았어요!! 제가 찾던 팁이에요ㅠㅠ

    • Favicon of https://www.hind.pe.kr 하인도 2014.10.23 17:28 신고

      예전에 적은 글인데, 글 내용 중에, m_backColor 부분에서 부끄러움 한가득.... 네, 배경색을 저장하기 위한 멤버 변수인데, 특별한 언급 없이 그냥 적어놨네요.
      다행히 제 의도하는 바를 이해해주신 것 같아, 마음 한켠에는 다행이라고 생각은 들지만, 아차 싶었습니다 ^^;;

  2. 지나가던 2022.02.25 21:02

    계속 곂쳐져 그려지는 문제는 윈도우의 WM_COMMAND메시지로 에디트박스관련 동작을 감지해서 InvalidateRect(에디트박스의 HWND, NULL, TRUE); 로 화면을 갱신시켜주면 해결이 되었습니다. 다만 ES_MULTILINE 속성이 없는 에디트박스는 그냥 애초에 그런 문제가 없고 ES_MULTILINE 속성이 있는 에디트박스만 그러네요. 왜그런 것인지.. 화면을 그리는 방식이 달라서일까요? 비록 20여년이 지난 글이지만 혹시 참고가 되실까 하여 댓글을 남깁니다.

+ Recent posts