DTI*_*att 4 c# windows paint winforms window-decoration
我们在程序中创建了一些自定义"窗口",当VisualStyles启用时,我们可以找到窗口的每个元素及其大小,并使用相应的渲染器自行绘制,包括最小化和关闭按钮.
我们想在VisualStyles禁用时做同样的事情并且当前绘制我们自己的窗口,但它们非常难看.在WinForms C#中是否可以绘制Windows经典风格的窗口?我发现了ClassicBorderDecorator它,但是它适用于WPF.
或者,如果不这样做,我们怎样才能得到我们以下列方式做的窗饰的像素大小:
// Get the height of the window caption.
if (SetRenderer(windowElements["windowCaption"]))
{
captionHeight = renderer.GetPartSize(graphics.Graphics, ThemeSizeType.True).Height;
}
// Get the thickness of the left, bottom,
// and right window frame.
if (SetRenderer(windowElements["windowLeft"]))
{
frameThickness = renderer.GetPartSize(graphics.Graphics, ThemeSizeType.True).Width;
}
Run Code Online (Sandbox Code Playgroud)
Windows不提供经典风格的渲染器,您必须自己做饭.使用SystemInformation类获取指标Color.FromKnownColor()以获取颜色.
唯一棘手的部分是让框架按钮看起来很好.最好的办法是使用字体中的字形而不是尝试自己绘制它们.Webdings字体非常适合这种情况.
我无法验证它的匹配程度,我的机器启动Windows 8并且不再支持经典风格.否则强烈暗示你可能不应该投入太多时间进入这个:)一些示例代码:
protected override void OnPaintBackground(PaintEventArgs e) {
base.OnPaintBackground(e);
var captionHeight = SystemInformation.CaptionHeight;
int border = SystemInformation.Border3DSize.Width;
var color1 = Color.FromKnownColor(activated ? KnownColor.ActiveCaption : KnownColor.InactiveCaption);
var color2 = Color.FromKnownColor(activated ? KnownColor.GradientActiveCaption : KnownColor.GradientInactiveCaption);
var captionrc = new Rectangle(0, 0, this.ClientSize.Width, captionHeight);
using (var brush = new LinearGradientBrush(captionrc, color1, color2, 0, false)) {
e.Graphics.FillRectangle(brush, captionrc);
}
int textx = border;
if (this.Icon != null) {
int height = SystemInformation.SmallIconSize.Height;
var iconrc = new Rectangle(border, (captionHeight - height)/2, height, height);
textx += height + border;
e.Graphics.DrawIcon(this.Icon, iconrc);
}
var color = Color.FromKnownColor(activated ? KnownColor.ActiveCaptionText : KnownColor.InactiveCaptionText);
using (var font = new Font(this.Font.FontFamily, SystemInformation.CaptionHeight - 4 * border, GraphicsUnit.Pixel)) {
TextRenderer.DrawText(e.Graphics, this.Text, font, new Point(textx, border), color);
}
using (var font = new Font(new FontFamily("Webdings"), captionHeight - 4 * border, GraphicsUnit.Pixel)) {
var glyphs = this.WindowState == FormWindowState.Maximized ? "\u0030\u0031\u0072" : "\u0030\u0031\u0072";
var width = TextRenderer.MeasureText(glyphs, font).Width;
TextRenderer.DrawText(e.Graphics, glyphs, font,
new Point(this.ClientSize.Width - width, border),
Color.FromKnownColor(KnownColor.WindowFrame));
}
}
Run Code Online (Sandbox Code Playgroud)
在我的机器上看起来像这样,并不完全丑陋:)

| 归档时间: |
|
| 查看次数: |
295 次 |
| 最近记录: |