2013-08-22 10 views
5

मैं विंडोज एक्सई 2, TVirtualStringTree, और एक TComboBox का उपयोग एक संपादक के रूप में कर रहा हूं।माउस-व्हील गलत नियंत्रण पर संदेश भेज रहा है

जब मैं TComboBox सीधे फॉर्म पर रखता हूं, तो रन-टाइम पर मैं सूची को छोड़ सकता हूं और माउस व्हील सूची में वस्तुओं को ऊपर और नीचे (वांछित) स्क्रॉल करता है। हालांकि, TComboBox रन-टाइम पर TVirtualStringTree द्वारा एक इन-प्लेस संपादक के रूप में बनाया गया है, भले ही नव निर्मित कॉम्बो बॉक्स पर ध्यान केंद्रित किया गया हो, माउस व्हील का WM_MOUSEWHEEL संदेश पेड़ नियंत्रण पर भेजा गया है, न कि कॉम्बो बॉक्स।

यह स्पष्ट है क्योंकि कॉम्बो बॉक्स ड्रॉप-डाउन सूची में आइटम स्क्रॉल नहीं करते हैं। इसके बजाय, कॉम्बो बॉक्स स्क्रॉल के पीछे पेड़ नियंत्रण। कॉम्बो बॉक्स का निश्चित भाग पेड़ के साथ चलता है, लेकिन ड्रॉप-डाउन सूची कॉम्बो बॉक्स के निश्चित भाग से डिस्कनेक्ट हो जाती है और स्थानांतरित नहीं होती है (जैसा चित्रित किया गया है)।

Example of how the tree control scrolled behind the drop-down list

दोनों ही मामलों में TComboBox.StylecsDropDownList को तैयार है।

FCBox := TComboBox.Create(TreeControl); 
FCBox.Visible := False; 
FCBox.Parent := TreeControl; 
// ... add items to combo box ... 
FCBox.Visible := True; 
FCBox.SetFocus; 
FCBox.DroppedDown := True; 

यह जहां माउस मँडरा रहा है कोई फर्क नहीं पड़ता: जब कॉम्बो बॉक्स वृक्ष की यथा-स्थान संपादक के रूप में बनाया गया है, यह इस तरह से किया जाता है। यह कॉम्बो बॉक्स ड्रॉप-डाउन सूची में सीधे आइटमों पर हो सकता है और पृष्ठभूमि में पेड़ नियंत्रण अभी भी स्क्रॉल करता है। कॉम्बो बॉक्स में आइटम स्क्रॉल करने का एकमात्र तरीका इसकी स्क्रॉल बार का उपयोग करना है।

नियंत्रण नियंत्रण के माता-पिता को नियंत्रण के बजाए माउस व्हील संदेश प्राप्त करने का क्या कारण होगा (इस मामले में, TComboBox)?

+0

मुझे यह आलेख मिला (http://msdn.microsoft.com/en-us/library/windows/desktop/ms645617(v=vs.85).aspx) जो बताता है कि संदेश नियंत्रण में भेजा गया है, और यदि यह इसे संभाल नहीं करता है, तो इसे तब तक चेन भेजा जाता है जब तक इसे संभाला नहीं जाता है। मैं अब यह देखने के लिए देख रहा हूं कि 'TVirtualStringTree' ऐसा कुछ करता है जो 'TComboBox' संदेश को संभालता है। –

उत्तर

1

VirtualTrees.pasTBaseVirtualTree कक्षा में निम्नलिखित घोषणा में शामिल हैं:

private 
    procedure CMMouseWheel(var Message: TCMMouseWheel); message CM_MOUSEWHEEL; 

घटक लेखक माउस व्हील संदेशों पर कब्जा कर लिया तो वह पहले खड़ी और फिर क्षैतिज स्क्रॉल कर सकते हैं। कस्टम कोड यही कारण है कि TComboBox के बजाय माउस व्हील संदेश TVirtualStringTree पर भेजे जा रहे हैं। मैंने अपने कोड पर टिप्पणी की और TComboBox ड्रॉप-डाउन सूची अपेक्षित के रूप में स्क्रॉल की गई।

चूंकि मैं वास्तव में TBaseVirtualTree कोड को हटाना नहीं चाहता, इसलिए मैंने निम्न कोड के साथ अपना स्वयं का TMyComboBox बनाया है ताकि इन-प्लेस संपादक के रूप में उपयोग किया जा सके। अब स्क्रॉलिंग ड्रॉप-डाउन सूची और पेड़ नियंत्रण दोनों में सही ढंग से काम करता है।

interface 

type 
    TMyCombBox = class(TComboBox) 
    private 
    procedure CMMouseWheel(var Message: TCMMouseWheel); message CM_MOUSEWHEEL; 
    end; 

implementation 

procedure TMyComboBox.CMMouseWheel(var Message: TCMMouseWheel); 
begin 
    if DoMouseWheel([], Message.WheelDelta, SmallPointToPoint(Message.Pos)) then 
    Message.Result := 1; 
end; 

यह CM_MOUSEWHEEL संदेश कब्जा होने से पहले ही पेड़ नियंत्रण और यह हाथ पर कार्रवाई करने के TControl.DoMouseWheel() विधि करने के लिए भेजा जाता है।

+0

अपने इनस्थल संपादक के संदेशों को संभालने के लिए यह एक आम बात है। यदि आप ऐसा कर रहे थे, तो आप 'WM_MOUSEWHEEL' को बताएंगे कि आपने इसे (अपने इनस्थल संपादक द्वारा) संभाला है, इसलिए आपके द्वारा वर्णित कुछ भी नहीं होगा। – TLama

+0

धन्यवाद @TLama - समस्या यह है कि संदेश कभी भी इन-प्लेस संपादक को नहीं भेजा गया था।इसके बजाय, इसे तुरंत 'टीसीम्बोबॉक्स' को छोड़कर पेड़ नियंत्रण में भेजा गया था। मुझे इसे काम करने के लिए कस्टम 'टीसीम्बोबॉक्स' में संदेश को दोबारा हासिल करना पड़ा। मैं अपने जवाब में समाधान जोड़ दूंगा। –

+0

संदेश को कॉम्बो बॉक्स में भेजा गया था, लेकिन उस छोटे जानवर ने केवल अनदेखा किया (इसे संभाल नहीं लिया) :-) कॉम्बो बॉक्स में आइटम बदलना सिस्टम द्वारा नियंत्रित होता है और कुछ और नहीं के लिए कॉम्बो बॉक्स माउस व्हील का उपयोग करता है, इसलिए मुझे आश्चर्य नहीं है कि यह वीसीएल में इस संदेश को अनदेखा करता है। – TLama

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