1. 程式人生 > >如何用C#做一個懸浮窗口程序

如何用C#做一個懸浮窗口程序

mos 判斷 pan item private red req sep 此外

C#做一個像FlashGet的懸浮窗口,其實很簡單,不像以前需要調用很多系統API。大致的步驟如下。

首先是主窗體部分,即要判斷窗體的狀態來決定是否顯示懸浮窗口。

局部成員聲明:

private FormWindowState fwsPrevious;

private frmTopMost myTopMost;

主窗體的Load事件:

private void frmMain_Load(object sender, System.EventArgs e)

{

// Save window state

fwsPrevious = this.WindowState;

// Create top most window

myTopMost = new frmTopMost( this );

}

主窗體的SizeChanged事件:

private void frmMain_SizeChanged(object sender, System.EventArgs e)

{

if( this.WindowState == FormWindowState.Minimized )

{

// Window minimized

// Show top most window

myTopMost.Show();

this.ShowInTaskbar = false;

}

else if( this.WindowState != fwsPrevious )

{

// Save current window state

fwsPrevious = this.WindowState;

}

}

然後,就是還原窗口方法,即供懸浮窗口進行調用的。

/// <summary>

/// Restore window state

/// </summary>

public void RestoreWindow()

{

this.WindowState = fwsPrevious;

this.ShowInTaskbar = true;

}

下來就是懸浮窗口部分代碼,首先要設置其窗體的FormBorderStyleNone,然後設置其的TopMosttrue,接下來,就是主要是三個鼠標事件的處理,以下,具體說明如何實現的。

局部成員聲明。

private Point ptMouseCurrrnetPos, ptMouseNewPos,

ptFormPos, ptFormNewPos;

private bool blnMouseDown=false;

private frmMain pParent;

懸浮窗口的構造函數。

public frmTopMost( frmMain pMain )

{

//

// Required for Windows Form Designer support

//

InitializeComponent();

// Init main window object

pParent = pMain;

}

懸浮窗口的Load事件。

private void frmTopMost_Load(object sender, System.EventArgs e)

{

this.Show();

// Init window size and position

this.Top = 100;

this.Left = Screen.PrimaryScreen.Bounds.Width - 100;

this.Width = 80;

this.Height = 80;

}

主要的三個鼠標事件,即MouseDown MouseMove MouseUp三個事件。

private void frmTopMost_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)

{

if( blnMouseDown )

{

//Get the current position of the mouse in the screen

ptMouseNewPos = Control.MousePosition;

//Set window position

ptFormNewPos.X = ptMouseNewPos.X - ptMouseCurrrnetPos.X + ptFormPos.X;

ptFormNewPos.Y = ptMouseNewPos.Y - ptMouseCurrrnetPos.Y + ptFormPos.Y;

//Save window position

Location = ptFormNewPos;

ptFormPos = ptFormNewPos;

//Save mouse position

ptMouseCurrrnetPos = ptMouseNewPos;

}

}

private void frmTopMost_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)

{

if(e.Button==MouseButtons.Left)

{

blnMouseDown = true;

// Save window position and mouse position

ptMouseCurrrnetPos = Control.MousePosition;

ptFormPos = Location;

}

}

private void frmTopMost_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)

{

if( e.Button == MouseButtons.Left)

//Return back signal

blnMouseDown = false;

}

然後就是雙擊懸浮窗體,進行恢復主窗體。

private void frmTopMost_DoubleClick(object sender, System.EventArgs e)

{

SwitchToMain();

}

private void SwitchToMain()

{

//Change main window status here

pParent.RestoreWindow();

//Hide top most window

this.Hide();

}

此外,還可以給懸浮窗口添加ContextMenu,來輔助操作,這裏就不細說了。

private System.Windows.Forms.ContextMenu mnuPopup;

private System.Windows.Forms.MenuItem mnuMainWindow;

private System.Windows.Forms.MenuItem mnuExit;

private void mnuMainWindow_Click(object sender, System.EventArgs e)

{

SwitchToMain();

}

private void mnuExit_Click(object sender, System.EventArgs e)

{

Application.Exit();

}

如何用C#做一個懸浮窗口程序