赞 | 12 |
VIP | 107 |
好人卡 | 6 |
积分 | 4 |
经验 | 31122 |
最后登录 | 2024-6-29 |
在线时间 | 1606 小时 |
Lv2.观梦者 傻♂逼
- 梦石
- 0
- 星屑
- 374
- 在线时间
- 1606 小时
- 注册时间
- 2007-3-13
- 帖子
- 6562
|
一箭烂YiJL 发表于 2011-10-14 22:04
是指 SetLayeredWindowAttributes ?
UpdateLayeredWindow 我试过的,但我怀疑半透明问题和能在 HBITMA ...
嗯
UpdateLayeredWindow 没有任何问题……WIN2000确实不支持=v=
效果比SetLayeredWindowAttributes 好。
支持半透明,可以传递Png,实现简单,就是不能用WM_PAINT这个比较讨厌……
带上WS_EX_LAYERED样式实现比较简单的说……- public void SetBits(Bitmap bitmap)
- {
- //if (!haveHandle) return;
- 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(bitmap.Width, bitmap.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 = 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);
- }
- }
复制代码 |
|