2009-12-02 7 views
5

मैंने गतिशील रूप से एक पैनल में 20 चित्र बॉक्स जोड़े हैं और जब मैं माउस व्हील का उपयोग करता हूं तो पैनल स्क्रॉल देखना चाहता हूं। इसे लागू करने के लिए मैंने पैनल नियंत्रण पर ऑटोस्कोल को सही करने की कोशिश की है। कोड यहाँ है। के लिए मैं पूर्णांक के रूप में = 1 20 करने के लिए:मूसहेल स्क्रॉल?

 Dim b As New PictureBox() 
     b.Image = Nothing 
     b.BorderStyle = BorderStyle.FixedSingle 
     b.Text = i.ToString() 
     b.Size = New Size(60, 40) 
     b.Location = New Point(0, (i * b.Height) - b.Height) 
     b.Parent = Panel1 
     Panel1.Controls.Add(b) 
    Next 

मैं बटन पर नियंत्रण के साथ ऐसा ही किया था और यह सिर्फ ठीक काम करता है। के लिए मैं पूर्णांक के रूप में = 1 100 करने के लिए:

 Dim b As New Button() 

     b.Text = i.ToString() 
     b.Size = New Size(60, 40) 
     b.Location = New Point(0, (i * b.Height) - b.Height) 
     b.Parent = Panel1 
     Panel1.Controls.Add(b) 
    Next 

यह "बटन" नियंत्रण के लिए काम करता है, लेकिन "picturebox" या "लेबल" नियंत्रण के लिए नहीं? मैं 'mousewheel' का उपयोग कर स्क्रॉलिंग प्रभाव को कैसे कार्यान्वित कर सकता हूं?

उत्तर

6

पैनल मूसहेल के साथ स्क्रॉल करता है जब उसके अंदर या उसके नियंत्रण में फोकस होता है। जिस समस्या में आप चल रहे हैं वह यह है कि जब आप उस पर क्लिक करते हैं तो न तो पिक्चरबॉक्स और न ही पैनल फोकस प्राप्त करता है। यदि आप पैनल पर select() पर कॉल करते हैं, तो आप देखेंगे कि माउस व्हील फिर से काम करना शुरू कर देता है।

एक संभव समाधान पैनल का चयन किया जाएगा जब भी माउस कर्सर यह प्रवेश करती है, Control.MouseEnter घटना से निपटने के द्वारा: खिड़की के

void panel1_MouseEnter(object sender, EventArgs e) 
{ 
    panel1.select(); 
} 
3

"cwick" है बहुत सही, विंडोज पदों WM_MOUSWHEEL अधिसूचना उस पर ध्यान केंद्रित है। जब आप पैनल में बटन डालते हैं तो यह काम करता है क्योंकि यह फोकस प्राप्त कर सकता है। अगली बात यह होती है कि विंडोज संदेश लेने के लिए अभिभावक नियंत्रण की तलाश में रहता है। बटन इसकी परवाह नहीं करेगा, यह अभिभावक पैनल है और यह खुशी से संदेश को स्क्रॉल और उपभोग करेगा।

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

using System; 
using System.ComponentModel; 
using System.Drawing; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 

namespace WindowsApplication1 { 
    public partial class Form1 : Form, IMessageFilter { 
    public Form1() { 
     InitializeComponent(); 
     Application.AddMessageFilter(this); 
    } 

    public bool PreFilterMessage(ref Message m) { 
     if (m.Msg == 0x20a) { 
     // WM_MOUSEWHEEL, find the control at screen position m.LParam 
     Point pos = new Point(m.LParam.ToInt32()); 
     IntPtr hWnd = WindowFromPoint(pos); 
     if (hWnd != IntPtr.Zero && hWnd != m.HWnd && Control.FromHandle(hWnd) != null) { 
      SendMessage(hWnd, m.Msg, m.WParam, m.LParam); 
      return true; 
     } 
     } 
     return false; 
    } 

    // P/Invoke declarations 
    [DllImport("user32.dll")] 
    private static extern IntPtr WindowFromPoint(Point pt); 
    [DllImport("user32.dll")] 
    private static extern IntPtr SendMessage(IntPtr hWnd, int msg, IntPtr wp, IntPtr lp); 
    } 
} 

खबरदार है कि इस कोड अपने अनुप्रयोग में किसी भी खिड़की के लिए सक्रिय है: यह नमूना कोड माउस के तहत नियंत्रण के बजाय नियंत्रण है कि ध्यान केंद्रित किया स्क्रॉल करता है। सुनिश्चित करें कि आप इसे आज़माएं और सत्यापित करें कि यह उपयोगकर्ता को बहुत अधिक भ्रमित नहीं करेगा।

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