实际上我做了一个用户控件,它的界面就像windows vista和7中的“glass windows”。 我的模式是这个网址:extremestudio.ro/blog/?p=99
使用“Photoshop”并使用C#和.Net绘图类绘制每一层,我最终绘制它。 在第一步中,我创建一个位图类,然后使用图形路径和画笔等在其上绘制每个图层。
这是控件:glass panel (您必须先将“reflect.png”文件添加到项目资源中,然后将类添加到项目然后构建,...) 此控件继承自表单命名空间中的Panel
protected override void OnCreateControl()
{
draw();
BackgroundImageLayout = System.Windows.Forms.ImageLayout.Stretch;
Parent.Move += new EventHandler(Parent_Move);
base.OnCreateControl();
}
void Parent_Move(object sender, EventArgs e)
{
draw();
}
public void draw()
{
if (Width < 20 || Height < 20)
{
return;
}
Bitmap b = new Bitmap(Width, Height);
Graphics gr = Graphics.FromImage(b);
GraphicsPath gp=new GraphicsPath();
LinearGradientBrush br;
gr.SmoothingMode = SmoothingMode.HighSpeed;
//draw shadow(black glow)
for (int i = 0; i < 10; i++)
{
gp = DrawRoundRect(i, i, Width - i * 2 - 1, Height - i * 2 - 1, 7);
br = new LinearGradientBrush(Bounds, Color.FromArgb(i * 3, Color.Black), Color.FromArgb(i * 3, Color.Black), LinearGradientMode.Vertical);
gr.DrawPath(new Pen(br, 4), gp);
br.Dispose();
}
//fill white 50
gp = DrawRoundRect(9, 9, Width - 19, Height - 19, 7);
br = new LinearGradientBrush(Bounds, Color.FromArgb(30, Color.White), Color.FromArgb(30, Color.White), LinearGradientMode.Vertical);
gr.FillPath(br, gp);
它是绘图代码的一部分。 我最终将创建的位图设置为面板背景。
我认为(不记得)我也使用“onPaint()”重写方法,但程序崩溃了。 因为油漆事件连续上升。
行,
我的问题是移动和调整父窗体大小时此控件的效率很低。 因为这个工作,导致调用控件的“绘制”方法,并且当调用方法得到很多时,它会减慢应用程序的速度,更重要的是,它非常耗费CPU。
我希望您了解一种绘制此控件的用户界面的方法
1 - 使用dot net 2.0
2效
有一种方法可以使用directx绘制UI,...?(我的意思是不是WPF)
如果没办法,我将删除导致高CPU使用的代码的反射部分。
感谢大家的关注。
我删除了使程序变慢的所有代码。 我把它简化为一个简单的边框和阴影。它仍然是美丽的。
但我关于使用directx绘制控件的问题仍然存在。
答案 0 :(得分:1)
使用DoubleBuffered
属性。 (将其设为true
。)
绘图的工作速度要快十倍!