五月综合缴情婷婷六月,色94色欧美sute亚洲线路二,日韩制服国产精品一区,色噜噜一区二区三区,香港三级午夜理伦三级三

您現(xiàn)在的位置: 365建站網(wǎng) > 365文章 > (vb.net/C#)實(shí)現(xiàn)繪制Winform窗體的四邊陰影效果

(vb.net/C#)實(shí)現(xiàn)繪制Winform窗體的四邊陰影效果

文章來源:365jz.com     點(diǎn)擊數(shù):1497    更新時(shí)間:2017-11-13 01:52   參與評論
首先我們得有這樣一張陰影圖片。



2.然后分別有兩個(gè)窗體去實(shí)現(xiàn)這個(gè)陰影效果。
SkinForm - 用于實(shí)現(xiàn)陰影的繪制,特性:鼠標(biāo)可穿透,無法點(diǎn)擊,跟隨窗體。
SkinMain - 主窗體,也是承載控件的容器窗體, 特性:與普通窗體無一區(qū)別,移動和拉伸,陰影窗體都會跟隨。
3.在SkinMain主窗體的OnVisibleChanged事件中new出陰影窗體


//繪制層
private SkinForm skin;
skin = new SkinForm(this);
skin.Show(this);

protected override void OnVisibleChanged(EventArgs e) {
            if (Visible) {
                if (!DesignMode) {
                //判斷不是在設(shè)計(jì)器中
                if (!DesignMode && skin == null) {
                    skin = new SkinForm(this);
                    skin.Show(this);
                }
                base.OnVisibleChanged(e);
            } else {
                base.OnVisibleChanged(e);
            }
        }


4.陰影窗體中繪制不規(guī)則透明圖片的代碼:

public void SetBits() {
    //繪制繪圖層背景
    Bitmap bitmap = new Bitmap(Main.Width + 10, Main.Height + 10);
    Rectangle _BacklightLTRB = new Rectangle(20, 20, 20, 20);//窗體光澤重繪邊界
    Graphics g = Graphics.FromImage(bitmap);
    g.SmoothingMode = SmoothingMode.HighQuality; //高質(zhì)量
    g.PixelOffsetMode = PixelOffsetMode.HighQuality; //高像素偏移質(zhì)量
    ImageDrawRect.DrawRect(g, Properties.Resources.main_light_bkg_top123, ClientRectangle, Rectangle.FromLTRB(_BacklightLTRB.X, _BacklightLTRB.Y, _BacklightLTRB.Width, _BacklightLTRB.Height), 1, 1);
 
    if (!Bitmap.IsCanonicalPixelFormat(bitmap.PixelFormat) || !Bitmap.IsAlphaPixelFormat(bitmap.PixelFormat))
        throw new ApplicationException("圖片必須是32位帶Alhpa通道的圖片。");
    IntPtr oldBits = IntPtr.Zero;
    IntPtr screenDC = Win32.GetDC(IntPtr.Zero);
    IntPtr hBitmap = IntPtr.Zero;
    IntPtr memDc = Win32.CreateCompatibleDC(screenDC);
 
    try {
        Win32.Point topLoc = new Win32.Point(Left, Top);
        Win32.Size bitMapSize = new Win32.Size(Width, Height);
        Win32.BLENDFUNCTION blendFunc = new Win32.BLENDFUNCTION();
        Win32.Point srcLoc = new Win32.Point(0, 0);
 
        hBitmap = bitmap.GetHbitmap(Color.FromArgb(0));
        oldBits = Win32.SelectObject(memDc, hBitmap);
 
        blendFunc.BlendOp = Win32.AC_SRC_OVER;
        blendFunc.SourceConstantAlpha = Byte.Parse("255");
        blendFunc.AlphaFormat = Win32.AC_SRC_ALPHA;
        blendFunc.BlendFlags = 0;
 
        Win32.UpdateLayeredWindow(Handle, screenDC, ref topLoc, ref bitMapSize, memDc, ref srcLoc, 0, ref blendFunc, Win32.ULW_ALPHA);
    } finally {
        if (hBitmap != IntPtr.Zero) {
            Win32.SelectObject(memDc, oldBits);
            Win32.DeleteObject(hBitmap);
        }
        Win32.ReleaseDC(IntPtr.Zero, screenDC);
        Win32.DeleteDC(memDc);
    }
}


 ImageDrawRect.DrawRect 函數(shù)部分:

public static void DrawRect(Graphics g, Bitmap img, Rectangle r, Rectangle lr, int index, int Totalindex)
        {
            if (img == null) return;
           
            Rectangle r1, r2;
            int x = (index - 1) * img.Width / Totalindex;
            int y = 0;
            int x1 = r.Left;
            int y1 = r.Top;

                r1 = new Rectangle(x, y, img.Width / Totalindex, lr.Top);
                r2 = new Rectangle(x1, y1, r.Width, lr.Top);
                g.DrawImage(img, r2, r1, GraphicsUnit.Pixel);

                r1 = new Rectangle(x, y + lr.Top, img.Width / Totalindex, img.Height - lr.Top - lr.Bottom);
                r2 = new Rectangle(x1, y1 + lr.Top, r.Width, r.Height - lr.Top - lr.Bottom);
                if ((lr.Top + lr.Bottom) == 0) r1.Height = r1.Height - 1;
                g.DrawImage(img, r2, r1, GraphicsUnit.Pixel);

                r1 = new Rectangle(x, y + img.Height - lr.Bottom, img.Width / Totalindex, lr.Bottom);
                r2 = new Rectangle(x1, y1 + r.Height - lr.Bottom, r.Width, lr.Bottom);

                g.DrawImage(img, r2, r1, GraphicsUnit.Pixel);
                 。。。。。。
           
          }


如對本文有疑問,請?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會為你解答!! 點(diǎn)擊進(jìn)入論壇

發(fā)表評論 (1497人查看,0條評論)
請自覺遵守互聯(lián)網(wǎng)相關(guān)的政策法規(guī),嚴(yán)禁發(fā)布色情、暴力、反動的言論。
昵稱:
最新評論
------分隔線----------------------------

其它欄目

· 建站教程
· 365學(xué)習(xí)

業(yè)務(wù)咨詢

· 技術(shù)支持
· 服務(wù)時(shí)間:9:00-18:00
365建站網(wǎng)二維碼

Powered by 365建站網(wǎng) RSS地圖 HTML地圖

copyright © 2013-2024 版權(quán)所有 鄂ICP備17013400號