MFC 다중 문서 응용 프로그램 (리본 스타일)으로 작업하는 Visual Studio 2015를 사용합니다. CView에 png 이미지를 추가하고 WM_TIMER를 사용하여 슬라이드 쇼를 만들려고합니다. 처음에는 같은 목적으로 대화 상자 기반 응용 프로그램을 만들었지 만 완벽하게 작동합니다. 이러한 응용 프로그램의 차이점은 도구 상자를 추가하여 PictureControl (CStatic)의 대화 상자 창에서 이미지가 첫 번째 응용 프로그램에 그려지는 것입니다. 그리고 두 번째 응용 프로그램에서 똑같은 방식으로 CView의 CStatic에 이미지를 추가하려고합니다. 그러나 CView를 사용하면 올바르게 다시 그려지지 않습니다. 창 크기를 변경 (늘림, 최대화) 할 때만 png 이미지가 변경되지만 크기 조정 창을 멈 추면 이미지가 다시 고정됩니다.Visual C++ CPaintDC, CDC로 CView에서 이미지를 다시 그리는 방법
CStatic 컨트롤 만들기. 타이머 OnSize()
void CCardioAppView::OnTimer(UINT_PTR nIDEvent)
{
if (ShowImageTimer == nIDEvent)
{
auto bmp_iter = theApp.FullBmpMap.begin();
int sz = theApp.FullBmpMap.size();
CRect ImageRect;
GetClientRect(&ImageRect);
if (m_iCurrentImage < sz)
{
m_iCurrentImage++;
InvalidateRect(ImageRect, false);
}
else
{
m_iCurrentImage = 1;
}
}
CView::OnTimer(nIDEvent);
}
void CCardioAppView::OnSize(UINT nType, int cx, int cy)
{
CView::OnSize(nType, cx, cy);
CRect rect;
if (m_ctrlImage.GetSafeHwnd())
{
GetClientRect(rect);
m_ctrlImage.DestroyWindow();
BOOL b = m_ctrlImage.Create(_T(""), WS_CHILD | WS_VISIBLE, rect, this, 2);
m_ctrlImage.ModifyStyle(0, SS_BITMAP);
}
}
OnPaint를 다시 그리기()에 의해
void CCardioAppView::OnInitialUpdate()
{
CView::OnInitialUpdate();
CRect rect;
GetClientRect(rect);
BOOL b = m_ctrlImage.Create(_T(""), WS_CHILD | WS_VISIBLE, rect,this,2);
m_ctrlImage.ModifyStyle(0, SS_BITMAP, SWP_NOSIZE);
}
다시 그리기는
void CCardioAppView::OnPaint()
{
CPaintDC view_dc(this); // device context for painting
CBitmap bmp;
CRect rect, scaleRect;
BITMAP b;
auto bmp_iter = theApp.FullBmpMap.find(m_iCurrentImage);
GetClientRect(&rect);
if (bmp_iter == theApp.FullBmpMap.end()) return;
bmp.Attach((*bmp_iter).second);
bmp.GetObject(sizeof(BITMAP), &b);
CPaintDC dc(&m_ctrlImage);
CDC memdc;
memdc.CreateCompatibleDC(&dc);
memdc.SelectObject(&bmp);
if (rect.Height() <= b.bmHeight) //scaling image
{
scaleRect = rect;
scaleRect.right = rect.left + ((b.bmWidth*rect.Height())/ b.bmHeight);
}
dc.FillSolidRect(rect, RGB(255, 255, 255));
dc.StretchBlt(0, 0, scaleRect.Width(), scaleRect.Height(), &memdc,
0, 0, b.bmWidth, b.bmHeight, SRCCOPY);
//dc.MoveTo(0, 0);
(*bmp_iter).second.Detach();
(*bmp_iter).second.Attach(bmp);
bmp.Detach();
}
OnPaint를 올바르게 타이머에 의해 호출된다. 기본 창 크기를 조정했을 때만 이미지가 표시되는 이유는 무엇입니까?
'ON_WM_ERASEBKGND()'와 핸들러'OnEraseBkgnd (CDC * pDC) '로 몇 가지 시도해 보시기 바랍니다. 디폴트의 친 클래스 구현과 반대의 값을 돌려주는 것이 있습니다. – sergiol
덧붙여서, 왜 모든 크기 변경시'm_ctrlImage'를 파괴하고 다시 만드나요? 단순히 크기를 조정하지 않는 것이 좋습니다 ([CWnd :: SetWindowPos] (https://msdn.microsoft.com/en-us/library/a1yzfz6d.aspx))? – IInspectable