用C#改写C++,实现窗体渐变半透明效果!【再加100分=200分】

benbenRH 2009-03-26 09:25:45
用C#实现
http://www.souzz.net/html/edu/C1/12649.html
这种效果。
200分都不够的可以再加!非常感谢!
...全文
430 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
yymao2005 2010-01-04
  • 打赏
  • 举报
回复
有什么办法能让form半透明,里面的控件不透明呢?
tmd456 2009-03-26
  • 打赏
  • 举报
回复
private void timer_Tick(object sender,EventArgs e)
{
this.Opacity+=0.1
}
benbenRH 2009-03-26
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 cbgn 的回复:]
http://blog.csdn.net/zhoufoxcn/archive/2008/06/16/2554064.aspx
[/Quote]
五楼的方法还没有看,但是六楼所说的不是我要实现的,你这个渐变是时间上的,而我要求的是空间上的渐变。时间上的我知道怎么实现,但是还是谢谢!
五楼的方法等一下再研究一下!
cbgn 2009-03-26
  • 打赏
  • 举报
回复
http://blog.csdn.net/zhoufoxcn/archive/2008/06/16/2554064.aspx
gomoku 2009-03-26
  • 打赏
  • 举报
回复
1、设置窗口的格式为WS_EX_LAYERED
2、用UpdateLayeredWindow() API进行Alpha混合

3、Alpha值控制透明程度
4、Bitmap mask = GetMaskImage()可以换成从文件中加载,不过文件必须是带ALPHA通道的32位图像。



using System;
using System.Drawing;
using System.Windows.Forms;
using System.Runtime.InteropServices;

public class Form1 : Form
{
public Form1()
{
this.TopMost = true;
this.MouseClick += delegate { MessageBox.Show("quiting..."); this.Close(); };
}

static void Main()
{
Application.Run(new Form1());
}

protected override CreateParams CreateParams
{
get
{
CreateParams parameter = base.CreateParams;
parameter.ExStyle |= WS_EX_LAYERED;
return parameter;
}
}

protected override void OnLoad(EventArgs e)
{
Bitmap mask = GetMaskImage();
this.Size = mask.Size;

byte blendOp = 0; // AC_SRC_OVER
byte blendFlags = 0; // 0
byte sourceConstantAlpha = 255; // 0 ... 255
byte alphaFormat = 1; // AC_SRC_ALPHA
int blend = BitConverter.ToInt32(new byte[] { blendOp, blendFlags, sourceConstantAlpha, alphaFormat }, 0);

Size size = mask.Size;
Point point = Point.Empty;

IntPtr desktopDC = IntPtr.Zero;
IntPtr memDC = IntPtr.Zero;
IntPtr imgObject = IntPtr.Zero;
try
{
desktopDC = GetDC(IntPtr.Zero);
memDC = CreateCompatibleDC(desktopDC);
imgObject = mask.GetHbitmap(Color.Black);

IntPtr oldObject = SelectObject(memDC, imgObject);
UpdateLayeredWindow(this.Handle, desktopDC, ref point, ref size, memDC, ref point, 0, ref blend, ULW_ALPHA);
SelectObject(memDC, oldObject);
}
finally
{
DeleteObject(imgObject);
DeleteDC(memDC);
ReleaseDC(IntPtr.Zero, desktopDC);
}
}

Bitmap GetMaskImage()
{
Bitmap mask = new Bitmap(250, 250);
string text = "Click me";

using (Font font = new Font(FontFamily.GenericSerif, 30))
using (Graphics g = Graphics.FromImage(mask))
{
g.FillEllipse(Brushes.Purple, 0, 0, 200, 300);
g.DrawString(text, font, Brushes.DarkBlue, 12, 102);
g.DrawString(text, font, Brushes.LightBlue, 10, 100);

}
for (int y = 0; y < mask.Height; y++)
{
for (int x = 0; x < mask.Width; x++)
{
Color c = mask.GetPixel(x, y);
if (c.B > 0) mask.SetPixel(x, y, Color.FromArgb( (255-y) & 0xff, c));
}
}
return mask;
}

const int ULW_ALPHA = 0x02;
const int WS_EX_LAYERED = 0x80000;

[DllImport("user32")]
static extern bool UpdateLayeredWindow(IntPtr hwnd, IntPtr hdcDst, ref Point pptDst, ref Size psize, IntPtr hdcSrc, ref Point pprSrc, int crKey, ref int pblend, int dwFlags);

[DllImport("gdi32")]
static extern IntPtr CreateCompatibleDC(IntPtr hDC);

[DllImport("user32")]
static extern IntPtr GetDC(IntPtr hWnd);

[DllImport("user32")]
static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);

[DllImport("gdi32")]
static extern bool DeleteDC(IntPtr hdc);

[DllImport("gdi32")]
static extern IntPtr SelectObject(IntPtr hDC, IntPtr hObject);

[DllImport("gdi32")]
static extern bool DeleteObject(IntPtr hObject);
}
  • 打赏
  • 举报
回复
在循环里更改Opacity的值
benbenRH 2009-03-26
  • 打赏
  • 举报
回复
渐变,半透明效果,就是从不透明渐变到透明! 还有字体的阴影,是阴影而不是投影,
Jack2013tong 2009-03-26
  • 打赏
  • 举报
回复
帮顶一个
coodd 2009-03-26
  • 打赏
  • 举报
回复
什么透明效果,没看明白?只知道.Net的Form窗体有个Opacity属性,是设置透明度的。
benbenRH 2009-03-26
  • 打赏
  • 举报
回复
五楼的怎么每次运行时,窗体的大小都会改变的? Why???
longhui666888 2009-03-26
  • 打赏
  • 举报
回复
五楼的方法可行
zzxap 2009-03-26
  • 打赏
  • 举报
回复
使用Color.FromArgb

Label lal = new Label();
lal.BackColor = Color.FromArgb(128, Color.White);//半透明

255为完全不透明

this.Opacity = 0;//窗体透明
booker 2009-03-26
  • 打赏
  • 举报
回复
找到了
http://blog.csdn.net/wangjia184/archive/2009/03/16/3995942.aspx

还有mfc的代码可以下载
booker 2009-03-26
  • 打赏
  • 举报
回复
http://www.codeproject.com/KB/dialog/SemiTranDlgWithCtrls/DotNetSource.zip

借花献佛。也是csdn的牛人写的,可以在xp下实现类似vista的窗体效果,可以制作不过则透明窗体。
benbenRH 2009-03-26
  • 打赏
  • 举报
回复
五楼的很好,就是这种效果,明天结贴,因为今天加不到分,明天再加100分后结贴。非常感谢!

110,572

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧