你好,欢迎你阅读此贴。开发环境:
    VS2005,Winform(C#)。问题背景:
    在一个主窗口中打开一个设置成TopMost属性的半透明子窗体,这个子窗体比较大(比主窗口小),而且显示在中间位置。这时可以继续在主窗口中操作,如果这时主窗口弹出一个模态对话框(ShowDialog)或者消息提示(MessageBox.Show),或者打开文件对话框等等,设置成TopMost属性的半透明子窗体就会遮盖住这个弹出的模式对话框,使程序不能操作,因为不能移动这个设置成TopMost属性的半透明子窗体。问题提出:
    怎样使一个设置成TopMost属性的子窗体在主窗体弹出模态对话框后可以移动?期待你的回答,谢谢。祝身体健康!

解决方案 »

  1.   

    这个有点难…因为弹出对话框类型时  主窗体会等待对话框的结果(结束,关闭,正确,等等)所以同一线程 当前来说就是主线程啦。。产生的 Topmost 窗体也是由主线程产生 而主线程都停在了 等待对话框结果 是无法对半透明窗体移动的…
      

  2.   

    C# 不一样嘛…就算使用其他线程 又有线程不能调用窗体显示的安全问题 只能用委托利用 UI主线程调用…由于时间关系没去试了 或许可以 但是也或许不可以因为 就算委托了也可能还属于UI主线程的 这样也属于同一线程的窗体  对话框会把焦点占据
      

  3.   

    没时间试了。你可以用委托尝试下 参照代码如下:
     ListenerThread()
      {
      //这是一个自由线程。不能在这里直接调用一个窗体
      FormShow();//OK
      }
      delegate void FormHandler(DataSet ds);//声明一个委托
      //定义一个方法此方法用来显示一个窗体
      private void FormShow(DataSet ds)
       {
       if (!this.InvokeRequired) //如果当前线程不是主UI线程,返回true,否则,返回false. 
       { 
       frmBills fb = new frmBills();
       fb.Show();
       fb.Display(ds);
       } 
       else 
       { 
       FormHandler fHandler = new FormHandler(this.FormShow); //创建一个新instance指向FormShow. 
       this.Invoke(fHandler, new object[] {ds}); //启动delegate 
       }
      

  4.   

    模态对话框会把其它窗口禁用,你可以在窗口被禁用之后调用EnableWindow恢复窗口。例如设置一个Timer,在Tick事件中执行EnableWindow(Handle, true);[DllImport("User32.dll")]
    static extern bool EnableWindow(IntPtr hWnd, bool bEnable);
      

  5.   

    委托和Timer,EnableWindow方法正在尝试。谢谢。
      

  6.   

            private void timer1_Tick(object sender, EventArgs e)
            {
                EnableWindow(this.Handle, true);
            }
    我试了这个方法,你们猜怎么着,成了.非常感谢.
      

  7.   

    不过不知道可不可以 不调用系统API,而用.Net里面的方法实现
      

  8.   

    把你的半透明子窗体的TopMost属性设为false
    用Show(this)的方式打开你的半透明子窗体试试,看看这是不是你想要的功能
      

  9.   

    Timer是可以的
    我做过类似的东西,把topMost属性设成false
      

  10.   


    把TopMost属性设置成false后,怎么用Timer让窗口保持在最前面呢?