none
触摸屏环境下,用手指操作ListBox,ListBox总是在手指抬起屏幕的时候才被选中,如何在手指按下屏幕时,指定的选项被选中? RRS feed

  • 问题

  • 在Dell Venue 11 Pro平板上面开发Winforms桌面程序。平板系统是WINDOWS8.1 PRO,

    我遇到的问题是,用手指操作ListBox的时候,ListBox总是在手指抬起屏幕的时候,手指对应的Item才被选中,

    这样带来的问题是反应不够迅速,体验不够理想。现在想在手指按下屏幕的时候,ListBox上面手指对应的Item立即被选中,请问我应该怎么做?

    我自己的思路是,在原来class ListBox的基础继承一个新的class ListBoxEx:ListBox,

    在Class ListBoxEx 里面 override WndProc,即重重写窗口程序WndProc,

    但在处理WM_POINTERDOWN的时候遇到问题,

    2018年1月18日 10:23

答案

  • 在处理wm_pointerdown消息的时候需要注意,

    在按压屏幕的时候,实际上是包函有按压点的座标信息的,

    当post WM_MOUSEDOWN消息的时候,需要把座标信息也要转换过去,一同POST过去,

    //MAKELPARAM完成座标信息转换工作

    public static int MAKELPARAM(int x, int y)
            {
                return ((y << 16) | (x & 0xFFFF));
            }

     case WM_POINTERDOWN:
                        {

                        
                            Point Pos = m.GetPointerLocation();
                            Pos = PointToClient(Pos);

                            PostMessage(m.HWnd, WM_LBUTTONDOWN, (int)m.WParam, MAKELPARAM(Pos.X, Pos.Y));
                            return;
                        }
                        break;

    internal static class MessageExtensions
        {
            //指针编号?指针号?指针就像是一个银行保险箱编号
            public static int GetPointerId(this Message msg)
            {
                return (short)msg.WParam;
            }

            public static System.Drawing.Point GetPointerLocation(this Message msg)
            {
                var lowword = msg.LParam.ToInt32();

                return new System.Drawing.Point()
                {
                    X = (short)(lowword),
                    Y = (short)(lowword >> 16),
                };
            }
        }

    • 已标记为答案 Hank1983 2018年1月27日 1:27
    2018年1月27日 1:27

全部回复

  • Hi,

    欢迎在MSDN论坛发帖。

    你在处理 WM_POINTERDOWN的时候遇到问题,有没有出现什么错误信息,这样方便大家解决问题。

    你有没有尝试在mouse_down下面写你的操作代码?

    Best Regards,

    Hart


    Please remember to click "Mark as Answer" the responses that resolved your issue, and to click "Unmark as Answer" if not. This can be beneficial to other community members reading this thread. If you have any compliments or complaints to MSDN Support, feel free to contact MSDNFSF@microsoft.com.

    2018年1月19日 7:33
    版主
  • 以下是WndProc代码块

    以下是动态添加LISTBOX控件和MOUSE_DOWN事件的代码:

    如果用上面的代码,出来的效果是像下面这样:我手指点的是第7项,当我手指触到屏幕,没抬起来时,第0项被选中。

    当我再次点击第7项,手指触到屏幕,这次被选中的是第1项,于是就这样交替着,0,1,0,1这样子,

    如果我把消息处事程序注释掉,程序直接无反应

    2018年1月19日 9:27
  • 在处理wm_pointerdown消息的时候需要注意,

    在按压屏幕的时候,实际上是包函有按压点的座标信息的,

    当post WM_MOUSEDOWN消息的时候,需要把座标信息也要转换过去,一同POST过去,

    //MAKELPARAM完成座标信息转换工作

    public static int MAKELPARAM(int x, int y)
            {
                return ((y << 16) | (x & 0xFFFF));
            }

     case WM_POINTERDOWN:
                        {

                        
                            Point Pos = m.GetPointerLocation();
                            Pos = PointToClient(Pos);

                            PostMessage(m.HWnd, WM_LBUTTONDOWN, (int)m.WParam, MAKELPARAM(Pos.X, Pos.Y));
                            return;
                        }
                        break;

    internal static class MessageExtensions
        {
            //指针编号?指针号?指针就像是一个银行保险箱编号
            public static int GetPointerId(this Message msg)
            {
                return (short)msg.WParam;
            }

            public static System.Drawing.Point GetPointerLocation(this Message msg)
            {
                var lowword = msg.LParam.ToInt32();

                return new System.Drawing.Point()
                {
                    X = (short)(lowword),
                    Y = (short)(lowword >> 16),
                };
            }
        }

    • 已标记为答案 Hank1983 2018年1月27日 1:27
    2018年1月27日 1:27