none
About wm_touch消息获取不到 RRS feed

  • 问题

  • 目前正接触WIN7触摸编程,用c#语言开发  利用INT的GeoToolkit进行WINFORM编程,但是发现当加入INT的相关组件后WM_TOUCH消息就接受不到了,如果去掉其组件可以获得WM_TOUCH消息。

    代码如下:

    public partial class BaseMapView : UserControl
    {
     
     [DllImport("user32")]
     public static extern bool RegisterTouchWindow(System.IntPtr hWnd, TouchWindowFlag flags);
     
     private cgSimplePlot  viewPlot;  
     private void BasemapView_Load(object sender, EventArgs e)
            {
               RegisterTouchWindow( this.Handle,0);
                viewPlot = baseMapViewController.CreateBaseMapPlot(this);
                if (viewPlot != null)
                {
                    Control panel = CreatePanel(viewPlot);
                     this.Controls.Clear();
                     this.Controls.Add(panel);    (去掉这个语句可以获取WM_TOUCH消息)           
                }
                     }
            //创建绘图控件
            private Control CreatePanel(cgSimplePlot basemapPlot)
            {
                cgControlFactory factory = cgControlFactory.DefaultFactory;
                Control panel = factory.CreateScrollableControl(basemapPlot).Control;
           
          panel.Dock = DockStyle.Fill   ;
                panel.BackColor = Color.White;
                return panel;
            }

    }

    所以不能明白 是加入INT组件后消息没有传递到该控件还是,加入INT组件后就没有产生WM_TOUCH消息?

    WM_TOUCH消息的产生原理是什么,还请各位高手指教。

    • 已移动 Min Zhu 2013年5月3日 2:52 Winform问题
    • 已移动 Mike Feng 2013年5月8日 3:16
    2013年5月2日 8:50

全部回复

  • Hi Payton,

    这是因为你的panel填满了整个form,你的touch动作就发生在panel上的。

    你可以将DockStyle设成不是 fill的值,然后设置下它的位置,和大小,使得它不会覆盖完整个form,然后你再touch没有panel的区域。你的form应该就可以再次接收到这个消息了。如果你想在panel里也接收到这个消息,那么你再调用RegisterTouchWindow API,然后第一个参数为panel的handle。

    希望清楚了。


    Mike Feng
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.


    2013年5月3日 5:09
  • 非常感谢,您说的方法我们尝试过,确实如果DockStyle不是设置成FILL是可以再其他位置获取到WM_TOUCH消息。现在是想在Panel里截获WM_TOUCH并进行处理,好像还是接受不到,尝试继承INT的其他组件如cgPlotPanel(MyControl继承该类),代码如下:

               if (viewPlot != null)
                {

                 MyControl panel = new MyControl();
                      panel.Plot = viewPlot;

                    RegisterTouchWindow(panel.Handle, 0);
                    this.Controls.Add(panel);

              }

    在MyControl的窗口过程函数WndProc()中依然是获取不到WM_TOUCH消息,只能获取代号为641,7,8的消息,一直很纠结。

    能方便提供下您的联系方式吗?QQ或者邮箱,不胜感激。


    2013年5月6日 6:54
  • 你好,

    我们尽量论坛里交流吧,这样别人也能看到我们交流的过程,说不定这些交流的过程可以帮到其他人。

    我建议你先 调用这个API看看panel是否接受这个消息:http://msdn.microsoft.com/en-us/library/windows/desktop/dd372998(v=vs.85).aspx 

    我初步怀疑这里不是直接用panel的handle,我手上目前没有触屏设备,暂时不能测试这个问题。

    然后我建议你用英语这里发个新帖问问:http://social.msdn.microsoft.com/Forums/en-US/tabletandtouch/threads 这边是专门的touch类问题论坛。

    谢谢。


    Mike Feng
    MSDN Community Support | Feedback to us
    Develop and promote your apps in Windows Store
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.


    • 已编辑 Mike Feng 2013年5月7日 14:44
    • 已标记为答案 payton2010 2013年5月8日 0:12
    • 取消答案标记 payton2010 2013年5月8日 0:13
    2013年5月7日 14:43
  • 好的 ,真的是非常感谢您。我试着用您给的API,调用IsTouchWindow(),测试返回的是TURE,该控件应该是支持触摸的。
    2013年5月8日 0:08