線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2006
推到 Plurk!
推到 Facebook!

image反應遲頓, 如何克服?

尚未結案
help
一般會員


發表:12
回覆:54
積分:13
註冊:2002-06-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-04-28 16:11:19 IP:61.61.xxx.xxx 未訂閱
各位先進, 我用兩個image元件上下重畳在一起. 上面的image(image1)設為透明, 下面則是底圖(image2). 然後我在image1mousemove事件程中,在image1上繪製十字線, 做為滑鼠游標的定位指示. 結果發現, 十字線的移動會有delay的現象. 若滑鼠移動快些, 十字線會跟不上..... 請問有什麼好的解決方法嗎? 謝謝 gogowin
------
gogowin
x803198
一般會員


發表:8
回覆:28
積分:17
註冊:2002-12-06

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-04-29 03:20:42 IP:218.166.xxx.xxx 未訂閱
image2.Cursor := crCross; crCross = 十字線 很好用...
help
一般會員


發表:12
回覆:54
積分:13
註冊:2002-06-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-04-29 12:59:31 IP:61.61.xxx.xxx 未訂閱
謝謝x803198 不過我所謂的十字線是由圖形的上下右左邊連線,並交於游標所在的位置. 由於需不斷地繪製此交叉線, 所以圖形反應有點慢..有點落後的感覺. 因為上圖(除了線以外全部透明)要和下圖合成之後再顯示出來的原故吧... gogowin
------
gogowin
sams
一般會員


發表:18
回覆:20
積分:12
註冊:2003-04-14

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-04-29 19:26:13 IP:61.64.xxx.xxx 未訂閱
MOUSE 的形狀除內定圖形外, 可以用圖形檔(RES檔: resource)改變..
x803198
一般會員


發表:8
回覆:28
積分:17
註冊:2002-12-06

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-04-30 01:21:41 IP:218.166.xxx.xxx 未訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-04-30 02:00:51 IP:218.166.xxx.xxx 未訂閱
我剛剛又試試TPaintBox (將上面的 Image 改成 TPaintBox) 效率比較好,就算是大圖沒什麼延遲的感覺
easyman
一般會員


發表:6
回覆:9
積分:3
註冊:2002-05-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-04-30 11:31:18 IP:61.219.xxx.xxx 未訂閱
提供您我的想法參考看看 十字線由兩個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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-04-30 15:36:24 IP:61.61.xxx.xxx 未訂閱
我有想過用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

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-04-30 15:55:49 IP:61.61.xxx.xxx 未訂閱
對不起,我是說不知如何清除tpaintbox而且讓它是透明的. tpainbox沒繪圖時, 本來就是透明的. 另外, freeman所建議的方式會閃爍,即使將form1.doublebuffered設成true. 而且, tshape變成線時, 無法變色. gogowin
------
gogowin
x803198
一般會員


發表:8
回覆:28
積分:17
註冊:2002-12-06

發送簡訊給我
#10 引用回覆 回覆 發表時間:2003-05-01 06:37:30 IP:218.166.xxx.xxx 未訂閱
with tpainbox.Canvas do begin   FillRect(ClipRect); // 清掉畫面 MoveTo(0,y); LineTo(Width,y); MoveTo(x,0); LineTo(x,Height); end;
help
一般會員


發表:12
回覆:54
積分:13
註冊:2002-06-14

發送簡訊給我
#11 引用回覆 回覆 發表時間:2003-05-01 09:02:51 IP:61.61.xxx.xxx 未訂閱
如果用下列程式:    with tpainbox.Canvas do begin FillRect(ClipRect); // 清掉畫面 MoveTo(0,y); LineTo(Width,y); MoveTo(x,0); LineTo(x,Height); end;    來清除的話, paintbox的部份會出現一個方塊(上有十字線),把下面的圖蓋掉. 所以不行啊...
------
gogowin
rose
一般會員


發表:2
回覆:6
積分:1
註冊:2002-03-25

發送簡訊給我
#12 引用回覆 回覆 發表時間:2003-05-03 02:02:30 IP:203.204.xxx.xxx 未訂閱
不知這樣合不合你的要求.. 把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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2003-05-03 17:23:30 IP:61.61.xxx.xxx 未訂閱
謝謝ROSE. 不過Timage的 onprogress事件是當你要載入大圖時才會發生. 現在的image1只有640X480...    sd會造成游標和十字線delay的原因, 我認為是Timage元件特性. 當它和底圖要重畳時, 不會第一時間將圖形繪出....當游。標移至下個位置時,它才會繪出上一次onMouseMove要它繪出的十字線. 這樣就出現延遲的狀況.
------
gogowin
help
一般會員


發表:12
回覆:54
積分:13
註冊:2002-06-14

發送簡訊給我
#14 引用回覆 回覆 發表時間:2003-05-03 17:23:44 IP:61.61.xxx.xxx 未訂閱
謝謝ROSE. 不過Timage的 onprogress事件是當你要載入大圖時才會發生. 現在的image1只有640X480...    sd會造成游標和十字線delay的原因, 我認為是Timage元件特性. 當它和底圖要重畳時, 不會第一時間將圖形繪出....當游。標移至下個位置時,它才會繪出上一次onMouseMove要它繪出的十字線. 這樣就出現延遲的狀況.
------
gogowin
help
一般會員


發表:12
回覆:54
積分:13
註冊:2002-06-14

發送簡訊給我
#15 引用回覆 回覆 發表時間:2003-05-03 22:06:00 IP:61.61.xxx.xxx 未訂閱
呼, 搞定了!    原來是可以用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

發送簡訊給我
#16 引用回覆 回覆 發表時間:2003-05-03 23:03:39 IP:203.204.xxx.xxx 未訂閱
有一問題請問 help,如何觸發tpainbox的OnPaint...X=?,Y=? Mouse移動時好像無法觸發OnPaint,且X,Y 如何得到 ?< >< >,
rose
一般會員


發表:2
回覆:6
積分:1
註冊:2002-03-25

發送簡訊給我
#17 引用回覆 回覆 發表時間:2003-05-03 23:03:51 IP:203.204.xxx.xxx 未訂閱
有一問題請問 help,如何觸發tpainbox的OnPaint...X=?,Y=? Mouse移動時好像無法觸發OnPaint,且X,Y 如何得到 ?< >< >,
help
一般會員


發表:12
回覆:54
積分:13
註冊:2002-06-14

發送簡訊給我
#18 引用回覆 回覆 發表時間:2003-05-04 19:16:57 IP:61.61.xxx.xxx 未訂閱
請將繪圖的程式碼寫在tpaintbox的OnPaint Event. 但是因為Paint event不知道滑鼠的位置, 所以要在Onmousemove事位中先將x,y值記錄在一個全域變數, 供onPaint 事件使用.
------
gogowin
系統時間:2024-05-16 13:52:50
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!