.net cf textbox 文本框 GotFocus时,设置selectall 有效

18 篇文章 0 订阅
6 篇文章 0 订阅

  一直在开发wince上的应用程序,.net cf中,c#的文本框 textbox的selectall方法在getfocus事件中,并没有生效,在网上查了很长时间之后,大体明白了一点,在此做个说明:

  在电脑上,用鼠标点击文本框后, 执行getfocus事件,执行完这个事件之后,再执行mouseup事件,如果想调用selectall方法,需要在mouseup事件里调用。

  在c#的textbox中,单击文本框后,执行getfocus事件,执行完这个事件之后,再执行click事件,如果想调用selecall方法,需要在click事件里调用。

   

  问题应该明了了,在.net cf 里,我们只需要在click事件里,调用selectall方法就可以了。textbox本身不支持click事件,需要我们填加。

  原来就对textbox做了一点封装,填了一个属性和回车事件,可以设置限制输入的内容,因为也重写了selecall方法,在getfocus事件里,再调用这个方法就可以了。

 

   增加单击事件的方法,是复制的codeproject上的大师的代码,具体网址忘了。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using LZLControls.引用类;
using ZLDrivers;

namespace LZLControls
{
    public partial class ZLTextBox : TextBox, ISupportInitialize
    {
        private bool m_bSelectALL = false;

        public ZLTextBox()
        {
            InitializeComponent();

            #region 鼠标事件

            if (Environment.OSVersion.Platform == PlatformID.WinCE)
            {
                WndProcHooker.HookWndProc(this,
                new WndProcHooker.WndProcCallback(this.WM_LButtonDown_Handler),
                Win32.WM_LBUTTONDOWN);
                WndProcHooker.HookWndProc(this,
                    new WndProcHooker.WndProcCallback(this.WM_LButtonUp_Handler),
                    Win32.WM_LBUTTONUP);
            }

            #endregion
        }

        #region 设计组件 ISupportInitialize Members

        void ISupportInitialize.BeginInit()
        {
        }

        void ISupportInitialize.EndInit()
        {

        }

        #endregion



        /// <summary>
        /// 判断按下的键值,限制只能输入字母,数字
        /// </summary>
        private bool bLimitInput = false;

        protected override void OnKeyDown(KeyEventArgs e)
        {
            base.OnKeyDown(e);

            bLimitInput = true;

            if (this.numInputType == KeyBoardType.全部)
            {
                bLimitInput = false;
                return;
            }
            else if (this.numInputType == KeyBoardType.数字)
            {
                if (e.Modifiers == Keys.None)
                {
                    if (e.KeyValue >= 48 && e.KeyValue <= 57)
                    {
                        // 常规数字
                        bLimitInput = false;
                        return;
                    }
                    else if (e.KeyValue >= 96 && e.KeyValue <= 105)
                    {
                        // 小键盘
                        bLimitInput = false;
                        return;
                    }
                }

                #region 减号、小数点也做了过滤
                 减号
                //else if (bInputNumberMinus)
                //{
                //    if (e.KeyValue == 189 || e.KeyValue == 109)
                //    {

                //        bNoAllowInput = true;
                //        return;
                //    }
                //}
                else if ( e.KeyValue==190 || e.KeyValue==110 )
                {
                    // 小数点
                    bNoAllowInput = true;
                    return;
                }
                #endregion
            }
            else if (this.numInputType == KeyBoardType.字母)
            {
                if (e.KeyValue >= 65 && e.KeyValue <= 90)
                {
                    bLimitInput = false;
                    return;
                }
            }

            // ESC键、回车键,退格键,左右方向键、删除键
            if (e.KeyCode == Keys.Escape || e.KeyCode == Keys.Back || e.KeyCode == Keys.Enter || e.KeyCode == Keys.Left || e.KeyCode == Keys.Right || e.KeyCode == Keys.Delete)
            {
                bLimitInput = false;
                return;
            }
        }

        protected override void OnKeyPress(KeyPressEventArgs e)
        {
            if (e.KeyChar == '\r')
            {
                if (keyEnter != null)
                {
                    e.Handled = true;
                    keyEnter(this, new EventArgs());
                    return ;
                }
            }

             Check for the flag being set in the KeyDown event.
            if (bLimitInput)
            {
                // Stop the character from being entered into the control since it is non-numerical.
                e.Handled = true;
            }
            base.OnKeyPress(e);
        }

        #region  回车键事件

        /// <summary>
        /// 回车键事件
        /// </summary>
        /// <param name="strText"></param>
        public delegate void OnKeyEnter(object sender, EventArgs e);
        /// <summary>
        /// 回车键
        /// </summary>
        public event OnKeyEnter keyEnter = null;

        // 回车键事件
        public void OnEnter()
        {
            if (keyEnter != null)
            {
                keyEnter(this, new EventArgs());
            }
        }

        #endregion


        #region  "按键时限制输入内容的功能"

        public enum KeyBoardType
        {
            全部 = 0,
            字母,
            数字

        }

        KeyBoardType numInputType = KeyBoardType.全部;

        /// <summary>
        /// 允许输入的类型
        /// </summary>
        public KeyBoardType InputKey
        {
            get
            {
                return numInputType;
            }
            set
            {
                numInputType = value;
            }
        }

        #endregion


        #region 直接赋值时检测回车键字符

        /// <summary>
        /// 检测赋值时有回车键字符
        /// </summary>
        public override string Text
        {
            get
            {
                return base.Text;
            }
            set
            {
                base.Text = value;
                if (value.Length > 0)
                {
                    if (value.Substring(value.Length - 1, 1) == "\r")
                    {
                        base.Text = value.Substring(0, value.Length - 1);
                        if (keyEnter != null)
                        {
                            keyEnter(this, new EventArgs());
                        }
                    }
                }
            }
        }

        #endregion

         
        #region 鼠标事件

        public delegate void onClick(object sender, EventArgs e);
        public new event onClick Click;

        /// <summary>
        /// The method that gets called when a WM_NOTIFY message is received by the
        /// TextBox's parent.
        /// </summary>
        /// <param name="hwnd">The handle of the window that received the message</param>
        /// <param name="msg">The message received</param>
        /// <param name="wParam">The wParam arguments for the message</param>
        /// <param name="lParam">The lParam arguments for the message</param>
        /// <param name="handled">Set to true to indicate that this message was handled</param>
        /// <returns>An appropriate returen code for the message handled (see MSDN)</returns>
        int WM_Notify_Handler(
        IntPtr hwnd, uint msg, uint wParam, int lParam,
        ref bool handled)
        {
            Win32.NMHDR nmHdr = new Win32.NMHDR();
            System.Runtime.InteropServices.Marshal.PtrToStructure((IntPtr)lParam, nmHdr);
            switch (nmHdr.code)
            {
                case Win32.WM_LBUTTONDOWN:
                case Win32.WM_LBUTTONUP:
                    // get the cursor coordinates on the client
                    Point msgPos = Win32.LParamToPoint((int)Win32.GetMessagePos());
                    msgPos = this.PointToClient(msgPos);
                    RaiseMouseClickEvent(MouseButtons.Left, msgPos);
                    break;
                default:
                    break;
            }
            return 0;
        }
        public void OnMouseClick(MouseEventArgs e)
        {
            this.OnClick(new EventArgs());
        }

        protected override void OnClick(EventArgs e)
        {
            // 使全选功能生效
            if (m_bSelectALL)
            {
                base.SelectAll();
                m_bSelectALL = false;
            }

            base.OnClick(e);
        }


        #region 此函数暂时不需要,对控件隐藏
        /// <summary>
        /// Raises the MouseClick event with the specified handle.
        /// </summary>
        /// <param name="hNode">The handle of the node for which the event is raised</param>
        /// <param name="button">The [mouse] buttons that were pressed to raise the event</param>
        /// <param name="coords">The [client] cursor coordinates at the time of the event</param>
        private void RaiseMouseClickEvent(MouseButtons button, Point coords)
        {

            MouseEventArgs e = new MouseEventArgs(button, 1, coords.X, coords.Y, 0);

            OnMouseClick(e);
        }
        #endregion

        // The callback called when the window receives a WM_LBUTTONDOWN
        // message. We capture the mouse and draw the button in the "pushed"
        // state.
        // hwnd - The handle to the window that received the
        // message.
        // wParam - Indicates whether various virtual keys are
        // down.
        // lParam - The coordinates of the cursor.
        // handled - Set to true if we don't want to pass this
        // message on to the original window procedure.
        // Returns zero if we process this message.
        int WM_LButtonDown_Handler(
            IntPtr hwnd, uint msg, uint wParam, int lParam,
            ref bool handled)
        {
            // Start capturing the mouse input.
            this.Capture = true;
            // someone clicked on us so grab the focus
            if (!this.Focused)
            {
                this.Focus();

                // We have handled this windows message and we don't want the
                // sub-classed window to do anything else.
                handled = true;
            }

            return 0;
        }
        // The callback called when the window receives a WM_LBUTTONUP
        // message. We release capture on the mouse, draw the button in the
        // "un-pushed" state and fire the  OnMouseUp event if the cursor was
        // let go of inside our client area.
        // hwnd - The handle to the window that received the
        // message
        // wParam - Indicates whether various virtual keys are
        // down.
        // lParam - The coordinates of the cursor
        // handled - Set to true if we don't want to pass this
        // message
        // on to the original window procedure
        // Returns zero if we process this message.
        int WM_LButtonUp_Handler(
            IntPtr hwnd, uint msg, uint wParam, int lParam,
            ref bool handled)
        {
            this.Capture = false;
            // TODO : implement your login on mouse key up event

            Click(this, null);

            handled = true;
            return 0;
        }

        #endregion

        private void ZLTextBox_GotFocus(object sender, EventArgs e)
        {
            m_bSelectALL = false;
        }

        public new void SelectAll()
        {
            m_bSelectALL = true;
            base.SelectAll();
        }
    }
}
 
 
api声明
    /// <summary>
        /// A callback to a Win32 window procedure (wndproc)
        /// </summary>
        /// <param name="hwnd">The handle of the window receiving a message</param>
        /// <param name="msg">The message</param>
        /// <param name="wParam">The message's parameters (part 1)</param>
        /// <param name="lParam">The message's parameters (part 2)</param>
        /// <returns>A integer as described for the given message in MSDN</returns>
        public delegate int WndProc(IntPtr hwnd, uint msg, uint wParam, int lParam);

        public const uint WM_NOTIFY = 0x4E;
        public const uint WM_LBUTTONDOWN = 0x0201;
        public const uint WM_LBUTTONUP = 0x0202;

        //public enum WM
        //{
        //    LBUTTONDOWN = 0x0201,
        //    LBUTTONUP = 0x0202
        //}

        [System.Runtime.InteropServices.StructLayout(LayoutKind.Sequential)]
        public class NMHDR
        {
            public IntPtr hwndFrom;
            public uint idFrom;
            public uint code;
        }



        /// <summary>
        /// Helper function to convert a Windows lParam into a Point
        /// </summary>
        /// <param name="lParam">The parameter to convert</param>
        /// <returns>A Point where X is the low 16 bits and Y is the
        /// high 16 bits of the value passed in</returns>
        public static Point LParamToPoint(int lParam)
        {
            uint ulParam = (uint)lParam;
            return new Point(
                (int)(ulParam & 0x0000ffff),
                (int)((ulParam & 0xffff0000) >> 16));
        }


#if DESKTOP
        [DllImport("user32.dll")]
#else
        [DllImport("coredll.dll")]
#endif
        public extern static int DefWindowProc(IntPtr hwnd, uint msg, uint wParam, int lParam);


#if DESKTOP
        [DllImport("user32.dll")]
#else
        [DllImport("coredll.dll")]
#endif
        public extern static IntPtr SetWindowLong(IntPtr hwnd, int nIndex, IntPtr dwNewLong);

        public const int GWL_WNDPROC = -4;

#if DESKTOP
        [DllImport("user32.dll")]
#else
        [DllImport("coredll.dll")]
#endif
        public extern static int CallWindowProc(IntPtr lpPrevWndFunc, IntPtr hwnd, uint msg, uint wParam, int lParam);


#if DESKTOP
        [DllImport("user32.dll")]
#else
        [DllImport("coredll.dll")]
#endif
        public extern static uint GetMessagePos();

       
        [DllImport("user32.dll", EntryPoint="SendMessage")]
        public static extern uint SendMessageXP(IntPtr hwnd, uint msg, uint wparam, uint lparam);

        [DllImport("coredll.dll", EntryPoint="SendMessage")]
        public static extern uint SendMessageCE(IntPtr hwnd, uint msg, uint wparam, uint lparam);

        public static uint SendMessage(IntPtr hwnd, uint msg, uint wparam, uint lparam)
        {
            if ( Environment.OSVersion.Platform==PlatformID.WinCE )
            {
                return SendMessageCE(hwnd, msg, wparam, lparam);
            }
            else
            {
                return SendMessageXP(hwnd, msg, wparam, lparam);
            }
        }

    }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值