告诉大家一个奇怪的现象
建立一个窗口程序,加入一个button和一个timer,timer开始enabled=False,时间比如5s,button_click里边写timer1.enabled=true; timer_tick事件里写MessageBox.Show("aaaaa");下边运行这个程序
点击button,在5s内,开始拖动这个窗口移动,千万别释放,一直拖动窗口到处跑,等待自动弹出模式对话框,等这个对话框弹出来,你就会无论如何也不能移动这个弹出的对话框了,大家实验下是不是这样,如果是这样谁能解释下为什么。

解决方案 »

  1.   

            private void timer1_Tick(object sender, EventArgs e)
            {
                timer1.Enabled = false;
                MessageBox.Show("timer1");
            }        private void button1_Click(object sender, EventArgs e)
            {
                timer1.Enabled = true;
            }
      

  2.   

    模式窗体,弹出来的对话框是模式窗体,这个模式窗体是由Form1产生的,Form1当然就动不了,直到将模式窗体关闭
      

  3.   

     点在button上还能拖的懂么
      

  4.   

     点在button上还能拖的懂么
      

  5.   

    你们没看懂,是点击button以后,这个时候可以释放左键的,然后在计时器触发消息前,拖动form1的标题栏到处跑不要释放,等弹出模式对话框,然后这个时候你们移动下这个模式对话框看看,能不能移动,不是这个时候移动form1。
    如果以上步骤中没有拖动form1标题条的步骤,就能移动得了模式对话框。
    就是问为什么多了拖动form1标题条的步骤,模式对话框也不能被移动了。
      

  6.   

    其实不是牛角尖,实际项目中窗口多,经常出现用户拖动窗口的情况,同时有个计时器,在需要的时候要弹出一个模式对话框,效果如同的我的例子,这个时候经常出现我上边所说的症状,用户不满意,一直找不到什么原因造成的,delphi,c#的例子都作了,效果一样。
      

  7.   

    不好意思,刚才是看错,我测试了下,就算你不拖动主窗体,MessageBox对话框除了第一个可以拖动,剩下的也不能拖动
      

  8.   

    我查了一些资料,其中有如下所述:Windows消息传递:   当有鼠标活动消息时,系统发送WM_NCHITTEST   消息给窗体作为判断消息发生地的根据。假如你点击的是标题栏,窗体收到的消息值就是   HTCAPTION   ,同样地,若接受到的消息是   HTCLIENT,说明用户点击的是客户区,也就是鼠标消息发生在客户区
        之所以会出现这个怪现象,会不会是窗体收不到HTCAPTION信息? 如果是的话,会不会是因为Timer1不断产生对话框所致?  请大家一起讨论下! 
      

  9.   

    大家估计实验的时候没有注意我1楼的代码,我在Time_tick事件里,多了一行代码,首先就是停掉这个timer,所以不存在多个对话框弹出的问题,
    另外16 、17楼提供了一些思路,我也做过实验,不仅仅点击标题条移动会这样,如果这个时候点击窗口边界,对窗口改变大小也是一样的存在如上问题。
    反正都有如下特点
    1、鼠标消息只有mousedown,没有mouseup
    2、消息都是触发在非客户区
    但是为什么会这样,仍然找不到答案。