2014년 10월 26일 일요일

에디트 컨트롤 배경을 투명하게

알립니다. 이 글은 '데브피아 강좌&팁' 게시판에 올라온 글로, 본 글의 저작권은 글의 작성자인 권진호님에게 있습니다.

이전의 IDC_EDIT9 에디트가 글자가 빨강 색으로 나오는걸 타겟으로 잡았다.

다아일로그에서 클래스 위저드를 띄운 후..
1. PreTranslateMessage 이벤트 핸들러를 추가한다.
2. Object IDs: IDC_EDIT9를 선택하고 EN_CHANGE 이벤트 핸들러를 추가한다.

그리고 코드를 다음과 같이 수정한다.

HBRUSH CSssDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
   
    switch(nCtlColor)
    {
    case CTLCOLOR_EDIT:
        {
            if(pWnd->GetDlgCtrlID() == IDC_EDIT9)
            {
                pDC->SetTextColor(RGB(255, 0, 0));
                pDC->SetBkMode(TRANSPARENT);
                pDC->SelectStockObject(NULL_BRUSH);
                return NULL;
            }
       }
    }
   
    // TODO: Return a different brush if the default is not desired
    return hbr;
}
BOOL CSssDlg::PreTranslateMessage(MSG* pMsg)
{
    if(::GetDlgCtrlID(pMsg->hwnd) == IDC_EDIT9)
    {
        // 에디트 컨트롤 IDC_EDIT9 번의 이벤트 중에서 아래 이벤트가 발생하면
        // 에디트 컨트롤 영역만큼 부모 윈도우의 화면을 갱신한다.
        switch(pMsg->message)
        {
        case WM_LBUTTONDOWN:
        case WM_LBUTTONUP:
        case WM_KILLFOCUS:
            {
                CRect rc;
                CWnd* pWnd = GetDlgItem(IDC_EDIT9);
                pWnd->GetWindowRect(rc);
                ScreenToClient(rc);
                InvalidateRect(rc);
            }
        }
    }
   
    return CDialog::PreTranslateMessage(pMsg);
}

// 이 것을 PreTranslateMessage 에서 처리하지 못하는 이유는
// 이벤트를 잡을 수 없기 때문이다.
// 이 전체 기능을 CEdit서브클래싱하여 구현하여 놓은 것이 플젝사이트의 샘플이라고 봐도 무방하다.
void CSssDlg::OnChangeEdit9()
{
    // 에디트 컨트롤에서 글자에 변화가 생기면.
    // 에디트 컨트롤 영역만큼 부모 윈도우의 화면을 갱신한다.
    CRect rc;
    CWnd* pWnd = GetDlgItem(IDC_EDIT9);
    pWnd->GetWindowRect(rc);
    ScreenToClient(rc);
    InvalidateRect(rc);
}


이것도 매우 잘됩니다. 클래스 추가하는 것보다 이게 훨 나은거 같아 보여서 이렇게 올립니다.

댓글 없음: