none
panel 選軸捆動與 textbox 疑問 RRS feed

  • 問題

  • 現在是這樣

    當程式運行時或者按了某些鍵

    會觸發textbox.focus();

    就是可以直接輸入了

    不用滑鼠再去點

    但是我panel框框裡面有卷軸有設

    panel.focus();

    這樣才可以在裡面用綑輪捆動(我需要的是滑鼠在panel裡面才可以捆動)

    但是這樣一作反到textbox.focus();變成無功效了

    我想要的是滑鼠在panel裡面可以捆動並且textbox可以直接打字

    如何辦到



    • 已編輯 bob76012 2013年5月10日 上午 11:22
    2013年5月10日 上午 11:21

解答

  • 您好

    如果你的 TextBox 是在 Panel 中,直接設定 TextBox.Focus(); 在 Panel 的 Scroll 還是可以透過滑鼠捲動。

    如果還有問題的話,請提供 Form 畫面配置截圖。


    歡迎參觀我的Blog【菜鳥自救會】

    • 已提議為解答 亂馬客 2013年5月11日 下午 02:39
    • 已標示為解答 bob76012 2013年5月11日 下午 06:26
    2013年5月11日 上午 03:00
    版主
  • 您好,

    就像版大說的,如果您的textbox不在panel之中的話,在mouse 在panel上是沒有作用的哦!

    剛才在網路上有找到解法,您看看是否合適,請參考以下link,

    Mouse Wheel Event (C#)

    1.您的form要實作 IMessageFilter

    2.加入PreFilterMessage method

    小弟測試的Code如下,請參考,

    using System;
    using System.ComponentModel;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form, IMessageFilter
        {
            // 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);
    
            public Form1()
            {
                InitializeComponent();
                Application.AddMessageFilter(this);
                //this.panel1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.Panel_MouseWheel);
            }
            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() & 0xffff, m.LParam.ToInt32() >> 16);
                    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;
            }
        }
    }
    

    不過,如果您的TextBox在Panel中的話,就不用這麼麻煩了~

    希望對您有幫助!

     


    blog: http://www.dotblogs.com.tw/rainmaker/

    • 已標示為解答 bob76012 2013年5月11日 下午 06:26
    2013年5月11日 下午 03:03

所有回覆

  • 您好

    如果你的 TextBox 是在 Panel 中,直接設定 TextBox.Focus(); 在 Panel 的 Scroll 還是可以透過滑鼠捲動。

    如果還有問題的話,請提供 Form 畫面配置截圖。


    歡迎參觀我的Blog【菜鳥自救會】

    • 已提議為解答 亂馬客 2013年5月11日 下午 02:39
    • 已標示為解答 bob76012 2013年5月11日 下午 06:26
    2013年5月11日 上午 03:00
    版主
  • 您好,

    就像版大說的,如果您的textbox不在panel之中的話,在mouse 在panel上是沒有作用的哦!

    剛才在網路上有找到解法,您看看是否合適,請參考以下link,

    Mouse Wheel Event (C#)

    1.您的form要實作 IMessageFilter

    2.加入PreFilterMessage method

    小弟測試的Code如下,請參考,

    using System;
    using System.ComponentModel;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form, IMessageFilter
        {
            // 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);
    
            public Form1()
            {
                InitializeComponent();
                Application.AddMessageFilter(this);
                //this.panel1.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.Panel_MouseWheel);
            }
            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() & 0xffff, m.LParam.ToInt32() >> 16);
                    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;
            }
        }
    }
    

    不過,如果您的TextBox在Panel中的話,就不用這麼麻煩了~

    希望對您有幫助!

     


    blog: http://www.dotblogs.com.tw/rainmaker/

    • 已標示為解答 bob76012 2013年5月11日 下午 06:26
    2013年5月11日 下午 03:03