我的程序很简单,在子窗口中打开一幅图像并居中显示。
问题1:现在的现象是,图像可以正确打开并居中显示,子窗口默认是最大化的,当点击还原子窗口时,图像也能随之居中。但是,当通过拖拽窗口边框改变窗口大小时,图像可以重绘,但图像不能随之居中显示。
问题2:如果我点击框架主窗口的还原窗口时,子窗口的大小可以随之改变,但是子窗口中的图像不能重绘,拖动主窗口的边框来改变窗口大小时,子窗口中的图像也不能重绘。
求助:这是哪里的问题呀?
部分代码如下:
OnDraw方法代码:void Cdicomtest1View::OnDraw(CDC* pDC)
{
Cdicomtest1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CRect rectClient;//客户端矩形
    CBitmap bitmapTemp,*pOldBitmap;//定义位图对象
    CDC* pMemDC=new CDC;//后备缓冲区    GetClientRect(rectClient);
//建立一个与屏幕显示兼容的位图,至于位图的大小嘛,可以用窗口的大小
    bitmapTemp.CreateCompatibleBitmap(pDC, rectClient.Width(), rectClient.Height());
//建立与屏幕显示兼容的后备缓冲区
    pMemDC->CreateCompatibleDC(pDC); 
//将位图选入到后备缓冲区中 
//只有选入了位图的内存显示设备才有地方绘图,画到指定的位图上 
    pOldBitmap=pMemDC->SelectObject(&bitmapTemp);
//先用背景色将位图清除干净,这里我用的是黑作为背景,你也可以用自己应该用的颜色
    pMemDC->FillSolidRect(&rectClient, RGB(0,0,0));
//绘图
    if(!pDoc->m_pDib->IsEmpty())
        pDoc->m_pDib->Display(pMemDC, rectClient, rectClient);
    else
        pMemDC->TextOutA(50, 50, (CString)"pDoc Empty error");    //将内存中的图拷贝到屏幕上进行显示
pDC->BitBlt(0, 0, rectClient.Width(), rectClient.Height(), pMemDC, 0, 0, SRCCOPY);    pMemDC->SelectObject(pOldBitmap);
    ReleaseDC(pMemDC);
    delete    pMemDC;
}
m_pDib->Display方法代码:BOOL CDib::Display(CDC* pDC, CRect rcDest, CRect rcSrc, DWORD dwRop)
{
CDC MemDC;
MemDC.CreateCompatibleDC(pDC);
CRect win1;
AfxGetMainWnd()->GetActiveWindow()->GetClientRect(&win1);
int rcDestX=rcDest.Width()/2-GetWidth()/2;
int reDestY=rcDest.Height()/2-GetHeight()/2; CBitmap* pOldBmp = MemDC.SelectObject(m_pBitmap); CPalette* pOldPal = pDC->SelectPalette(m_pPalette, TRUE);
    pDC->RealizePalette(); BOOL bSuccess = pDC->StretchBlt(rcDestX, reDestY, 
rcDest.Width(), rcDest.Height(),
 &MemDC, 
rcSrc.left, rcSrc.top, 
rcSrc.Width(), rcSrc.Height(),
dwRop); MemDC.SelectObject(pOldBmp);
pDC->SelectPalette(pOldPal, TRUE); return bSuccess;
}拜托各位前辈了

解决方案 »

  1.   

    在WM_SIZE的消息响应里放一句Invalidate()
      

  2.   

    应该在哪里响应WM_SIZE消息?这么处理两个问题都解决了吗?能讲得详细点吗?我是菜鸟。或者给篇参考文章也行,多谢多谢
      

  3.   

    对你的贴出来的代码没有看得太明白,
    if(!pDoc->m_pDib->IsEmpty())
            pDoc->m_pDib->Display(pMemDC, rectClient, rectClient);
    这个是干什么啊?
    我看下面也有显示代码,这里面也有显示代码,你的图像到底显示在什么地方啊?
      

  4.   

    Display是CDib类对象的显示函数,下面贴的代码就是这个方法的具体实现代码。图像文件是读取到了doc里,然后在view里显示,就是最常用的显示方法。
      

  5.   

    通过消息映射向导就可以添加WM_SIZE
    这是系统消息
      

  6.   

    WM_SIZE是一个消息处理函数,右键点击类,选择ADD WINDOWS MESSAGE HANDLE
    添加WM_SIZE,在函数里面Invalidate();
      

  7.   

    你直接处理WM_SIZE消息吧,在这里面处理