發表文章

目前顯示的是 5月, 2009的文章

BCB筆記:將檔案拖曳到程式中開啟

拖曳檔案到程式中開啟,需要系統配合,而BCB沒有提供一個簡單的方法達成,因此就需要寫用win32api的功能,使BCB的程式也能將拖曳的檔案開啟。 1. 將下面這一段程式碼加主程式的 .H 檔的public函數/成員的最後面(放在最後面是方便管理),還有就是這段程式碼沒有寫錯,END_MESSAGE_MAP (TForm)的TFrom也不需要更改! void __fastcall WmDropFiles(TWMDropFiles& Message); BEGIN_MESSAGE_MAP MESSAGE_HANDLER(WM_DROPFILES, TWMDropFiles, WmDropFiles) END_MESSAGE_MAP (TForm) 2. 接著切換到.CPP中,點擊點主視窗,並設定主視窗的Events的FormCreate,將下面的程式碼加入FromCreate中。 DragAcceptFiles(Handle, true); 3. 最後是寫開啟檔案的WmDropFiles函數內容。 void __fastcall TMainForm::WmDropFiles(TWMDropFiles& Message) { char buff[MAX_PATH]; HDROP hDrop = (HDROP)Message.Drop; int numFiles = DragQueryFile(hDrop, -1, NULL, NULL); if (numFiles >= 1) { for (int i=0 ; i<numFiles ; ++i) { DragQueryFile(hDrop, i, buff, sizeof(buff)); // 在這裡寫下開啟檔案的程式碼, buff就是檔案路徑的字串。 } } DragFinish(hDrop); }

BCB紀錄:Winapi 的 MessageBox

這程式碼我都已經弄成介面的基礎建設,放置在主程式的class中,這一切都是ShowMessage不夠Thread-Friendly的關係。 inline void TMainForm::ShowMessage(const AnsiString& msg, const AnsiString& cap) { ::MessageBox(this->Handle, msg.c_str(), cap.c_str(), MB_OK|MB_ICONINFORMATION); } inline void TMainForm::ErrorMessage(const AnsiString& msg, const AnsiString& cap) { ::MessageBox(this->Handle, msg.c_str(), cap.c_str(), MB_OK|MB_ICONERROR); } inline void TMainForm::WarnMessage(const AnsiString& msg, const AnsiString& cap) { ::MessageBox(this->Handle, msg.c_str(), cap.c_str(), MB_OK|MB_ICONWARNING); } inline bool TMainForm::ConfirmBox(const AnsiString& msg, const AnsiString& cap) { return (IDYES==::MessageBox(this->Handle, msg.c_str(), cap.c_str(), MB_YESNO|MB_ICONQUESTION)); } 2009-06-05 附註: 若是要給不同class與檔案間都只共用這一組Method,建議去除掉這些Method的inline修飾詞,因為有些時候inline會被compiler展開,所以造成Linker找不到我們宣告的這些Method,在編譯時造成困擾!

BCB同步捲軸

在影像處理的程式中,我時常會為了作兩種效果的比較,理所當然的將程式介面弄成左右兩個影像,雖然在處理小影像時,擺放足夠顯示的Image就足夠了,但是當要觀察的圖片太大時,便需要用ScrollBox來顯示大於規劃範圍的影像,然而轉動左邊或是右邊的ScrollBox,另一邊的影像卻不會動作,這對於觀察處理的效果實在是很不便利,因此我就需要加入同步捲軸。 一開始,我在程式介面中了擺置了兩個TScrollBox,分別為ScrollBox1與ScrollBox2。而我要這兩個ScrollBox能夠同步移動捲軸,就分別點這兩個物件的Events裡面的 CanResize ,並貼上下面的的程式碼。 TScrollBox* S = dynamic_cast<TScrollBox*>(Sender); // 轉型, 避免產生Exception if (S!=NULL) { int H = S->HorzScrollBar->Position; int V = S->VertScrollBar->Position; if (H != ScrollBox1->HorzScrollBar->Position) ScrollBox1->HorzScrollBar->Position = H; if (V != ScrollBox1->VertScrollBar->Position) ScrollBox1->VertScrollBar->Position = V; if (H != ScrollBox2->HorzScrollBar->Position) ScrollBox2->HorzScrollBar->Position = H; if (V != ScrollBox2->VertScrollBar->Position) ScrollBox2->VertScrollBar->Position = V; } 設定完後,只要任一個ScrollBox捲動時觸發CanResize,就會使上面的程式碼去取得使用者捲動後的ScrollBox水平與垂直軸位置,將這個位置資訊設定給還不是這個位置

BCB筆記:開關按鈕(三態按鈕/狀態按鈕)

內建在Additional中的TSpeedButton(SpeedButton),可以很簡單改變設定成開關按鈕。 只要將布局好的SpeedButton的GroupIndex屬性設定成大於0的數值,就成為了一個開關按鈕, 不過若只這麼設定,你會發現按鈕只能按下去,無法再彈起來,這是因為它原先是設計成RadioButton的形式,屬性AllowAllUp被設定為false,因此無法彈起按鈕,只要改為true,就是真正的開關按鈕,而其Down方法,則可以取得目前按鈕的開關狀態。