按鈕連接圖片反白 疑問 |
答題得分者是:herbert2
|
nba2005mt
一般會員 發表:5 回覆:9 積分:2 註冊:2012-09-03 發送簡訊給我 |
請教各位
我現在做了6個按鈕(假設) 我點擊任一個按鈕 對應的圖片就會反白 讓使用者知道 現在選擇到的功能是哪一個 在點擊一次 反白就會取消 請問 要怎麼才可以讓點擊別的按鈕後 原先點擊的反白的圖片 取消反白 舉個例子 其中兩個按鈕 A , B 對應圖片為 a , b 點A按鈕時 圖片a反白 點b按鈕時 圖片a反白取消 圖片b反白 以下為按鈕 click的程式碼 Byte* ptr; Graphics::TBitmap *TheBitmap; //------------------------------------------------ TheBitmap=Image1->Picture->Bitmap; //------------------------------------------------ for(int y=0; y { ptr = (Byte*)TheBitmap->ScanLine[y]; for (int x=0; x ptr[x]=(Byte)(255-ptr[x]); } Repaint(); 請各位大哥大姐幫幫忙 |
noodlejay
一般會員 發表:8 回覆:18 積分:10 註冊:2011-08-10 發送簡訊給我 |
|
nba2005mt
一般會員 發表:5 回覆:9 積分:2 註冊:2012-09-03 發送簡訊給我 |
|
herbert2
尊榮會員 發表:58 回覆:640 積分:894 註冊:2004-04-16 發送簡訊給我 |
每個 VCL 元件,都有一個 int 的 Property 叫做 Tag,初值都是 0,可任憑自己運用。
每個按鈕的 Click ,都使用同一個 Event。 假設共有9個 BitBtn,在 .h 宣告 Btn[9], 在 .cpp 的 Constructor 段,設 Btn[0] = BitBtn1; .... Btn[8] = BitBtn9; 則: [code cpp] // .h 檔 //----------------------------------------------------------- .... private: .... TBitBtn *Btn[9]; // 宣告 .... //----------------------------------------------------------- // .cpp 檔 void __fastcall TForm1::TForm1(TComponent *Owner) : TForm(Owner) { // Constructor 段 Btn[0] = BitBtn1; // 給值 Btn[1] = BitBtn2; Btn[2] = BitBtn3; Btn[3] = BitBtn4; Btn[4] = BitBtn5; Btn[5] = BitBtn6; Btn[6] = BitBtn7; Btn[7] = BitBtn8; Btn[8] = BitBtn9; /* // 或先宣告一個 local TBitBtn 陣列 TmpBtn[9] 並填值(必須一個 Statement 完成) TBitBtn *TmpBtn[9] = {BitBtn1,BitBtn2,BitBtn3,BitBtn4,BitBtn5,BitBtn6,BitBtn7,BitBtn8,BitBtn9}; // 再轉入 private 的 Btn[9] for (int i = 0; i < 9) { Btn[i] = TmpBtn[i]; } */ } //----------------------------------------------------------- void __fastcall TForm1::BitBtn1Click(TObject *Sender) { // 將 Sender 轉成目前 Click 的 BitBtn,記錄下其 Name 供後面程式使用 AnsiString sxName; sxName = ((TBitBtn *)Sender)->Name; for (int i = 0; i < 9; i) { if (Btn[i]->Name == sxName) { // 0...8 中之第 i 個 TBitBtn 為目前 Click 者 if (Btn[i]->Tag == 0) { Btn[i]->Tag = 1; // Btn[i] 的圖形反白的處理 } } else { if (Btn[i]->Tag == 1) { Btn[i]->Tag = 0; // Btn[i] 的圖形恢復正常的處理 } } } // 最後,Btn[i] 的 Tag 尚可做其他用途的判斷 } //----------------------------------------------------------- [/code]
編輯記錄
herbert2 重新編輯於 2012-09-13 20:42:11, 註解 無‧
herbert2 重新編輯於 2012-09-13 20:44:13, 註解 無‧ herbert2 重新編輯於 2012-09-13 20:44:52, 註解 無‧ herbert2 重新編輯於 2012-09-13 20:45:34, 註解 無‧ herbert2 重新編輯於 2012-09-13 20:47:12, 註解 程式碼區的縮格不正常,怎麼改都不對?!‧ herbert2 重新編輯於 2012-09-14 00:08:47, 註解 無‧ herbert2 重新編輯於 2012-09-14 00:10:04, 註解 無‧ herbert2 重新編輯於 2012-09-15 09:54:14, 註解 無‧ herbert2 重新編輯於 2012-09-15 09:57:06, 註解 無‧ |
noodlejay
一般會員 發表:8 回覆:18 積分:10 註冊:2011-08-10 發送簡訊給我 |
|
nba2005mt
一般會員 發表:5 回覆:9 積分:2 註冊:2012-09-03 發送簡訊給我 |
|
noodlejay
一般會員 發表:8 回覆:18 積分:10 註冊:2011-08-10 發送簡訊給我 |
|
herbert2
尊榮會員 發表:58 回覆:640 積分:894 註冊:2004-04-16 發送簡訊給我 |
再舉另一種寫法供參考:
每個 VCL 元件,都有一個 int 的 Property 叫做 Tag,初值都是 0,可任憑自己運用。 每個按鈕的 Click ,都使用同一個 Event。 假設共有5個 BitBtn,在 .h 宣告 Btn[5], 在 .cpp 的 Constructor 段,設 Btn[0] = BitBtn1; .... Btn[4] = BitBtn5; (因9個在本論壇之程式碼區會折到下一列,故改成5個做示範) 我把這5個 BitBtn->Tag 分別先填上 0~4 代表其在陣列中的 Index。 則: [code cpp] // .h 檔 //----------------------------------------------------------- .... private: .... TBitBtn *Btn[5]; // 宣告 int igHi; .... //----------------------------------------------------------- // .cpp 檔 void __fastcall TForm1::TForm1(TComponent *Owner) : TForm(Owner) { // 此為 Constructor 段 // 先宣告一個 local TBitBtn 陣列 TmpBtn[5] 並填值(必須一個 Statement 完成) TBitBtn *TmpBtn[5] = {BitBtn1,BitBtn2,BitBtn3,BitBtn4,BitBtn5}; // 再轉入 private 的 Btn[5] for (int i = 0; i < 5) { Btn[i] = TmpBtn[i]; // 註: Btn[i]->Tag = i; } igHi = -1; // 目前5個 BitBtn 皆未反白 } //----------------------------------------------------------- void __fastcall TForm1::BitBtn1Click(TObject *Sender) { // 將 Sender 轉成目前 Click 的 BitBtn,記錄下其 Index 供後面程式使用 int ixTag; ixTag = ((TBitBtn *)Sender)->Tag; for (int i = 0; i < 5; i) { if (Btn[i]->Tag != ixTag) { // 非目前 Click 者 if (i == igHi) { // Btn[i] 的圖形恢復正常的處理 } } } // 0...4 中之第 ixTag 個 TBitBtn 為目前 Click 者 if (ixTag != igHi) { // Btn[ixTag] 的圖形反白的處理 } igHi = ixTag; // 最後,igHi 尚可做其他用途的判斷 } //----------------------------------------------------------- [/code] 為了縮格位置正確,縮格用一個全型空白取代兩個半型空白,真正的程式須改回半型空白。 |
nba2005mt
一般會員 發表:5 回覆:9 積分:2 註冊:2012-09-03 發送簡訊給我 |
|
herbert2
尊榮會員 發表:58 回覆:640 積分:894 註冊:2004-04-16 發送簡訊給我 |
|
nba2005mt
一般會員 發表:5 回覆:9 積分:2 註冊:2012-09-03 發送簡訊給我 |
|
noodlejay
一般會員 發表:8 回覆:18 積分:10 註冊:2011-08-10 發送簡訊給我 |
|
nba2005mt
一般會員 發表:5 回覆:9 積分:2 註冊:2012-09-03 發送簡訊給我 |
Byte *iptr, *optr, *ptr;
Graphics::TBitmap *TheBitmap, *OrgBitmap, *TempBitmap; AnsiString sxName; sxName = ((TBitBtn *)Sender)->Name; for (int i = 0; i < 2; i) { if (Btn[i]->Name == sxName) { if (Btn[i]->Tag == 0) { Btn[i]->Tag = 1; TheBitmap=Image1->Picture->Bitmap; for(int y=0; y { ptr = (Byte*)TheBitmap->ScanLine[y]; for (int x=0; x ptr[x]=(Byte)(255-ptr[x]); } Repaint(); } } else { if (Btn[i]->Tag == 1) { Btn[i]->Tag = 0; } } } }
不好意思 這是按鈕程式 這樣執行結果 會是(兩個按鈕 A B) 點擊案扭會反白 不過 兩個按鈕以上 反白動作會變成怪怪的 |
nba2005mt
一般會員 發表:5 回覆:9 積分:2 註冊:2012-09-03 發送簡訊給我 |
|
nba2005mt
一般會員 發表:5 回覆:9 積分:2 註冊:2012-09-03 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |