यहाँ यह करने के लिए मेरे कोड है:
type
TMyListView = class(TListView)
protected
function DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint): Boolean; override;
function DoMouseWheelUp(Shift: TShiftState; MousePos: TPoint): Boolean; override;
end;
type
TMouseWheelDirection = (mwdUp, mwdDown);
function GenericMouseWheel(Handle: HWND; Shift: TShiftState; WheelDirection: TMouseWheelDirection): Boolean;
var
i, ScrollCount, Direction: Integer;
Paging: Boolean;
begin
Result := ModifierKeyState(Shift)=[];//only respond to un-modified wheel actions
if Result then begin
Paging := DWORD(Mouse.WheelScrollLines)=WHEEL_PAGESCROLL;
ScrollCount := Mouse.WheelScrollLines;
case WheelDirection of
mwdUp:
if Paging then begin
Direction := SB_PAGEUP;
ScrollCount := 1;
end else begin
Direction := SB_LINEUP;
end;
mwdDown:
if Paging then begin
Direction := SB_PAGEDOWN;
ScrollCount := 1;
end else begin
Direction := SB_LINEDOWN;
end;
end;
for i := 1 to ScrollCount do begin
SendMessage(Handle, WM_VSCROLL, Direction, 0);
end;
end;
end;
function TMyListView.DoMouseWheelDown(Shift: TShiftState; MousePos: TPoint): Boolean;
begin
//don't call inherited
Result := GenericMouseWheel(Handle, Shift, mwdDown);
end;
function TMyListView.DoMouseWheelUp(Shift: TShiftState; MousePos: TPoint): Boolean;
begin
//don't call inherited
Result := GenericMouseWheel(Handle, Shift, mwdUp);
end;
GenericMouseWheel
काफी गंधा है। यह एक लंबवत स्क्रॉल बार के साथ किसी भी नियंत्रण के लिए काम करता है। मैं इसे पेड़ के दृश्यों, सूची दृश्यों, सूची बक्से, मेमो, समृद्ध संपादन आदि के साथ उपयोग करता हूं।
आप मेरी ModifierKeyState
दिनचर्या खो देंगे लेकिन आप यह जांचने के लिए अपनी स्वयं की विधि को प्रतिस्थापित कर सकते हैं कि व्हील इवेंट संशोधित नहीं है। कारण आप ऐसा करना चाहते हैं, उदाहरण के लिए, CTRL + माउस व्हील स्क्रॉल के बजाय ज़ूम का अर्थ है।
क्या इसके लायक है के लिए, यह इस तरह दिखता है:
type
TModifierKey = ssShift..ssCtrl;
TModifierKeyState = set of TModifierKey;
function ModifierKeyState(Shift: TShiftState): TModifierKeyState;
const
AllModifierKeys = [low(TModifierKey)..high(TModifierKey)];
begin
Result := AllModifierKeys*Shift;
end;
स्रोत
2011-03-14 10:21:29
कि पर्याप्त है? मैंने सोचा कि पहिया संदेश हमेशा कर्सर के नीचे खिड़की पर नहीं जाते हैं, वे शीर्ष स्तर की खिड़की (डेल्फी फॉर्म) पर जाते हैं; तो सूची दृश्य हमेशा उन्हें प्राप्त नहीं कर रहा है। मुझे पता है कि मुझे फ़्रेम में प्रोजेक्ट टोपी आवश्यक व्हील संदेशों के लिए बहुत से संदेश-अग्रेषण करना था। –
@Cosmin हां यह पर्याप्त है! –
@ डेविड, मेरी परियोजना में मैं सीधे WM_MOUSEHWHEEL को संभालने की कोशिश कर रहा था, और संदेश ठीक से बहता नहीं था (मैं कभी-कभी इसे फ्रेम पर प्राप्त करता हूं, कभी-कभी फॉर्म पर, कभी-कभी फ्रेम और रूप दोनों पर)। मुझे इस समस्या का सामना करने और मेरे हैक को विकसित करने के लिए एक और 5 मिनट का पता लगाने में 5 मिनट लग गए। अब 'TControl.WndProc() 'में कोड पढ़ रहा है, मैंने अंततः इसे समझ लिया: व्हील संदेश आवश्यक नहीं है WM_MOUSEWHEEL (क्योंकि WM_MOUSEWHEEL WM_MOUSELAST के बराबर है)। यही कारण है कि (ए) मुझे हमेशा संदेश नहीं मिला और (बी) मुझे कभी-कभी संदेश दो बार मिला। धन्यवाद और +1। –