我的程序很简单,在子窗口中打开一幅图像并居中显示。
问题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:现在的现象是,图像可以正确打开并居中显示,子窗口默认是最大化的,当点击还原子窗口时,图像也能随之居中。但是,当通过拖拽窗口边框改变窗口大小时,图像可以重绘,但图像不能随之居中显示。
问题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;
}拜托各位前辈了
if(!pDoc->m_pDib->IsEmpty())
pDoc->m_pDib->Display(pMemDC, rectClient, rectClient);
这个是干什么啊?
我看下面也有显示代码,这里面也有显示代码,你的图像到底显示在什么地方啊?
这是系统消息
添加WM_SIZE,在函数里面Invalidate();