TApplication、TScreen、TForm 構成 BCB GUI 程式的三大支柱。TApplication 封裝了標準 Windows 程式行為:
TApplication,再分派給 TForm。此處攔截可實現全域熱鍵、全域滑鼠手勢、訊息日誌、安全過濾等。// 簡化版 Application->ProcessMessage 流程
function TApplication.ProcessMessage: Boolean;
var
Msg: TMsg;
begin
Result := False;
if PeekMessage(Msg, 0, 0, 0, PM_REMOVE) then begin
// 1. 前置過濾:OnMessage 事件
if Assigned(OnMessage) then OnMessage(Msg, Handled);
if Handled then Exit(True);
// 2. 內部預處理:快捷鍵、Hint、MDI 等
if IsHintMsg(Msg) then ...;
if IsMDIMsg(Msg) then ...;
if ProcessShortCut(Msg) then ...; // 選單快捷鍵
// 3. 標準分派
TranslateMessage(Msg);
DispatchMessage(Msg); // 送達目標視窗程序
Result := True;
end;
end;
Application.OnMessage 事件(最簡單)// 在專案主檔或表單建構子
Application->OnMessage = AppMessageHandler;
void __fastcall TForm1::AppMessageHandler(tagMSG &Msg, bool &Handled)
{
if (Msg.message == WM_HOTKEY) { // 全域熱鍵
Handled = true; // 吞噬訊息
// 處理邏輯...
}
}
TApplicationEvents 元件(設計時期綁定)TApplicationEvents 到表單。OnMessage 編寫處理器,效果同方法一,但支援設計時期屬性設定。TApplication 重寫虛擬方法(最強控制)class TMyApplication : public TApplication
{
protected:
virtual void __fastcall WndProc(TMessage &Message) override;
};
void __fastcall TMyApplication::WndProc(TMessage &Message)
{
// 攔截 WM_COPYDATA 實現進程間通訊
if (Message.Msg == WM_COPYDATA) {
// 處理...
return; // 不傳給基類
}
TApplication::WndProc(Message); // 必須呼叫基類
}
// 專案主檔替換 Application 實例
int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
Application = new TMyApplication(NULL);
Application->Initialize();
Application->CreateForm(__classid(TForm1), &Form1);
Application->Run();
return 0;
}
| 場景 | 推薦方法 | 理由 |
|---|---|---|
| 全域熱鍵 | OnMessage | 簡單、無需修改專案結構 |
| 訊息日誌/審計 | OnMessage | 集中記錄,Handled=false 繼續分派 |
| 攔截 WM_COPYDATA | 子類別化 | 需在分派前處理,OnMessage 可能過晚 |
| 自訂訊息泵 | 子類別化 | 完全控制 PeekMessage/DispatchMessage |
| MDI 子視窗協調 | TApplicationEvents | 設計時期可視化,支援多事件 |
OnMessage 中 Handled=true 將阻止後續分派,謹慎使用。TApplication 需在 Application->Initialize() 前替換實例。TApplication 訊息泵僅運行於主執行緒。
善用 TApplication 層訊息攔截,能實現許多表單層面無法達到的全域行為控制。