ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • MFC 에디트 컨트롤 배경 투명화하기
    개발/지름 2007. 12. 24. 17:47
    반응형

    에디트 컨트롤의 배경을 투명하게 만드는 건 쉬운일이 아니다..

    www.codeguru.com(이하 그루)이나 www.codeproject.com (이하 플젝)에 찾아보면..
    그나마 플젝 사이트에나 쓸만한거 하나 건질 수 있다.

    버뜨... 에디트 컨트롤 배경하나 투명하게 만들자고.. 클래스를 자꾸 추가하는건..
    전혀 입맞에 맞는일이 못된다.
    작업하다 보면 늘어나는 클래스에 골머리 뽀사지고, 이기능 넣느라 이 클래스 추가하고
    저 기능 넣느라 저거 추가하고.. ㅜㅜ

    그냥 다얄로그에 몇줄 추가해서 해결할 방법이 있을까? 당연히 있다.. ㅎㅎ
    좀 귀찬긴 하지만 원하는 기능을 만드는 즐거움을 어떤것에 비할까..

    이전의 샘플 sample2.zip 프로젝트를 조금 변화 시켜보았다.
    배경에 그림을 하나 깔고.. 에디트를 올려서 처리하는 것이다.
    result_2007_4_4_2_42_54_703_1.jpg


    이전의 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);
    }

    출처 : http://sakbals.tistory.com/19

    반응형

    댓글

Designed by Tistory.