实现像讯雷、FLASHGET那样的悬浮窗口,网上找了一下,说实现起来很简单,但都没有实现这样的特性:
在主窗口MainForm单击Button1,创建并显示悬浮窗口FloatingForm。这时可以点击悬浮窗口并移动它。然后在主窗口MainForm再单击Button2,创建并显示一个模式窗口ModelForm(用ShowDialog()显示),这时却无法点击激活和移动悬浮窗口了。这如何实现呢?

解决方案 »

  1.   

    public partial class Form1 : Form
        {
            private Point mouseOffset;        //记录鼠标指针的坐标
            private bool isMouseDown = false; //记录鼠标按键是否按下
                   public Form1()
            {
                InitializeComponent();
                this.MouseUp += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseUp);
                this.MouseMove += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseMove);
                this.MouseDown += new System.Windows.Forms.MouseEventHandler(this.Form1_MouseDown);   
            }        private void button1_Click(object sender, EventArgs e)
            {
                byte[] array = new byte[2];
                string str = textBox1.Text.Trim();
                string str1 = str.Substring(0, 2);
                string str2 = str.Substring(2, 2);
                int front = Convert.ToInt32(str1) + 160;
                int back = Convert.ToInt32(str2) + 160;
                array[0] = (byte)front; 
                array[1] = (byte)back;
                textBox2.Text = System.Text.Encoding.Default.GetString(array);
            }
            private string tran(string str)
            {
                byte[] array = new byte[2];
                string str1 = str.Substring(0, 2);
                string str2 = str.Substring(2, 2);
                int front = Convert.ToInt32(str1) + 160;
                int back = Convert.ToInt32(str2) + 160;
                array[0] = (byte)front;
                array[1] = (byte)back;
                return System.Text.Encoding.Default.GetString(array);
            }
            private void richTextBox1_SelectionChanged(object sender, EventArgs e)
            {
                ////richTextBox1.SelectedText;
                //toolTip1.Active = true;
                //toolTip1.SetToolTip(richTextBox1, tran(this.richTextBox1.SelectedText));
            }        private void richTextBox1_MouseHover(object sender, EventArgs e)
            {
                //toolTip1.Active = true;
                //toolTip1.SetToolTip(richTextBox1, tran(this.richTextBox1.SelectedText));
            }
            //左键按下时,设置可移动 
            private void Form1_MouseDown(object sender, MouseEventArgs e)
            {
                int xOffset;
                int yOffset;            if (e.Button == MouseButtons.Left)
                {
                    xOffset = -e.X - SystemInformation.FrameBorderSize.Width;
                    yOffset = -e.Y - SystemInformation.CaptionHeight -
                     SystemInformation.FrameBorderSize.Height;
                    mouseOffset = new Point(xOffset, yOffset);
                    isMouseDown = true;
                }        }
            //左键松开时,设置不可移动   
            private void Form1_MouseUp(object sender, MouseEventArgs e)
            {
                // 修改鼠标状态isMouseDown的值
                // 确保只有鼠标左键按下并移动时,才移动窗体
                if (e.Button == MouseButtons.Left)
                {
                    isMouseDown = false;
                }
     
            }
            //移动   
            private void Form1_MouseMove(object sender, MouseEventArgs e)
            {
                if (isMouseDown)
                {
                    Point mousePos = Control.MousePosition;
                    mousePos.Offset(mouseOffset.X + 5, mouseOffset.Y + 30);
                    Location = mousePos;
                }        }
      

  2.   

    ShowDialog肯定不行的,试一下Show()
      

  3.   

    show();然后设置为topmost;
    当然是没边框的,移动窗体的代码多了去了。自己搜吧;
      

  4.   

    各位没有没理解我的意思。悬浮动窗口我的能实现(TopMost=true,ShowInTaskbar=false,BorderStye=None),移动窗口的代码我也会。我是说,在主窗口弹出一个模式窗口(showdialog()),就不能激活移动了。而讯雷是可以的。比如启动讯雷,这时显示主窗口和悬浮窗口并可以移动悬浮窗口,然后,新建下载,弹出新建下载任务的一个模式窗口,注意,这时仍然可以用鼠移动那个悬浮窗口。
      

  5.   

    各位没有没理解我的意思。悬浮窗口我能实现(TopMost=true,ShowInTaskbar=false,BorderStye=None),移动窗口的代码我也会写。我是说,在主窗口弹出一个模式窗口(showdialog())后,就不能激活移动悬浮窗口了。而讯雷是可以的。比如启动讯雷,这时显示主窗口和悬浮窗口,并可以移动悬浮窗口。然后新建下载,弹出新建下载任务的一个模式窗口,注意,这时仍然可以用鼠移动那个悬浮窗口。
      

  6.   

    lianshaohua:
    能否给出代码呢?在线程中创建并显示悬浮窗口后,这个能否可以Completed退出?如果不能,这个线程应该怎样做?
      

  7.   

    楼主还是没有理解大家的意思,要你用
    FloatingForm.show()
    而不是
    FloatingForm.showdialog()隐藏用
    FloatingForm.Hide()可能你知道,算我多说.
      

  8.   


    在另一线程里show,或者直接调另一个exe