.net winForm 實現類似qq 彈出新聞


 一、背景:

    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)
        {
      
        }
    }
}

 

三、總體效果:

  當然我們可以做成通用的類,在類實例化對象的時候把標題 、圖標、內容等等信息可以傳入進去。

  

  

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM