透明屬性的問題 |
答題得分者是:richtop
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
大家好: 下面是我測試的程式碼:
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { Image1->Picture = NULL; Image1->Canvas->Pen->Color = clYellow; Image1->Canvas->MoveTo(X,0); Image1->Canvas->LineTo(X,Y); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { Image2->Canvas->Brush->Color = clBlack; Image2->Canvas->FillRect(Image2->ClientRect); Panel1->DoubleBuffered = true; }目的是要讓畫面呈現黑色底(Image2),然後會有一條黃色的線隨滑鼠座標移動而移動(Image1),Image1的Transparent屬性也有成true 絕大數的電腦都OK,但在某些電腦上RUN卻變白色底黃色的線,不知是什麼原因所 導致,請前輩們指導 OK的畫面 ERROR的畫面 謝謝大家 |
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
taishyang 副站長 您好: 感覺上雖然是設定了透明屬性,但可能還要將Image填滿該透明色(我猜是原來的背景色).
不知能否完全解決問題?您且且試試!
void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { Image1->Picture = NULL; Image1->Canvas->FillRect(Image1->ClientRect); Image1->Canvas->Pen->Color = clYellow; Image1->Canvas->MoveTo(X,0); Image1->Canvas->LineTo(X,Y); }RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====##### |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
taishyang 副站長 您好: 查了TImage與TBitmap的線上說明,有關於Transparent屬性的內容。
依之前的使用經驗:實質上Image->Canvas與Image->Picture->Bitmap->Canvas兩者其實並不相同。
特別是當Image->Picture不存在時,或者是您改變了Image->Picture->Bitmap->Canvas的內容,
但Image->Canvas並不會立即有更新動作! 所以如果將所有的處理過程都在Image->Picture->Bitmap->Canvas中進行,最後再更新Image。
或許可以得到比較一致的結果。 希望是這樣! >>>><>>>>>>
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
arisaka_matsuri
高階會員 發表:25 回覆:205 積分:231 註冊:2003-10-19 發送簡訊給我 |
dear taishyang:
//--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { Form1->DoubleBuffered = true; Image1->Canvas->Brush->Color = clBlack; Image1->Canvas->FillRect(Image1->ClientRect); } //--------------------------------------------------------------------------- void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { Image1->Canvas->Pen->Color = clBlack; Image1->Canvas->MoveTo(OldX, 0); Image1->Canvas->LineTo(OldX, OldY); Image1->Canvas->Pen->Color = clYellow; Image1->Canvas->MoveTo(X, 0); Image1->Canvas->LineTo(X, Y); OldX = X; // TForm1 的 成員 OldY = Y; } //---------------------------------------------------------------------------這樣也可以~ 不過,跟透明屬性設定就沒關係了 發表人 - |
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
taishyang 副站長 您好: 我之前也嘗試過做這樣的效果。
不過一開始是先將整張圖複製到Form上,再畫上想要的標示符號。
但是如果圖片的尺寸太大,似乎又蠻耗時的。
所以後來我想到用一個記錄最大範圍邊框的方式,避免全圖的複製。
底下是我完成的部分程式,您參考看看。 其實程式應該可以記錄更小的範圍,不過還有其他事待完成,祇得暫時擱下。
要是對您有幫助或者您有改寫它,再讓我分享一下囉!
< href="http://delphi.ktop.com.tw/loadfile.php?TOPICID=23064670&CC=515830">http://delphi.ktop.com.tw/loadfile.php?TOPICID=23064670&CC=515830 RichTop 敬上 =====*****
把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題!
=====##### 發表人 - richtop 於 2005/06/21 23:45:51
|
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
引言: 大家好: 下面是我測試的程式碼:taishyang試試看這樣寫...void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { Image1->Picture = NULL; Image1->Canvas->Pen->Color = clYellow; Image1->Canvas->MoveTo(X,0); Image1->Canvas->LineTo(X,Y); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { Image2->Canvas->Brush->Color = clBlack; Image2->Canvas->FillRect(Image2->ClientRect); Panel1->DoubleBuffered = true; } int preX = -1,preY = -1; void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { Image1->Canvas->Pen->Color = clYellow; if(preX != -1) { Image1->Canvas->Pen->Mode = pmXor; Image1->Canvas->MoveTo(preX,0); Image1->Canvas->LineTo(preX,preY); } Image1->Canvas->Pen->Mode = pmXor; Image1->Canvas->MoveTo(X,0); Image1->Canvas->LineTo(X,Y); preX = X; preY = Y; } |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
richtop
資深會員 發表:122 回覆:646 積分:468 註冊:2003-06-10 發送簡訊給我 |
taishyang 副站長 您好: Image->Transparent
與
Image->Picture->Bitmap->Transparent,Image->Picture->Bitmap->TransparentColor
的完整設定,或許比較能正確顯現透明的效果。
底下程式碼在我電腦上是可以執行的,但在您所說的某些電腦就不知道如何了? 另一個透明色測試的程式:http://delphi.ktop.com.tw/loadfile.php?TOPICID=23079381&CC=516159
//--------------------------------------------------------------------------- int prevX=-1, prevY=-1; void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { //Image1->Picture = 0; Image1->Canvas->Pen->Color = clWhite; Image1->Canvas->MoveTo(prevX,0); Image1->Canvas->LineTo(prevX,prevY); Image1->Canvas->Pen->Color = clYellow; Image1->Canvas->MoveTo(X,0); Image1->Canvas->LineTo(X,Y); prevX = X; prevY = Y; } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { Image2->Canvas->Brush->Color = clBlack; Image2->Canvas->FillRect(Image2->ClientRect); Image1->Transparent = true; Image1->Picture->Bitmap->Width = Image1->Width; Image1->Picture->Bitmap->Height = Image1->Height; Image1->Picture->Bitmap->Transparent = true; Image1->Picture->Bitmap->TransparentColor = clWhite; // 耍賴!即使是白底也無妨! Image1->Picture->Bitmap->Canvas->FillRect(Image1->ClientRect); Panel1->DoubleBuffered = true; } //---------------------------------------------------------------------------RichTop 敬上 =====***** 把數學當工具,可以解決問題;將數學變能力,能夠發現並解決問題! =====##### |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
引言: JerryKuo大哥: 謝謝您的幫忙,用您的程式測試會是黑色的底,但是線不見了耶 >>< face="Verdana, Arial, Helvetica"> 我是用你的範例做的測試,所以是黑底黃線,結果沒有錯 這是一般繪圖程式常用的畫坐標方式,或許你還有做別的設定, 導致線畫不出來,如果可以的話,請你再試試看。int preX = -1, preY = -1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Image1MouseMove(TObject *Sender, TShiftState Shift, int X, int Y) { Image2->Canvas->Pen->Color = clYellow; if(preX != -1) { Image2->Canvas->Pen->Mode = pmXor; Image2->Canvas->MoveTo(preX,0); Image2->Canvas->LineTo(preX,preY); } Image2->Canvas->Pen->Mode = pmXor; Image2->Canvas->MoveTo(X,0); Image2->Canvas->LineTo(X,Y); preX = X; preY = Y; } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { Image2->Canvas->Brush->Color = clBlack; Image2->Canvas->FillRect(Image2->ClientRect); Image1->Picture->Bitmap->Canvas->FillRect(Image1->ClientRect); Panel1->DoubleBuffered = true; }發表人 - jerrykuo 於 2005/06/23 11:46:19 |
taishyang
站務副站長 發表:377 回覆:5490 積分:4563 註冊:2002-10-08 發送簡訊給我 |
|
JerryKuo
版主 發表:42 回覆:571 積分:322 註冊:2003-03-10 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |