5

मैं माउस दर्ज करने/संदेशों को CM_MOUSEENTER और CM_MOUSELEAVE पर जाने का प्रयास कर रहा हूं लेकिन यह इसे पकड़ नहीं रहा है। मुझसे यहां क्या गलत हो रहा है?माउस एंटर/संदेश पोस्ट नहीं कर रहे हैं?

type 
    TMyControl = class(TCustomControl) 
    private 
    procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER; 
    procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE; 
    procedure WMNCHitTest(var Message: TWMNCHitTest); message WM_NCHITTEST; 
    end; 

procedure TMyControl.CMMouseEnter(var Message: TMessage); 
begin 
    //Handle mouse entering 
    //Breakpoint never reached, procedure never called 
end; 

procedure TMyControl.CMMouseLeave(var Message: TMessage); 
begin 
    //Handle mouse leaving 
    //Breakpoint never reached, procedure never called 
end; 

procedure TMyControl.WMNCHitTest(var Message: TWMNCHitTest); 
var 
    Ch: Bool; 
begin 
    if csDesigning in ComponentState then 
    Message.Result := HTCLIENT 
    else begin 
    Ch:= False; 

    //Do checks and pass `Ch:= True;` if something changed... 

    if Ch then Invalidate; 
    end; 
end; 
+1

मेरी पहली टिप्पणी ऐसी सामग्री की निगरानी के लिए ब्रेकपॉइंट्स का उपयोग नहीं करती है। जब आप डीबगर में स्विच करते हैं तो यूआई इंटरैक्शन हमेशा गड़बड़ हो जाता है। किसी अन्य विंडो पर संदेश भेजने के लिए कोडेसाइट जैसे कुछ का उपयोग करें, और सुनिश्चित करें कि निगरानी करते समय फोकस न बदलें। – mj2008

उत्तर

7

मैं पता लगा मेरी समस्या: मैं भी WM_NCHITTEST, जहाँ मैं नहीं गुजर रहा था inherited; उपयोग कर रहा हूँ। मैंने इसे जोड़ा, और अब यह ठीक काम करता है।

+0

'Wm_NCHitTest' वैसे भी गलत जगह की तरह लगता है। यह एक संदेश है जब ओएस भेजता है जब यह जानना चाहता है कि एक निश्चित बिंदु का नियंत्रण किस हिस्से का प्रतिनिधित्व करता है। इसका मतलब यह भी नहीं है कि माउस वर्तमान में * उस बिंदु पर * है। क्या कुछ बदल गया है यह जांचने के साथ क्या करना है? शायद आप 'wm_MouseMove' चाहते हैं? या जैसे ही कुछ बदलता है, बस 'अमान्य' को कॉल करें, इसलिए आपने बाद में जांच नहीं की है। –

+0

यह मेरी अपनी आंतरिक जांच है, यह कोड के बारे में 30 लाइनों जो स्थिति है, तो यह एक वैध स्थिति खत्म हो गया है देखने के लिए जाँच कर रहा है है - वास्तव में क्या यह करने के लिए होती है। मैंने सोचा कि हिस्सा अप्रासंगिक था इसलिए मैंने इसे बाहर रखा और इसे एक टिप्पणी के साथ बदल दिया। –

+0

यदि आप निर्णय लेने के अलावा कुछ और कर रहे हैं कि 'Message.Result' को कितना मूल्य असाइन करना है, तो आप इसे गलत संदेश हैंडलर में कर रहे हैं। साथ ही, ध्यान दें कि आपके उत्तर में आपके द्वारा वर्णित परिवर्तन के साथ, जब आप कुछ भी नहीं बदलते हैं तो आप ओएस को केवल वैध मान वापस कर देंगे। आपको फ़ंक्शन के शीर्ष पर बिना शर्त रूप से 'विरासत में' कॉल करने पर विचार करना चाहिए। फिर आप 'कंपोनेंटस्टेट' की जांच करने के बाद विशेष असाइनमेंट को हटा सकते हैं और इसके बजाय बाहर निकलें। –