一、背景:
echong 之前一直用 公司大牛c語言寫的一個彈出托管,前幾天寫東西的時候發現com調用不是那么好使。而手頭上寫的這個東西又是.net 環境下C#實現的。調用的時候有些背景圖片logo不好調用,索性直接用.net寫一個。東西很簡單,寫出來只是做個記錄整理。
二、相關問題的提出和解決:
1、展現形式
1)最容易想到的自然是窗體的形式,考慮的窗的美觀。
2)窗體原來的邊框樣式FormBorderStyle = none
3)然后用個Panel 填滿整個窗體,name = Panel1 Panel BorderStye=FixedSingle
4) 在Panel1 的上方設置一個同寬的Panel2 來划分頭部
5)在Panel2 左邊放置個lable1 右邊放置個 label2 方便做為標題字樣 和 關閉(還可以加入logo等)
6)效果:
2、彈出的定位問題
在1 后咱們有了一個能做完彈出提示的窗體,那么如何定位到右下角。最容易想到就是根據電腦的分辨率然后直接x坐標y坐標定位到右下角。但是這樣做不同電腦的分辨率不同的情況下就不能達到目的。如果我們能取得當前顯示設備的大小。那么只要定位到 顯示器的 寬 和 高 。可以得出 定位的左邊 X1= 總寬寬-彈出窗體的寬 Y1=總高-彈出窗體高。正好C# 給我們提供了 Screen 類 這個類很容易取得顯示設備的高寬代碼
Rectangle r = Screen.GetWorkingArea(this); this.Location = new Point(r.Right - this.Width, r.Bottom - this.Height);
以上兩行代碼實現了窗體定位到了右下角
3、支持鼠標位置的移動
通過 1,2基本上實現了我們想要的右下角彈出提示窗體的目的。但是發現窗體不能拖動 。我們想實現 這對 panel2 鼠標有拖動整個窗體的功效。 解決這個問題需要調用window內置API,user32.dll 提供了Windows用戶界面相關應用程序接口。
[DllImport("user32.dll")] //方法撲捉 public static extern bool ReleaseCapture(); [DllImport("user32.dll")] public static extern bool SendMessage(IntPtr hwnd, int wMsg, int wParam, int lParam); public const int WM_SYSCOMMAND = 0x0112; public const int SC_MOVE = 0xF010; public const int HTCAPTION = 0x0002; void Panel2MouseDown(object sender, MouseEventArgs e) { //撲捉事件 ReleaseCapture(); //發送消息給window Api 來實現 SendMessage(this.Handle, WM_SYSCOMMAND, SC_MOVE + HTCAPTION, 0);// }
4、附帶貼出設置panel
發現存在問題 標題的地方 是不能拖動,因為panel跟標題存在區域的重疊,那么我們必須把panel設置為透明,以方便拖動,新建一個用戶控件:
using System; using System.ComponentModel; using System.Drawing; using System.Windows.Forms; namespace ttsd { /// <summary> /// Description of UserControl1. /// </summary> public partial class UserControl1 :Panel { public UserControl1() { } protected override CreateParams CreateParams { get { CreateParams createParams = base.CreateParams; createParams.ExStyle |= 0x00000020; // WS_EX_TRANSPARENT return createParams; } } protected override void OnPaintBackground(PaintEventArgs e) { } } }
三、總體效果:
當然我們可以做成通用的類,在類實例化對象的時候把標題 、圖標、內容等等信息可以傳入進去。