软件中的“查找窗体”的效果,如word、visual studio等等。
注意我要实现的不是功能是窗体的效果效果描述:
1.窗体焦点
如,在VS2008中,在查找窗口打开并获得焦点的情况下,点工具栏上的调试按钮马上可以进入调试状态,而且点击操作不会让查找窗口失去焦点,也不会使主界面窗体获得焦点。 而在我做的系统中,必须点击两次才能触发主界面工具栏上的按钮,第一次点击使主界面获得焦点,第二次点击才能真正触发工具栏中的按钮操作。 
2.窗口活动范围
如,word中的查找窗体是可以任意拖动的(可以是整个桌面范围),它不可能是MDI子窗体,因为MDI子窗体是不可能拖出主界面的。
请各位高人帮帮兄弟吧,让我安心过个十一吧!!!(如果感觉描述的不清楚,请参见上帖:http://topic.csdn.net/u/20090925/17/a4bd0aea-62fc-4e04-9bd9-0e50d4e29e4d.html)

解决方案 »

  1.   

    你的意思是想做个如快捷键ctrl+f的功能??
      

  2.   

    很少做WINFORM,你第一个问题我有两个大概的方法,不知道是否能实现
    在FORM中加入一字段判断是否被点击过,也就是在所有的按钮的EVENT前全部都加一个判断是否被点击过的委托,如果被点击过才能够执行接下来的东西。在FORM上加一个透明的什么东西。点了后才消失
      

  3.   

    1、将窗口作为顶层窗口试试
    2、MDI子窗体也是可以拖动的。
      

  4.   

    parent 属性。采用singleton模式。可以解决.
                Form2 f2 = Form2.CreateStance;
                f2.Owner = this;
                f2.Show();
      

  5.   

    好像跟我的两个问题没什么关系,
    1.顶不顶层跟焦点没什么关系,我只想点一次就可以触发主界面中工具栏的按钮
    2.帖中已指出 MDI子窗体的活动范围是很有限的,它是不可能被拖出主界面的,而word中的查找窗口是可以再桌面任意拖动的。同样感谢!
      

  6.   

    Owner 属性,只能解决第二个问题,而焦点问题还是存在的。
    已在上帖中说明,http://topic.csdn.net/u/20090925/17/a4bd0aea-62fc-4e04-9bd9-0e50d4e29e4d.html,同样感谢。现在关键是焦点问题,怎样才能点击一次就能打开主界面上的菜单,就能触发主界面上的工具栏命令,
    是不是必须通过 windows API 实现?
      

  7.   


    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;namespace WindowsFormsApplication11
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();            ToolBar TB = new ToolBar();
                TB.Parent = this;
                TB.Buttons.Add("button1");
                TB.ButtonClick += new ToolBarButtonClickEventHandler(TB_ButtonClick);            Form F = new Form();
                F.TopMost = true;
                F.Size = new Size(200, 100);
                F.StartPosition = FormStartPosition.CenterParent;
                F.Show();
            }        void TB_ButtonClick(object sender, ToolBarButtonClickEventArgs e)
            {
                MessageBox.Show(e.Button.Text);
            }
        }
    }点击一次就能运行啊
      

  8.   

    非常感谢,确实当内部窗体获得焦点时,是可以一次性触发ToolBarButton ,不仅如此也可以触发主界面上的Button。不过我说的工具栏上的按钮是指 包含在ToolStrip中的 ToolStripButton ,而且也不能够一次性触发
    ToolStripMenuItem。
      

  9.   

    应该通过SetWindowPos,GetWindow,FindWindow等
    DllImport("user32.dll", CharSet = CharSet.Auto)] 
       public extern static IntPtr SetParent(IntPtr hChild, IntPtr hParent); 
    等实现窗体的布局
      

  10.   


    那是ToolBar的效果,让ToolBar不获得焦点,而不是窗体的问题
      

  11.   

    现在主要要解决的问题:在内部窗口获得焦点的情况下,鼠标点击一次就可以打开主界面的菜单、或触发ToolStripButton 的点击事件,这个问题也可以解决吗???非常感谢,试下先!
      

  12.   

    就是区分单双击操作,可以让程序检测到单击后等待,等超过双击的最大时间后,看用户是否第二次单击,如果存在就响应,否则不响应,在此说的很清楚
    http://msdn.microsoft.com/zh-cn/library/ms171543(VS.80).aspx
      

  13.   

    这位兄弟好像没理解我要实现的是什么,我再描述一下:我们打开word文档,然后再打开里面的“查找和替换”窗口,窗口的焦点在“查找和替换”窗口上,现在我们点击一次就可以打开主界面的菜单,如文件、编辑、视图等。而现在我做的系统中必须点击两次才能打开菜单,怎样才能点击一次就能打开菜单呢?
      

  14.   


            //试试下面的,可以达到你的要求.
            int i = 0;        private void toolStripButton1_Click(object sender, EventArgs e)
            {
                btnClick();
            }        public void btnClick()
            {
                MessageBox.Show("OK");
            }        private void toolStripButton1_MouseMove(object sender, MouseEventArgs e)
            {
                i = 1;
            }                private void Form1_Activated(object sender, EventArgs e)
            {
                //如果工具栏有多个按钮,那就用多个变量,参照如此方法.
                if (i == 1)
                {
                    btnClick();
                }
            }        private void toolStripButton1_MouseLeave(object sender, EventArgs e)
            {
                i = 0;
            }
      

  15.   

    ToolStrip 就要麻烦一点了using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using System.Runtime.InteropServices;namespace WindowsFormsApplication5
    {
        public partial class Form1 : Form
        {
            ToolStrip TS = new ToolStrip();        public Form1()
            {
                InitializeComponent();            TS.Parent = this;            ToolStripButton TSB = new ToolStripButton();
                TSB.Text = "button1";
                TS.Items.Add(TSB);            Form F = new Form();
                F.TopMost = true;
                F.Size = new Size(200, 100);
                F.StartPosition = FormStartPosition.CenterParent;
                F.Show();            this.Activated += new EventHandler(ToolStripButtonClick);
            }        void ToolStripButtonClick(object sender, EventArgs e)
            {
                Point P = TS.PointToClient(Control.MousePosition);
                foreach (ToolStripItem TSI in TS.Items)
                    if (TSI.Bounds.Contains(P))
                        MessageBox.Show(TSI.Text);
            }
        }
    }
      

  16.   

    LZ 的问题看似简单,但实现起来比较复杂,
    1、建议楼主参看 NativeWindow 的相关说明。
    2、然后研究 DockWindow 的工作原理,这都不是一两句话可以解决的。
      

  17.   

    1.点击时判断窗体是否有焦点,没有的话获得并return
    2.show一个新窗体
      

  18.   

    已测试,效果和 Owner 属性一样,焦点问题不能解决。
      

  19.   

            //试试下面的,可以达到你的要求.
            int i = 0;        public Form2 frm;        private void button1_Click(object sender, EventArgs e)
            {
                frm = new Form2();
                frm.TopMost = true;
                frm.Show();
            }        private void toolStripButton1_Click(object sender, EventArgs e)
            {
                btnClick();
            }        public void btnClick()
            {
                MessageBox.Show("OK");
            }        private void toolStripButton1_MouseMove(object sender, MouseEventArgs e)
            {
                i = 1;
            }                private void Form1_Activated(object sender, EventArgs e)
            {
                //如果工具栏有多个按钮,那就用多个变量,参照如此方法.
                if (i == 1)
                {
                    btnClick();
                    frm.Focus();
                }
            }        private void toolStripButton1_MouseLeave(object sender, EventArgs e)
            {
                i = 0;
            }
      

  20.   

    多了一句,frm.Focus(),这种方式只是一种假象。
    我还需要在 frm 中弹出其他的窗体,弹出的窗体还要具有同样的效果。
      

  21.   

    同样在frm的Activated事件里判断处理frm弹出的窗体啊.
      

  22.   

    这种方法必须对窗体上几乎每个控件都要进行判断,而且我的窗体比较复杂,包含DataGridView 、TabControl、自定义控件等等。不行的话,也只能先满足菜单和工具栏的需求再说啦。
      

  23.   

    在MDI模式中,父子窗体可以同时具有焦点是怎样做到的呢???
      

  24.   

    能不能这样,在打开你那个查找窗口的情况下,你用HOOK把单击鼠标一次变成单击两次,然后再把你的查找窗口设置成活动窗口
    也就是说,用户只点了一下,但是实际上却是点了两下,而且在点完之后你的查找窗口立刻又获得了焦点,所以在用户看起来就好像从没失去过焦点一样
      

  25.   

    每个窗体的聚焦时用变量记录控件的name,然后在frm.Focus()遍历控件可以使其获得焦点.            //遍历控件
                foreach (Control c in this.Controls)
                {
                    if (c.Name == "记录的变量值")
                    {
                        c.Focus();
                    }
                }
      

  26.   

    多谢各位帮忙,特别感谢 BitCoffee 和 wartim ,虽然没有达到预想的结果,但问题基本解决。祝各位国庆、中秋快乐!!!