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 에서 차일드 창이 하나도 없는 상태일 때 아래 그림처럼 배경에 이미지가 깔립니다.