MFC 버전이 업그레이드 되면서, 예전 방법을 찾아서 프레임 배경에 이미지를 깔아보려고 했으나 구조가 변경되었는지 안먹네요. 지금 MSVS 2017로 작업 중 입니다...

아주 간단하게 작성해서 바로 써먹을 수 있는 예제를 하나 올립니다.


새로운 MFC 프로젝트를 생성합니다.


MDI 기본 구성으로 설정하고, Finish~


배경으로 사용할 이미지 입니다.


프로젝트 리소스에 이미지를 추가합니다. 이름은 IDB_BITMAP_BACK 으로 하였습니다.


CMainFrame 에 변수를 하나 선언합니다.

CBitmap m_bmp;


그리고, CMainFrame 의 OnCreate 에 코드를 한 줄 추가합니다. 

m_bmp.LoadBitmap(IDB_BITMAP_BACK);

CMainFrame 에 WM_PAINT 이벤트 핸들러를 추가하고, 아래와 같이 코드를 작성합니다.

void CMainFrame::OnPaint()
{
    CPaintDC dc(this);

    if (m_bmp.m_hObject)
    {
        BITMAP bm;
        CDC dcMem;

        CDC* pDC = m_wndClientArea.GetDC();
        VERIFY(m_bmp.GetObject(sizeof(bm), (LPVOID)&bm));

        dcMem.CreateCompatibleDC(pDC);
        CBitmap* pOldBMP = (CBitmap*)dcMem.SelectObject(&m_bmp);

        CRect rect;
        m_wndClientArea.GetClientRect(rect);

        pDC->FillSolidRect(rect, RGB(128, 128, 128));

        pDC->BitBlt((rect.right - bm.bmWidth) / 2,   // centered
            (rect.bottom - bm.bmHeight) / 2,
            bm.bmWidth,
            bm.bmHeight,
            &dcMem,
            0, 0,
            SRCCOPY);

        dcMem.SelectObject(pOldBMP);

        ::ReleaseDC(m_wndClientArea.m_hWnd, pDC->m_hDC);
    }
}


마지막으로 아래처럼 메인프레임 화면이 갱신될 때 MFC 내부에 정의된 배경을 관리하는 클라이언트도 함께 갱신하는 코드를 한 줄 넣어줍니다.

BOOL CMainFrame::PreTranslateMessage(MSG* pMsg)
{
    if (pMsg->message == WM_PAINT)
    {
        if (pMsg->hwnd == m_hWndMDIClient)
            Invalidate();
    }
    ...

    return CMDIFrameWndEx::PreTranslateMessage(pMsg);
}


이제 실행해 보시면, MDI 에서 차일드 창이 하나도 없는 상태일 때 아래 그림처럼 배경에 이미지가 깔립니다.











칼라다이알로그 박스는 꼭 확인 버튼을 눌러야 색상을 얻어올 수 있습니다.
이걸 색상을 변경할 때마다 다이알로그를 닫지 않고도, 색상을 얻어올 수 있도록
수정하여 보았읍니다.

첫번째 아래그림은 그냥 색상을 선택해 본거구요..

사용자 삽입 이미지



아래 그림은 창을 닫지 않은 상태에서 다른색상을 선택해 본것입니다.
사용자 삽입 이미지




+ Recent posts