2011-11-10 3 views
6

हाय मेरे पास कई फ्रेम के साथ एक रूप है।डेल्फी 7 - फॉर्म में एम्बेडेड फ्रेम्स के लिए माउसहेल ईवेंट हैंडलिंग?

कुछ फ्रेम के लिए, मैं सामग्री को स्क्रॉल करना चाहता हूं (या कम से कम mousewheel घटना को संभालना चाहता हूं)।

मैं कोशिश की है निम्नलिखित:

आप प्रत्येक फ्रेम

माता पिता फार्म के लिए माउसव्हील घटना ओवरराइड के लिए एक OnMouseWheel ईवेंट हैंडलर बताए:

procedure TFmReview.MouseWheelHandler(var Message: TMessage); 
var Control: TControl; 
begin 
    Control := ControlAtPos(ScreenToClient(SmallPointToPoint(TWMMouseWheel(Message).Pos)), False, True); 
    if Assigned(Control) and (Control <> ActiveControl) then 
    begin 
     ShowMessage(Control.Name); 
     Message.Result := Control.Perform(CM_MOUSEWHEEL, Message.WParam, Message.LParam); 
     if Message.Result = 0 then 
      Control.DefaultHandler(Message); 
    end else inherited MouseWheelHandler(Message); 
end; 

दुर्भाग्य से दोनों न काम करने के लिए लग रहे हैं।

  • मामले में 1, ईवेंट कभी ट्रिगर नहीं होता है, हालांकि पैरेंट माउस माउस व्हील हैंडलर ट्रिगर होता है।
  • 2 मामले में, फोकस प्राप्त करने वाला नियंत्रण वह पैनल है जो फ्रेम रखता है जिसे मैं mousewheel ईवेंट भेजना चाहता हूं।

तो, बस रखें, मैं माउस कर्सर खत्म होने वाले शीर्ष नियंत्रण के लिए mousewheel ईवेंट को कैसे निर्देशित कर सकता हूं (इस पर ध्यान दिए बिना कि कौन सा फ्रेम/पैरेंट/फॉर्म आदि कर्सर है)?

+0

पर [इन अतः जवाब] एक नजर डालें [ 1] वे शायद मदद करेंगे। [1]: http://stackoverflow.com/questions/2472743/what-is-the-best-method-for-implementing-mouse-wheel-activity-in-delphi-vcl-form –

+0

संभावित डुप्लिकेट [माउस व्हील इनपुट को ध्यान केंद्रित करने के बजाय कर्सर के नीचे नियंत्रण के लिए कैसे निर्देशित करें?] (http://stackoverflow.com/questions/2251019/how-to-direct-the-mouse-wheel-input-to-control -under-कर्सर-बदले में केंद्रित) – Kromster

उत्तर

1

एक TWinControl जिस पर वर्तमान में माउस कर्सर है के लिए माउस व्हील से निपटने को स्थगित करने के लिए, अपने मुख्य फ्रेम में ओवरराइड इस तरह के कोड का उपयोग MouseWheelHandler विधि फार्म:

type 
    TMainForm = class(TForm) 
    private 
    procedure MouseWheelHandler(var AMessage: TMessage); override; 
    public 
    { Public declarations } 
    end; 

implementation 

procedure TMainForm.MouseWheelHandler(var AMessage: TMessage); 
var 
    Control: TWinControl; 
begin 
    Control := FindVCLWindow(SmallPointToPoint(TWMMouseWheel(AMessage).Pos)); 
    if Assigned(Control) then 
    begin 
    AMessage.Result := Control.Perform(CM_MOUSEWHEEL, AMessage.WParam, 
     AMessage.LParam); 
    if AMessage.Result = 0 then 
     Control.DefaultHandler(AMessage); 
    end 
    else 
    inherited MouseWheelHandler(AMessage); 
end; 
+0

किसी कारण से यह कोड StackOverflow उत्पन्न करता है जब मैं TMainForm से ऊपर स्क्रॉल करता हूं – Kromster

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