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

DBGrid 滑鼠滾輪支援:子類化 (SetWindowLong/GWL_WNDPROC) 攔截 WM_MOUSEWHEEL

     編輯:VC 教學

痛點

DBGrid 預設不響應滑鼠滾輪,需自行實現垂直捲動。

子類化方案

  1. 全域 `FARPROC OldProc` 保存原 `WindowProc`。
  2. 自訂 `DBGridProc`:攔截 `WM_MOUSEWHEEL`,`HIWORD(wParam) > 0` 向上 (`SB_LINEUP`),否則向下 (`SB_LINEDOWN`),發送 `WM_VSCROLL` 給自身;其他訊息 `CallWindowProc` 轉原處理。
  3. `FormShow` 時:`OldProc = (FARPROC)SetWindowLong(DBGrid->Handle, GWL_WNDPROC, (LONG)DBGridProc);`
  4. `FormClose` 時:`SetWindowLong(DBGrid->Handle, GWL_WNDPROC, (LONG)OldProc);` 還原。

完整代碼


FARPROC OldProc = NULL;

LRESULT CALLBACK DBGridProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    if (uMsg == WM_MOUSEWHEEL) {
        if ((short)HIWORD(wParam) > 0)
            PostMessage(hWnd, WM_VSCROLL, SB_LINEUP, 0);
        else
            PostMessage(hWnd, WM_VSCROLL, SB_LINEDOWN, 0);
    }
    return CallWindowProc(OldProc, hWnd, uMsg, wParam, lParam);
}

void __fastcall TMainForm::FormShow(TObject *Sender)
{
    // ... 連線資料庫 ...
    OldProc = (FARPROC)SetWindowLong(DBGrid->Handle, GWL_WNDPROC, (LONG)DBGridProc);
}

void __fastcall TMainForm::FormClose(TObject *Sender, TCloseAction &Action)
{
    SetWindowLong(DBGrid->Handle, GWL_WNDPROC, (LONG)OldProc);
    // ... 斷線 ...
}

優點

  • 無需修改 VCL 原始碼、無需繼承新類別。
  • 通用於任何 `TDBGrid` 實例,只需在 Form 事件掛載/卸載。
  • 效能極佳,僅攔截單一訊息。

64 位元注意

用 `SetWindowLongPtr`/`GetWindowLongPtr`、`LONG_PTR`、`GWLP_WNDPROC` 替代,避免指標截斷。

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