用VC6做一个简单的画图软件. 功能是在一个网状图上画图. 网状的每个网孔表示画图的每一个像素.
该网状大小大概为1000*1000. 现在遇到问题是我鼠标在上面画一个填充的矩形并且鼠标滑动时候矩形大小也会跟着变化.
我在OnMouseMove中不停地重画内存并在OnDraw中copy到DC显示. 现发现鼠标滑动变化填充矩形响应速度很慢.
鼠标滑动到其他地方去了, 该矩形要等一下才能变化到鼠标所指示的大小.
调试发现主要问题是画网状线消耗了资源:
for(i=0; i <= 1000; i+)
{
MyConsole.m_pMemDC->MoveTo(..);
MyConsole.m_pMemDC->LineTo(..);
}
for(i=0; i <= 1000; i++)
{
MyConsole.m_pMemDC->MoveTo(...);
MyConsole.m_pMemDC->LineTo(...);
}
请问有什么办法能减少画网状态图消耗的资源?
该网状大小大概为1000*1000. 现在遇到问题是我鼠标在上面画一个填充的矩形并且鼠标滑动时候矩形大小也会跟着变化.
我在OnMouseMove中不停地重画内存并在OnDraw中copy到DC显示. 现发现鼠标滑动变化填充矩形响应速度很慢.
鼠标滑动到其他地方去了, 该矩形要等一下才能变化到鼠标所指示的大小.
调试发现主要问题是画网状线消耗了资源:
for(i=0; i <= 1000; i+)
{
MyConsole.m_pMemDC->MoveTo(..);
MyConsole.m_pMemDC->LineTo(..);
}
for(i=0; i <= 1000; i++)
{
MyConsole.m_pMemDC->MoveTo(...);
MyConsole.m_pMemDC->LineTo(...);
}
请问有什么办法能减少画网状态图消耗的资源?
不需要,在不销毁MemDc的情况下,每次都pDC->BitBlt(0,0,m_nWide,m_nHigh,&MemDc,0,0,SRCCOPY);然后画矩形
我准备想用两个memdc. 一个是保存网格. 一个是画变化的图形.
1、要么不要在MouseMove的时候动态绘制(比如在鼠标拖动的时候只画一个框,在鼠标松开的时候再绘制所有矩形)
2、要么使用各种裁剪手段减去绘制次数(比如用一个大矩形来代替1000*1000个小矩形,或者使用脏矩形技术来裁切掉不必要的绘图部分)
3、要么干脆弃用GDI,使用其它更高效的绘制手段来绘制这些动态效果(如D3D)考虑综合情况,建议使用1、2两种方式。
1.预先在MemDC中绘制好网格,之后每次将其Blt出来。
2.不要使用LineTo,自己获取lpBits然后操作位图像素数据来绘制网格。
void CBMPView::RefreshView()
{
...
MyConsole.m_pMemDC->BitBlt(0,0,size.cx,size.cy, MyConsole.m_pLayoutDC,0,0,SRCCOPY);
...根据BMP图片填充小格子.
Invalidate();
}void CBMPView::OnDraw(CDC* pDC)
{
CPoint Point_Temp;
CSize size,sizeSb;
Point_Temp = GetScrollPosition();
GetTrueClientSize(size, sizeSb); pDC->BitBlt(Point_Temp.x,Point_Temp.y,size.cx,size.cy, MyConsole.m_pMemDC,Point_Temp.x,Point_Temp.y,SRCCOPY);
}
CBMPView为CScrollView的子类. 我在OnDraw中只刷新当前窗口部分.
现在移动鼠标很久才会正确刷新到正确位置, 根本没有excel那样非常顺滑. 请问是否需要更改方法?