最近画图费神,数据量大,delphi能画图的控件都使用过.chart画图吃内存;paintbox画图容易擦除.改用image画图,内存是解决了,就是画图时,数据多那速度实在太慢了?有朋友提出自己写个TGraphiControl继承控件来画图,可以解决.摸索了几天了,框架都搞懂了,就是不知道咋个写这个控件?
画图的要求很简单,把所有数据点描在image上就可以了.
使用过双缓冲,效果不好,速度没有什么提高.
画图的要求很简单,把所有数据点描在image上就可以了.
使用过双缓冲,效果不好,速度没有什么提高.
用chart控件做实时图形只显示当前数据在屏幕上,不要求显示的就清除,就不怎么占内存,如果按照我们的要求,把所有数据都显示在chart上,会占内存的。
留QQ的同仁,我已经加你了。谢谢
var
DC, MemDC: HDC;
MemBitmap, OldBitmap: HBITMAP;
PS: TPaintStruct;
begin
if not FDoubleBuffered or (Message.DC <> 0) then
begin
if not (csCustomPaint in ControlState) and (ControlCount = 0) then
inherited
else
PaintHandler(Message);
end
else
begin
DC := GetDC(0);
MemBitmap := CreateCompatibleBitmap(DC, ClientRect.Right, ClientRect.Bottom);
ReleaseDC(0, DC);
MemDC := CreateCompatibleDC(0);
OldBitmap := SelectObject(MemDC, MemBitmap);
try
DC := BeginPaint(Handle, PS);
Perform(WM_ERASEBKGND, MemDC, MemDC);
Message.DC := MemDC;
WMPaint(Message);
Message.DC := 0;
//把图形绘制在MemDc上????
BitBlt(DC, 0, 0, ClientRect.Right, ClientRect.Bottom, MemDC, 0, 0, SRCCOPY);
EndPaint(Handle, PS);
finally
SelectObject(MemDC, OldBitmap);
DeleteDC(MemDC);
DeleteObject(MemBitmap);
end;
end;
end;
想问一下???的地方怎么绘制图形,moveto()和lineto()根本调不出来呀
MemBitmap := CreateCompatibleBitmap(DC, ClientRect.Right, ClientRect.Bottom);
ReleaseDC(0, DC);
MemDC := CreateCompatibleDC(0);
OldBitmap := SelectObject(MemDC, MemBitmap);
try
DC := BeginPaint(Handle, PS);
Perform(WM_ERASEBKGND, MemDC, MemDC);
Message.DC := MemDC;
WMPaint(Message);
Message.DC := 0;
//把图形绘制在MemDc上????
BitBlt(DC, 0, 0, ClientRect.Right, ClientRect.Bottom, MemDC, 0, 0, SRCCOPY);
EndPaint(Handle, PS);
finally
SelectObject(MemDC, OldBitmap);
DeleteDC(MemDC);
DeleteObject(MemBitmap);
end;
end;
各位有人知道,怎么在MenDC(句柄)上画图吗?我希望有人能知道。非常感谢了问:liehu1
xyline控件是什么控件,第三方控件吗??
请懂这方面的兄弟姐妹回答吧。谢谢了 DC := GetDC(0);
MemBitmap := CreateCompatibleBitmap(DC, ClientRect.Right, ClientRect.Bottom);
ReleaseDC(0, DC);
MemDC := CreateCompatibleDC(0);
OldBitmap := SelectObject(MemDC, MemBitmap);
try
DC := message.DC;
//怎么在这里把图绘制在MemDC上???
BitBlt(DC, 0, 0, ClientRect.Right, ClientRect.Bottom, MemDC, 0, 0, SRCCOPY);
finally
SelectObject(MemDC, OldBitmap);
DeleteDC(MemDC);
DeleteObject(MemBitmap);
end;
end;
完整代码公布给大家吧:相互学习
DC := GetDC(0);
MemBitmap := CreateCompatibleBitmap(DC, ClientRect.Right, ClientRect.Bottom);
ReleaseDC(0, DC);
MemDC := CreateCompatibleDC(0);
TPEN:=createpen(MemDC,ps_solid);//可以自己查一下设置画笔
OldBitmap := SelectObject(MemDC, MemBitmap);
try
dc:=message.DC;
movetoEX(MemDC,0,0,nil);
for i:=0 to 20000 do
LineTo(MemDC,i,random(1000));
BitBlt(DC, 0, 0, ClientRect.Right, ClientRect.Bottom, MemDC, 0, 0, SRCCOPY);
finally
SelectObject(MemDC, OldBitmap);
DeleteDC(MemDC);
Deleteobject(Tpen);
DeleteObject(MemBitmap);
end;
end;
QQ已经加你了,可没看见你上来过。希望得到帮助,交流一下编程思想。谢谢你了;
,单独说QQ联系吧。