【求助】关于主窗口重绘的问题

okaimee 2010-08-18 08:51:50
我的程序很简单,在子窗口中打开一幅图像并居中显示。
问题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;
}

拜托各位前辈了
...全文
162 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
wltg2001 2010-08-18
  • 打赏
  • 举报
回复
对你的贴出来的代码没有看得太明白,
if(!pDoc->m_pDib->IsEmpty())
pDoc->m_pDib->Display(pMemDC, rectClient, rectClient);
这个是干什么啊?
我看下面也有显示代码,这里面也有显示代码,你的图像到底显示在什么地方啊?
okaimee 2010-08-18
  • 打赏
  • 举报
回复
应该在哪里响应WM_SIZE消息?这么处理两个问题都解决了吗?能讲得详细点吗?我是菜鸟。或者给篇参考文章也行,多谢多谢
xxd_qd 2010-08-18
  • 打赏
  • 举报
回复
在WM_SIZE的消息响应里放一句Invalidate()
xxd_qd 2010-08-18
  • 打赏
  • 举报
回复
响应WM_SIZE消息。
wltg2001 2010-08-18
  • 打赏
  • 举报
回复
你直接处理WM_SIZE消息吧,在这里面处理
Q446512799 2010-08-18
  • 打赏
  • 举报
回复
WM_SIZE是一个消息处理函数,右键点击类,选择ADD WINDOWS MESSAGE HANDLE
添加WM_SIZE,在函数里面Invalidate();
向立天 2010-08-18
  • 打赏
  • 举报
回复
通过消息映射向导就可以添加WM_SIZE
这是系统消息
okaimee 2010-08-18
  • 打赏
  • 举报
回复
Display是CDib类对象的显示函数,下面贴的代码就是这个方法的具体实现代码。图像文件是读取到了doc里,然后在view里显示,就是最常用的显示方法。

15,980

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧