首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

C++Builder 非視覺元件訊息處理技巧:隱藏視窗法

     編輯:VC 教學

非視覺元件(繼承自 TComponent)沒有視窗控制代碼(HWND),因此無法直接接收 Windows 訊息。解決之道是為元件建立一個隱藏視窗,並指派自訂的視窗程序(WndProc)來處理訊息。本文以建立 TTest 元件為例,完整示範實作步驟。

核心三要素

  1. 私有 HWND 變數: 儲存隱藏視窗的控制代碼。
  2. 自訂 WndProc 函數: 處理送達該視窗的訊息,簽名需為 void __fastcall WndProc(TMessage &Msg)。
  3. 呼叫 AllocateHWnd: 在建構函式中呼叫 FHandle = AllocateHWnd(WndProc) 建立視窗並綁定處理函數;在解構函式中呼叫 DeallocateHWnd(FHandle) 釋放。

完整程式碼範例

標頭檔 (Unit1.h)

class PACKAGE TTest : public TComponent {
private:
    HWND FHandle;
    void __fastcall WndProc(TMessage &Msg);
protected:
public:
    __fastcall TTest(TComponent* Owner);
    __fastcall ~TTest();
    void DoIt(); // 測試用公有方法
__published:
};

實作檔 (Unit1.cpp)

__fastcall TTest::TTest(TComponent* Owner) : TComponent(Owner) {
    FHandle = AllocateHWnd(WndProc); // 建立隱藏視窗
}

__fastcall TTest::~TTest() {
    DeallocateHWnd(FHandle); // 釋放視窗
}

void __fastcall TTest::WndProc(TMessage &Msg) {
    // 這裡處理自訂訊息或系統訊息
    // 例如:if (Msg.Msg == WM_MYCUSTOM) { ... }
    // 必須呼叫預設處理以避免訊息丟失
    // 但非視覺元件通常無預設視窗程序,視需求決定
}

void TTest::DoIt() {
    // 測試:向自己發送訊息
    PostMessage(FHandle, WM_USER + 1, 0, 0);
}

應用場景

  • 非視覺元件需回應全域熱鍵(RegisterHotKey)。
  • 實作元件間的非同步通訊(PostMessage)。
  • 攔截特定系統廣播訊息(如裝置變更 WM_DEVICECHANGE)。

此技巧是 VCL 內部元件(如 TTimer、TApplication)處理訊息的基礎機制,掌握它能讓你開發功能更強大的非視覺元件。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved