实现像讯雷、FLASHGET那样的悬浮窗口,网上找了一下,说实现起来很简单,但都没有实现这样的特性:
在主窗口MainForm单击Button1,创建并显示悬浮窗口FloatingForm。这时可以点击悬浮窗口并移动它。然后在主窗口MainForm再单击Button2,创建并显示一个模式窗口ModelForm(用ShowDialog()显示),这时却无法点击激活和移动悬浮窗口了。这如何实现呢?
在主窗口MainForm单击Button1,创建并显示悬浮窗口FloatingForm。这时可以点击悬浮窗口并移动它。然后在主窗口MainForm再单击Button2,创建并显示一个模式窗口ModelForm(用ShowDialog()显示),这时却无法点击激活和移动悬浮窗口了。这如何实现呢?
{
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;
} }
当然是没边框的,移动窗体的代码多了去了。自己搜吧;
能否给出代码呢?在线程中创建并显示悬浮窗口后,这个能否可以Completed退出?如果不能,这个线程应该怎样做?
FloatingForm.show()
而不是
FloatingForm.showdialog()隐藏用
FloatingForm.Hide()可能你知道,算我多说.
在另一线程里show,或者直接调另一个exe