image反應遲頓, 如何克服? |
尚未結案
|
help
一般會員 ![]() ![]() 發表:12 回覆:54 積分:13 註冊:2002-06-14 發送簡訊給我 |
|
x803198
一般會員 ![]() ![]() 發表:8 回覆:28 積分:17 註冊:2002-12-06 發送簡訊給我 |
|
help
一般會員 ![]() ![]() 發表:12 回覆:54 積分:13 註冊:2002-06-14 發送簡訊給我 |
|
sams
一般會員 ![]() ![]() 發表:18 回覆:20 積分:12 註冊:2003-04-14 發送簡訊給我 |
|
x803198
一般會員 ![]() ![]() 發表:8 回覆:28 積分:17 註冊:2002-12-06 發送簡訊給我 |
with Image1.Canvas do
begin
FillRect(ClipRect); // 清掉畫面
MoveTo(0,y); LineTo(Width,y);
MoveTo(x,0); LineTo(x,Height);
end;
Image1.Transparent := True; // 底透明 Transparent = True 圖越大效率越差
Transparent = False 圖會閃爍
我將圖寬高設為400, Transparent=True 感覺不太出來會延遲 (CPU P3-800)
不知道你是不是這樣做
延遲一定會的,除非你十字線和滑鼠一起畫這樣才會同步 建議你用 delphix 試試看效能較好 http://www.yks.ne.jp/~hori/ 發表人 - x803198 於 2003/04/30 01:32:40
|
x803198
一般會員 ![]() ![]() 發表:8 回覆:28 積分:17 註冊:2002-12-06 發送簡訊給我 |
|
easyman
一般會員 ![]() ![]() 發表:6 回覆:9 積分:3 註冊:2002-05-21 發送簡訊給我 |
提供您我的想法參考看看
十字線由兩個TShape組成,其Shape設為stRectangle,一個Heght設為一,width設為和image同寬,其left設0,名稱vline,另一個width設為一,height設為和image同高,其top設為0名稱設為hline,則只要在image的mousemove事件中
設定
Vline.Top:=y;
hline.Left:=x;
就可改變這兩個shape的位置
因將vline的lfet定為0width和image同寬,當在mousemove中改變其top值時,就是一橫線在作上下移動,hline則是作左右移動如此剛好就可形成一十字交叉線
您可試試看 這是以image的left及top為0來作,如你image的left及top不是0就自己加上x和y的徧移值或把image及shape放在一個pannel中較省事
|
help
一般會員 ![]() ![]() 發表:12 回覆:54 積分:13 註冊:2002-06-14 發送簡訊給我 |
我有想過用X803198所說的tpaintbox. 不過我不知道tpainbox如何設成透明?
如果可以的話, 這個方式會是最方便的. 我想Timage在repaint時, 會delay一下以免閃爍吧... 現在我用直接繪圖在dc(0)上面,
cross_area:=tcanvas.Create;
cross_area.Handle:=getdc(0);
然後直接在上面繪製, 就不用等image 慢慢repaint.
但是很麻煩, 要檢查不要出邊界....
所以如果tpaintbox可以用的話就很好. 另外easyman的建議似乎很新奇,可能是一個極佳的方法, 我得試試.
------
gogowin |
help
一般會員 ![]() ![]() 發表:12 回覆:54 積分:13 註冊:2002-06-14 發送簡訊給我 |
|
x803198
一般會員 ![]() ![]() 發表:8 回覆:28 積分:17 註冊:2002-12-06 發送簡訊給我 |
|
help
一般會員 ![]() ![]() 發表:12 回覆:54 積分:13 註冊:2002-06-14 發送簡訊給我 |
|
rose
一般會員 ![]() ![]() 發表:2 回覆:6 積分:1 註冊:2002-03-25 發送簡訊給我 |
不知這樣合不合你的要求..
把image1 換成PaintBox1,下面底圖(image1).
每次去呼叫器DrawCross,mouse移動時先清除舊作標
ImgLoading_Falg是要確定圖檔已Load完成,否則,當一Run程式時,Mosue座標在
image1時會留下殘影< >< > unit Unit1; interface uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, jpeg, ExtCtrls; type
TForm1 = class(TForm)
Image1: TImage;
PaintBox1: TPaintBox;
procedure PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure FormCreate(Sender: TObject);
procedure Image1Progress(Sender: TObject; Stage: TProgressStage;
PercentDone: Byte; RedrawNow: Boolean; const R: TRect;
const Msg: String);
private
{ Private declarations }
procedure DrawCross(ax,ay:Integer);
public
{ Public declarations }
oldx,oldy:Integer;
ImgLoading_Falg:Boolean;
end; var
Form1: TForm1; implementation {$R *.dfm}
procedure TForm1.DrawCross(ax,ay:Integer);
begin
with PaintBox1.Canvas do
Begin
Pen.color:=clBlack;
Pen.Style:=psSolid;
Pen.Mode:=pmNotXor;
Moveto(ax,0);
Lineto(ax,PaintBox1.Top PaintBox1.Height);
Moveto(0,ay);
Lineto(PaintBox1.Left PaintBox1.Width,ay);
end;
end; procedure TForm1.PaintBox1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
IF Not ImgLoading_Falg Then Exit;
if (oldX<>-1) then Begin
DrawCross(oldx,oldy);
Oldx:=-1;
end
Else Begin
DrawCross(x,y);
oldx:=x;
oldy:=y;
End;
end; procedure TForm1.FormCreate(Sender: TObject);
begin
ImgLoading_Falg:=False;
oldx:=-1;
oldy:=-1;
end; procedure TForm1.Image1Progress(Sender: TObject; Stage: TProgressStage;
PercentDone: Byte; RedrawNow: Boolean; const R: TRect;
const Msg: String);
begin
ImgLoading_Falg:=(Stage=psEnding);
end;
|
help
一般會員 ![]() ![]() 發表:12 回覆:54 積分:13 註冊:2002-06-14 發送簡訊給我 |
|
help
一般會員 ![]() ![]() 發表:12 回覆:54 積分:13 註冊:2002-06-14 發送簡訊給我 |
|
help
一般會員 ![]() ![]() 發表:12 回覆:54 積分:13 註冊:2002-06-14 發送簡訊給我 |
呼, 搞定了! 原來是可以用TPaintbox.
但是要將十字線的製寫在Tpaintbox的OnPaint上, 而不是寫在OnMouseMove之上.
因為寫在OnmouseMove之上, 無法清除舊線.Rose建議用pen.mode:=pmNotXor來做.但是十字線的顏色會和底圖做XOR....而且要清除舊線.... 可以考慮用image1.refresh(image1為底圖)來清除paintbox上舊線,然後再繪製新的十字線,是不錯。但是,游標一停,十字線就不見了,因為tpainbox必須在OnPaint上才能繪製永久的圖形! 謝謝各位的熱心幫忙. 將得分送給x803198. 但是謝謝Rose給我靈感再度試試tpaintbox!
------
gogowin |
rose
一般會員 ![]() ![]() 發表:2 回覆:6 積分:1 註冊:2002-03-25 發送簡訊給我 |
|
rose
一般會員 ![]() ![]() 發表:2 回覆:6 積分:1 註冊:2002-03-25 發送簡訊給我 |
|
help
一般會員 ![]() ![]() 發表:12 回覆:54 積分:13 註冊:2002-06-14 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |