BCB DBGridプーリローリング
2557 ワード
BCBのDBGridはマウスホイールスクロールをサポートせず、ScrolBarの上下キーをクリックして移動するしかなく、不便である.
コードライター:妖兄
個人パッケージのクラス:
コードライター:妖兄
FARPROC pOldProc = NULL; // DBGrid WindowProc
//---------------------------------------------------------------------------
// DBGrid WindowProc
LRESULT CALLBACK DBGridProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
// Window
if (uMsg == WM_MOUSEWHEEL)
{
if ((short)HIWORD(wParam) > 0)
{
::PostMessage(hWnd, WM_VSCROLL, SB_LINEUP, 0);
}
else
{
::PostMessage(hWnd, WM_VSCROLL, SB_LINEDOWN, 0);
}
}
// DBGrid WindowProc
return (::CallWindowProc(pOldProc, hWnd, uMsg, wParam, lParam));
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormShow(TObject *Sender)
{
//
pOldProc = (FARPROC)::SetWindowLong(DBGrid->Handle, GWL_WNDPROC, (long)DBGridProc);
}
//---------------------------------------------------------------------------
void __fastcall TMainForm::FormClose(TObject *Sender, TCloseAction &Action)
{
//
::SetWindowLong(this->DBGrid->Handle, GWL_WNDPROC, (long)pOldProc);
}
個人パッケージのクラス:
#ifndef REPLACEPROC_H
#define REPLACEPROC_H
#include <windows.h>
#include <map>
using namespace std;
class ReplaceDBGridWndProc
{
static map<HWND,WNDPROC> s_MapofOldProc;
static WNDPROC s_OldWndProc;
static LRESULT CALLBACK NewWndProc(HWND hwnd,UINT message,WPARAM wParam,LPARAM lParam)
{
if (message == WM_MOUSEWHEEL)
{
if ((short)HIWORD(wParam) > 0)
{
::PostMessage(hwnd, WM_VSCROLL, SB_LINEUP, 0);
}
else
{
::PostMessage(hwnd, WM_VSCROLL, SB_LINEDOWN, 0);
}
}
map<HWND,WNDPROC>::iterator it=s_MapofOldProc.find(hwnd);
LRESULT result;
if(it!=s_MapofOldProc.end())
result=CallWindowProc(it->second,hwnd,message,wParam,lParam);
else
result=DefWindowProc(hwnd,message,wParam,lParam);
return result;
}
public:
static void ReplaceWndProc(HWND hwnd)
{
s_MapofOldProc[hwnd]=(WNDPROC)SetWindowLong(hwnd,GWL_WNDPROC,(LONG)NewWndProc);
}
};
WNDPROC ReplaceDBGridWndProc::s_OldWndProc=NULL;
map<HWND,WNDPROC> ReplaceDBGridWndProc::s_MapofOldProc;
extern ReplaceDBGridWndProc g_ReplaceProc;
#endif