2011-03-14 12 views
5

मेरे पास एक रूप में एक TListView घटक है। यह काफी लंबा है और मैं चाहता हूं कि उपयोगकर्ता इसे स्क्रॉल करने में सक्षम हो, अगर माउस घटक पर है और पहिया स्क्रॉल किया गया है। मुझे TListView ऑब्जेक्ट के लिए कोई ऑनमहाउसहेल, ऑनमोउसहेलडाउन या ऑनमोउसहेलअप ईवेंट नहीं मिला है। मैं उसे कैसे कर सकता हूँ?TListView और माउस व्हील स्क्रॉलिंग

सादर, evilone

उत्तर

6

यहाँ यह करने के लिए मेरे कोड है:

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; 
+1

कि पर्याप्त है? मैंने सोचा कि पहिया संदेश हमेशा कर्सर के नीचे खिड़की पर नहीं जाते हैं, वे शीर्ष स्तर की खिड़की (डेल्फी फॉर्म) पर जाते हैं; तो सूची दृश्य हमेशा उन्हें प्राप्त नहीं कर रहा है। मुझे पता है कि मुझे फ़्रेम में प्रोजेक्ट टोपी आवश्यक व्हील संदेशों के लिए बहुत से संदेश-अग्रेषण करना था। –

+0

@Cosmin हां यह पर्याप्त है! –

+1

@ डेविड, मेरी परियोजना में मैं सीधे WM_MOUSEHWHEEL को संभालने की कोशिश कर रहा था, और संदेश ठीक से बहता नहीं था (मैं कभी-कभी इसे फ्रेम पर प्राप्त करता हूं, कभी-कभी फॉर्म पर, कभी-कभी फ्रेम और रूप दोनों पर)। मुझे इस समस्या का सामना करने और मेरे हैक को विकसित करने के लिए एक और 5 मिनट का पता लगाने में 5 मिनट लग गए। अब 'TControl.WndProc() 'में कोड पढ़ रहा है, मैंने अंततः इसे समझ लिया: व्हील संदेश आवश्यक नहीं है WM_MOUSEWHEEL (क्योंकि WM_MOUSEWHEEL WM_MOUSELAST के बराबर है)। यही कारण है कि (ए) मुझे हमेशा संदेश नहीं मिला और (बी) मुझे कभी-कभी संदेश दो बार मिला। धन्यवाद और +1। –

संबंधित मुद्दे