//我的程序需要定时刷新界面的一小块面积,该如何做?
在ontimer()中:
{
loadsmallbmp1(...);
CRect rtCal;
rtCal.SetRect(0,2,20,20);
pDlg->InvalidateRect(&rtCal,TRUE);
pDlg->UpdateWindow();
}updatewindow会导致onpaint被调用
在onpaint()中:
{
...
this->GetDC()->BitBlt(0, 0,100,100,&dcMemory1,0, 0, SRCCOPY);
this->GetDC()->BitBlt(100, 100,200,200,&dcMemory2,0, 0, SRCCOPY);
this->GetDC()->BitBlt(0,2,20,20,&dcMemory3,0, 0, SRCCOPY);
...
}
也就是说,一个小图片的更新会导致onpaint中所有内容都被重画一遍?该如何优化?
在ontimer()中:
{
loadsmallbmp1(...);
CRect rtCal;
rtCal.SetRect(0,2,20,20);
pDlg->InvalidateRect(&rtCal,TRUE);
pDlg->UpdateWindow();
}updatewindow会导致onpaint被调用
在onpaint()中:
{
...
this->GetDC()->BitBlt(0, 0,100,100,&dcMemory1,0, 0, SRCCOPY);
this->GetDC()->BitBlt(100, 100,200,200,&dcMemory2,0, 0, SRCCOPY);
this->GetDC()->BitBlt(0,2,20,20,&dcMemory3,0, 0, SRCCOPY);
...
}
也就是说,一个小图片的更新会导致onpaint中所有内容都被重画一遍?该如何优化?
解决方案 »
- 360安全卫士界面ListVIew
- [求助]一种奇怪的tiff,它的结构到底是什么?(在文件中有Wang tiff字样)
- 线程函数参数为指针怎么传递呢?谢谢大家~
- 想做一个notes那样的状态栏按钮, 按一下弹出列表, 但如何响应整个程序的鼠标事件让他关闭??????????
- 知道了一个可执行文件的路径,怎么知道这个程序主窗口的标题?
- 关于全局变量
- 请问各位:在哪里能找到“ActiveX Control Pad(cpad)”这个东东?
- 怎么样删除一个单向链表里的所有满足条件的节点
- 关于多线程的异步技术问题
- 开了40个线程,程序运行速度并没有提高!
- 发帖带附件测试
- 请问在SDI中,如何在弹出的对话中切换主框架的视图,且对话框不消失
更新时,只需要
GetDlgItem(IDC_STATIC_PIC)->Invalidate();
InvalidateRect(&rtCal);
看看效果怎么样。别调用UpdateWindow()。
/**
* 得到剪裁区
*/
CPaintDC dc(this);
CRect rcClipAll;
dc.GetClipBox( rcClipAll ); /**
* 如果剪裁区和绘图区有相交,才绘制,甚至如果你要更提高效率,可以只绘制相交取
*/
CRect rcDraw(0,0,100,100);
CRect rcInserect;
if( rcInserect.IntersectRect( rcClipAll,rcDraw ) )
{
dc.BitBlt(rcDraw.left,rcDraw.top,rcDraw.Width(),rcDraw.Height() &dcMemory1,0, 0, SRCCOPY);
}
楼主的代码的问题:
1:多次 this- >GetDC()却没有ReleaseDC()是有大量的GDI资源泄露的。
2:GetDC()返回的DC 是无法得到InvalidateRect传过来的更新区域的
/**
* 得到剪裁区
*/
CPaintDC dc(this);
CRect rcClipAll;
dc.GetClipBox( rcClipAll ); /**
* 如果剪裁区和绘图区有相交,才绘制,甚至如果你要更提高效率,可以只绘制相交取
*/
CRect rcDraw(0,0,100,100);
CRect rcInserect;
if( rcInserect.IntersectRect( rcClipAll,rcDraw ) )
{
dc.BitBlt(rcDraw.left,rcDraw.top,rcDraw.Width(),rcDraw.Height() &dcMemory1,0, 0, SRCCOPY);
}
楼主的代码的问题:
1:多次 this- >GetDC()却没有ReleaseDC()是有大量的GDI资源泄露的。
2:GetDC()返回的DC 是无法得到InvalidateRect传过来的更新区域的
最好使在Timer函数中直接更新某块区域
好的办法应该是你在OnTimer中变换一块内存DC里面的内容,然后InvalidateRect呼叫OnPaint
在OnPaint中再把这块内存DC的内容Bitblt到屏幕上
直接在定时器里做就完了
在定时器里getdc,getrect
不过最好先画在memdc里,再拷到屏幕dc
OnEraseBkgnd()
{
return;
}