MFC窗口中显示的图片在改变窗口的大小或者拉动滚动条时不见了,请问怎样改变窗口大小时,显示的图片不消失
最近我在做一个图像处理小程序,用VC++(VS2005版)MFC编程,调用不同的函数处理图片。由于处理的过程比较多,在改变窗口的大小时(最大化或者拉动滚动条),窗口的图片...
最近我在做一个图像处理小程序,用VC++ (VS2005版)MFC编程,调用不同的函数处理图片。由于处理的过程比较多,在改变窗口的大小时(最大化或者拉动滚动条),窗口的图片消失了,请问怎样在改变窗口的大小后,对窗口进行重绘啊
麻烦能不能具体点呢,具体的WN_SIZE消息响应函数怎样处理?窗口中有多个图片,窗口显示不完的图片部分,就不能显示,拉动滚动条也不能看见。 展开
麻烦能不能具体点呢,具体的WN_SIZE消息响应函数怎样处理?窗口中有多个图片,窗口显示不完的图片部分,就不能显示,拉动滚动条也不能看见。 展开
5个回答
展开全部
如果是改变大小,那就WM_SIZE消息 在OnSize里面处理
拉动滚动条 就需要坐标转换
拉动滚动条 就需要坐标转换
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
void CADDigitView::OnSize(UINT nType, int cx, int cy)
{
CScrollView::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
if(m_pOldBmp != NULL)
{
m_DCMem.SelectObject(m_pOldBmp);
m_bmpMem.DeleteObject();
}
void CADDigitView::OnDraw(CDC* pDC)
{
CRect rcClient;
GetClientRect(rcClient);
if(m_DCMem.m_hDC == NULL)
{
m_DCMem.CreateCompatibleDC(pDC);
m_DCMem.SetTextColor(m_clrTxt);
m_DCMem.SetBkMode(TRANSPARENT);
}
if(m_bmpMem.m_hObject == NULL)
{
m_bmpMem.CreateCompatibleBitmap(pDC, rcClient.Width(), rcClient.Height());
m_pOldBmp = m_DCMem.SelectObject(&m_bmpMem);
}
if (NULL != m_pThPara)
{
this->ShowDigit(&m_DCMem);
}
pDC->DPtoLP(&rcClient);
pDC->BitBlt(rcClient.left, rcClient.top,
rcClient.Width(), rcClient.Height(),
&m_DCMem, 0, 0, SRCCOPY);
}
}
其中m_DCMem,m_bmpMem及m_pBmpMem在类的中定义为CDC, CBitmap及CBitmap*。改OnDraw及OnSize函数如上即可。
{
CScrollView::OnSize(nType, cx, cy);
// TODO: 在此处添加消息处理程序代码
if(m_pOldBmp != NULL)
{
m_DCMem.SelectObject(m_pOldBmp);
m_bmpMem.DeleteObject();
}
void CADDigitView::OnDraw(CDC* pDC)
{
CRect rcClient;
GetClientRect(rcClient);
if(m_DCMem.m_hDC == NULL)
{
m_DCMem.CreateCompatibleDC(pDC);
m_DCMem.SetTextColor(m_clrTxt);
m_DCMem.SetBkMode(TRANSPARENT);
}
if(m_bmpMem.m_hObject == NULL)
{
m_bmpMem.CreateCompatibleBitmap(pDC, rcClient.Width(), rcClient.Height());
m_pOldBmp = m_DCMem.SelectObject(&m_bmpMem);
}
if (NULL != m_pThPara)
{
this->ShowDigit(&m_DCMem);
}
pDC->DPtoLP(&rcClient);
pDC->BitBlt(rcClient.left, rcClient.top,
rcClient.Width(), rcClient.Height(),
&m_DCMem, 0, 0, SRCCOPY);
}
}
其中m_DCMem,m_bmpMem及m_pBmpMem在类的中定义为CDC, CBitmap及CBitmap*。改OnDraw及OnSize函数如上即可。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
绘图任务一般都放到WM_PAINT消息中
MFC中的OnPaint消息处理函数中
在WM_SIZE消息中或OnSize中保存改变大小的窗体的尺寸
在OnPaint中根据这些状态变量和已经载入过的数据进行绘图任务
在类视图里选择要添加消息的类,对话框的是对话框类,单多文档的是VIEW类,
然后再属性窗口里标题栏下的按钮列里点 消息按钮
在下面的列表里找到WM_SIZE 双击或在右边下拉组合框选添加
MFC中的OnPaint消息处理函数中
在WM_SIZE消息中或OnSize中保存改变大小的窗体的尺寸
在OnPaint中根据这些状态变量和已经载入过的数据进行绘图任务
在类视图里选择要添加消息的类,对话框的是对话框类,单多文档的是VIEW类,
然后再属性窗口里标题栏下的按钮列里点 消息按钮
在下面的列表里找到WM_SIZE 双击或在右边下拉组合框选添加
更多追问追答
追问
能不能说的具体点
void CLoadView::OnSize(UINT nType, int cx, int cy)
{
CScrollView::OnSize(nType, cx, cy);
}
在这个函数中还需要添加什么语句?
void CLoadView::OnPrint(CDC* pDC, CPrintInfo* pInfo)
{
CScrollView::OnPrint(pDC, pInfo);
}
同样这个函数里面呢?
追答
OnSize里你可以把大小记录到变量,并触发更新窗口 Invalidate系列函数或UpdateWindow等
把你画图的代码放到OnPrint里 按照保存的大小拉伸下
至于滚动条的 也需要添加事件处理函数保存下滚动条位置,同时触发更新
在Onpain绘制时可以先绘制到内存dc中在根据保存的滚动条位置复制到相应位置
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
添加WM_SIZE消息响应函数进行处理~~~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
CPU或者是GPU没处理得过来
就是那个没有重绘无效区域了~~
就是那个没有重绘无效区域了~~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询