CSkin博客

标题: 【四边阴影】教你实现Winform窗体的四边阴影效果 [打印本页]

作者: 乔克斯    时间: 2014-7-21 11:37
标题: 【四边阴影】教你实现Winform窗体的四边阴影效果
说明:
1.首先我们得有这样一张阴影图片。


2.然后分别有两个窗体去实现这个阴影效果。

  • SkinForm - 用于实现阴影的绘制,特性:鼠标可穿透,无法点击,跟随窗体。
  • SkinMain - 主窗体,也是承载控件的容器窗体, 特性:与普通窗体无一区别,移动和拉伸,阴影窗体都会跟随。

3.SkinMain主窗体的OnVisibleChanged事件中new出阴影窗体

4.阴影窗体中绘制不规则透明图片的代码:
[C#] 纯文本查看 复制代码
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; //高质量
    g.PixelOffsetMode = PixelOffsetMode.HighQuality; //高像素偏移质量
    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);
    }
}


效果图:


案例源码下载:
窗体四边阴影.rar (305.88 KB, 下载次数: 3709)

作者: smalltalkhyb    时间: 2014-7-22 21:54
求下载11111111
作者: 无所谓    时间: 2014-7-29 09:11
学习学习
作者: jameskuk    时间: 2014-7-31 17:56
这绝对得学一学,,
作者: 爱爱    时间: 2014-7-31 23:38
的放松放松放松放松的放松放松过
作者: 我和小菜    时间: 2014-8-24 15:25
lz很牛逼,我特地来学习一下
作者: thinhils    时间: 2014-8-25 18:10
very good,very nb
作者: 569794982    时间: 2014-8-25 20:41
好文章 学习一下
作者: wtujoxk    时间: 2014-8-25 22:39
谢谢楼主分享!!!!nice
作者: cjkall    时间: 2014-8-26 15:28
学习学习


作者: hatchgavin    时间: 2014-8-28 11:25
正是我想要的效果,学习学习
作者: bckrain    时间: 2014-8-29 20:31
下来学习学习
作者: banyahui    时间: 2014-9-1 22:49
看一下啊!
作者: jiangyuehuixx    时间: 2014-9-2 20:53
下载慢慢看看
作者: hackrui    时间: 2014-9-10 14:06
擦擦擦擦擦擦擦
作者: 月光杯    时间: 2014-9-14 21:59
这个帅啊
作者: aolongxue    时间: 2014-9-17 10:48
感觉很不错的样子,刚好需要
作者: easy    时间: 2014-9-17 15:22
十分需要,谢谢
作者: QQ859228306    时间: 2014-9-18 22:44
谢谢~~学习学习
作者: Shaozhuyong    时间: 2014-9-20 08:54
哪呢?说好的资源呢?
作者: 乔克斯    时间: 2014-9-20 13:38
Shaozhuyong 发表于 2014-9-20 08:54
哪呢?说好的资源呢?

回复后,重新再看隐藏区域。
作者: LWJ    时间: 2014-9-24 15:11
学习了。。。。。。谢谢
作者: YuanNet    时间: 2014-10-3 17:12
试试,看看效果咋样
作者: YuanNet    时间: 2014-10-3 17:12
试试,看看效果咋样
作者: Johnnie    时间: 2014-10-3 18:17
学习了,好东东收藏
作者: 我来拾豆豆    时间: 2014-10-4 09:35
支持楼主。。。。
作者: senage    时间: 2014-10-7 19:36
不错的效果,不知道运行怎么样
作者: unwatched1    时间: 2014-10-13 22:09
这效果看起来不错
作者: Blue_Pen    时间: 2014-10-15 22:25
赶紧下载
作者: roy0109    时间: 2014-10-21 10:52
好文章,下載學習了
作者: david123007    时间: 2014-10-22 09:00
这绝对得学一学,,
作者: pacocai    时间: 2014-10-23 15:48
支持………………谢谢分享。
作者: nihaomaves    时间: 2014-10-25 10:31
下来测试下
作者: 喵星反动派    时间: 2014-10-25 11:38

作者: simple    时间: 2014-10-28 15:35
原来是这样实现的
作者: 神奇的小黄子    时间: 2014-10-29 15:03
我靠,真是大神啊,正是我需要的,谢谢了~
作者: wuyu    时间: 2014-10-29 15:14
很好的,很有收获,谢谢。
作者: kfel520    时间: 2014-11-2 14:26
......................
作者: gkivan    时间: 2014-11-4 09:23
正在学习Winform界面设计,学习下
作者: zhengxl    时间: 2014-11-4 14:56
学习咯,呵呵
作者: 胡帅    时间: 2014-11-8 09:37
谢谢楼主分享
作者: dcdlove    时间: 2014-11-12 10:22

作者: dcdlove    时间: 2014-11-12 10:22

作者: 羽叶    时间: 2014-11-12 10:56
看看再说
作者: hhjj3388    时间: 2014-11-12 14:18
不错啊·1!!~!·
作者: 我们的故事    时间: 2014-11-12 21:11
谢谢分享
作者: PCBLink    时间: 2014-11-13 10:37
顶起 ,mank
作者: HJL    时间: 2014-11-13 14:33
刚好可以试一下。
作者: lzhdim    时间: 2014-11-16 20:27
支持啊。。。。。。。。。。。。。。。。。
作者: mrtong    时间: 2014-11-19 17:48
感谢楼主分享!!!
作者: mrtong    时间: 2014-11-19 18:16
能否禁止调整窗体大小???
作者: mrtong    时间: 2014-11-19 18:17
能否禁止调整大小?
作者: 乔克斯    时间: 2014-11-19 21:36
mrtong 发表于 2014-11-19 18:17
能否禁止调整大小?

可以,吧拉伸代码去掉就行了。
作者: 靠谱的T    时间: 2014-11-19 23:55
隐藏了什么。。。哼哼哼哼
作者: mrtong    时间: 2014-11-20 09:08
乔克斯 发表于 2014-11-19 21:36
可以,吧拉伸代码去掉就行了。

看代码里面已经设置了FormBorderStyle = FormBorderStyle.None;啊?
作者: 乔克斯    时间: 2014-11-20 11:11
mrtong 发表于 2014-11-20 09:08
看代码里面已经设置了FormBorderStyle = FormBorderStyle.None;啊?

我写了代码重新实现了拖动和拉伸,把那串代码干掉就行。
作者: 丶iwi丶    时间: 2014-11-21 19:56
QAQ 没看懂怎么搞
作者: Brennan    时间: 2014-11-29 01:38
ziyuanne ????
作者: wbn1883    时间: 2014-11-29 17:37
dfdffdfdfdf
作者: q1236008    时间: 2014-11-29 23:46
一直想要这样的效果,支持楼主。
作者: 萧萧    时间: 2014-12-1 16:04
看看                                      
作者: hatar007    时间: 2014-12-2 21:26
的撒的阿萨擦出啊按错撒啊按时
作者: zonestudio    时间: 2014-12-3 17:46
good~正琢磨怎么实现呢
作者: guocl    时间: 2014-12-3 19:49
感谢分享,LZ辛苦了~
作者: iansoft    时间: 2014-12-4 00:33
感谢楼主分享。
作者: Skinna    时间: 2014-12-5 13:40
一直在纠结这个问题,希望有启发
作者: 贱贱的贱贱    时间: 2014-12-7 00:44
支持一下~~~
作者: duai    时间: 2014-12-7 05:45
vvvvvvv反对反对方法地方
作者: xiaohongda123    时间: 2014-12-7 10:08
可以实现一下
作者: Luxor    时间: 2014-12-7 18:20
学习了。。赞。。
作者: i9527    时间: 2014-12-8 15:06
这就是你的dll为啥点任务栏会先出现个黑框的原因
作者: freeluo    时间: 2014-12-10 11:07
谢谢,找的就是这个东西了
作者: 阿仪蛋糕店    时间: 2014-12-10 16:05
这个东西还是不错的 对我有帮助 谢谢
作者: jh1996    时间: 2014-12-12 17:24
太给力了   不行了  我忍不住要收藏了~~嗷呜~~~~~
作者: jingxuan    时间: 2014-12-16 22:09
借鉴,学习一下
作者: qq443061626    时间: 2014-12-17 08:35
看看看看看一下~~·
作者: spark123123    时间: 2014-12-18 16:35
for source
作者: guanwei    时间: 2014-12-25 12:58
多学习,多理解
作者: baiqinghai2004    时间: 2014-12-26 15:14
ok,thank you very mych
作者: lam    时间: 2014-12-27 17:22
thanks a lot!

作者: aabbcc1228    时间: 2014-12-28 19:54
这个看看
作者: JorkeMooN    时间: 2014-12-29 15:46
厉害啊,一直在找这个解决方案
作者: zhengjiangshan    时间: 2014-12-29 15:58
学习学习
作者: tangwei04    时间: 2014-12-31 14:22
感谢分享,学习学习
作者: zfsn12    时间: 2015-1-3 23:50
正在寻找,感谢提供!
作者: lanxue    时间: 2015-1-4 14:14
RE: 【四边阴影】教你实现Winform窗体的四边阴影效果 [修改]

顶你
作者: wmvsmm    时间: 2015-1-6 23:02
感觉很牛逼的样子啊   看看
作者: jaqleung    时间: 2015-1-7 10:40
这个方法试试,不知windows是不是有底层的方法来实现
作者: 乔克斯    时间: 2015-1-7 14:48
jaqleung 发表于 2015-1-7 10:40
这个方法试试,不知windows是不是有底层的方法来实现

底层有实现,左下,和右边的阴影。但是没有四边阴影的。。除非你在win7系统调用 玻璃模糊 api可以实现四边。但是其他系统没效果。
作者: MoonLord    时间: 2015-1-8 14:16

作者: 2201218918    时间: 2015-1-8 21:38
不错啊,参考下啊

作者: 橘子你个哦润桔    时间: 2015-1-9 23:51
56767676笔记就结婚
作者: 天高任鸟飞I    时间: 2015-1-11 23:18
这绝对得学一学,,
作者: mumupudding    时间: 2015-1-12 13:08
感谢分享,学习一下
作者: 埃菲尔    时间: 2015-1-13 15:05
这个看着好的样子  
作者: skybabyz`    时间: 2015-1-14 09:59
感谢分享,LZ辛苦了~
作者: skybabyz`    时间: 2015-1-14 09:59
感谢分享,LZ辛苦了~
作者: passby    时间: 2015-1-16 10:56
下载来学习学习!
作者: iruo    时间: 2015-1-18 13:05

作者: dongdong200    时间: 2015-1-18 23:53
学习学习




欢迎光临 CSkin博客 (http://bbs.cskin.net/) Powered by Discuz! X3.2