全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3327
推到 Plurk!
推到 Facebook!

透明屬性的問題

答題得分者是:richtop
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-06-20 14:46:04 IP:210.68.xxx.xxx 未訂閱
大家好:    下面是我測試的程式碼:  
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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-06-20 16:29:12 IP:211.76.xxx.xxx 未訂閱
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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-06-20 16:40:04 IP:210.68.xxx.xxx 未訂閱
richtop前輩您好: 謝謝您的回應,我目前也是用這方式解決的 但是不知道為什麼會有少數電腦發生這樣的現象?
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-06-20 17:51:40 IP:211.76.xxx.xxx 未訂閱
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-06-20 18:28:10 IP:210.68.xxx.xxx 未訂閱
謝謝richtop前輩的指導, 
Image1->Canvas->FillRect(Image1->ClientRect); //(1)
Image1->Picture->Bitmap->Canvas->FillRect(Image1->ClientRect);
 
當加入(1)的時候便可解決原問題(能呈現黑色底黃色線) 但是小弟在想是不是能在FormCreate()就做好設定, 而不用每次當滑鼠移動時又再FillRect()一次 這樣會不會太貪心 再次謝謝 >
arisaka_matsuri
高階會員


發表:25
回覆:205
積分:231
註冊:2003-10-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2005-06-20 20:44:05 IP:140.113.xxx.xxx 未訂閱
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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2005-06-20 22:52:28 IP:211.76.xxx.xxx 未訂閱
taishyang 副站長 您好:    其實您說得一點也不貪心!(因為只做一次) 不過程式卻會慷慨的送您一大把黃線! 我發現 > >
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#8 引用回覆 回覆 發表時間:2005-06-21 09:16:12 IP:210.68.xxx.xxx 未訂閱
arisaka_matsuri前輩:   謝謝您,您的方式跟我的需求比較不一樣(我的需求就如同richtop前輩所描述),但仍然感謝您 >< face="Verdana, Arial, Helvetica">引言:不曉得您的目的是不是要達到:在某一圖像上作即時標示,但又不想破壞該圖像?隨意猜猜! 您說的沒錯,我就是要這樣的效果,所以才會用到透明的屬性
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#9 引用回覆 回覆 發表時間:2005-06-21 23:45:18 IP:211.76.xxx.xxx 未訂閱
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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2005-06-22 14:48:43 IP:220.135.xxx.xxx 未訂閱
引言: 大家好: 下面是我測試的程式碼:
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;
} 
taishyang試試看這樣寫...

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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2005-06-22 19:21:08 IP:210.68.xxx.xxx 未訂閱
JerryKuo大哥:
  謝謝您的幫忙,用您的程式測試會是黑色的底,但是線不見了耶     >
  我的需求是 href="http://delphi.ktop.com.tw/loadfile.php?TOPICID=23077190&CC=516110">http://delphi.ktop.com.tw/loadfile.php?TOPICID=23077190&CC=516110
再次謝謝大家的回應
richtop
資深會員


發表:122
回覆:646
積分:468
註冊:2003-06-10

發送簡訊給我
#12 引用回覆 回覆 發表時間:2005-06-22 23:35:54 IP:211.76.xxx.xxx 未訂閱
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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2005-06-22 23:55:46 IP:218.168.xxx.xxx 未訂閱
謝謝richtop前輩,明天上班時再拿去那奇怪的電腦測試 再次感謝
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#14 引用回覆 回覆 發表時間:2005-06-23 10:13:58 IP:210.68.xxx.xxx 未訂閱
richtop前輩果然是高手高手高高手
JerryKuo
版主


發表:42
回覆:571
積分:322
註冊:2003-03-10

發送簡訊給我
#15 引用回覆 回覆 發表時間:2005-06-23 11:37:48 IP:220.135.xxx.xxx 未訂閱
引言: 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

發送簡訊給我
#16 引用回覆 回覆 發表時間:2005-06-23 18:45:40 IP:210.68.xxx.xxx 未訂閱
JerryKuo大哥: 真是不好意思,之前可能哪邊沒注意到所以沒出現黃色線,現在的程式碼是OK的 不過跟我的需求有些許的不一樣,您是只用Image2來顯示 而我需要的是Image2當黑底Image1作圖,且利用Image1的透明屬性使他不會蓋住 Image2,richtop前輩的程式碼較符合我的需求 再次感謝各位前輩們的指導
JerryKuo
版主


發表:42
回覆:571
積分:322
註冊:2003-03-10

發送簡訊給我
#17 引用回覆 回覆 發表時間:2005-06-24 13:37:43 IP:220.135.xxx.xxx 未訂閱
引言: JerryKuo大哥: 真是不好意思,之前可能哪邊沒注意到所以沒出現黃色線,現在的程式碼是OK的 不過跟我的需求有些許的不一樣,您是只用Image2來顯示 而我需要的是Image2當黑底Image1作圖,且利用Image1的透明屬性使他不會蓋住 Image2,richtop前輩的程式碼較符合我的需求 再次感謝各位前輩們的指導 < face="Verdana, Arial, Helvetica"> 我老毛病又犯了,辭不達意,問題沒看清楚 抱歉抱歉...
系統時間:2024-11-23 21:24:58
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!