如果我想在传统的Windows窗体中创建一个带有绘图区域的表单,我会扩展面板类,然后覆盖onPaint方法来执行我的自定义绘图,如下所示:
public class SpecialPanel : System.Windows.Forms.Panel
{
protected override void OnPaint(PaintEventArgs e)
{
Graphics G = e.Graphics;
G.DrawEllipse(new Pen(Color.Red), 50, 80, 50, 10);
}
}
但是在WPF中,如果我尝试扩展canvas类,则没有onPaint方法来覆盖
public class SpecialCanvas : Canvas //Error no OnPaint method
{
public override OnPaint(PaintEventArgs e)
{
}
}
如果我想绘制画布,我会以类似的方式进行绘制:
Canvas.SetLeft(shape.shape, r.Next(1, 1150));
Canvas.SetTop(shape.shape, r.Next(1, 500));
SolidColorBrush b = new SolidColorBrush(Windows.UI.Color.FromArgb(255, (byte)r.Next(1, 255), (byte)r.Next(1, 255), (byte)r.Next(1, 255)));
shape.shape.Fill = b;
shape.shape.Stroke = b;
Cann.Children.Add(shape.shape);
其中Cann
是画布对象,shape.shape
是矩形。
我的问题是,这些绘制方法与表格之间的根本区别是什么?
答案 0 :(得分:2)
WPF和GDI / GDI +之间的基本区别
Windows Presentation Foundation(WPF)与图形设备接口(GDI)和GDI +根本不同,要求以不同的方式处理编程的许多方面。本主题简要概述了主要差异。
<强>窗强>
使用GDI / GDI + API构建的应用程序使用许多窗口,并位于父窗口(MDI)下。在WPF中构建的应用程序有一个窗口。
计量单位
使用GDI / GDI + API构建的应用程序使用硬件像素作为度量单位。在这些应用中,随着显示设备的分辨率增加,所得图像减少。 WPF内置的应用程序使用与设备无关的单元(1/96英寸)作为度量单位。当系统的DPI为96时,两者是等价的。
控制定位
使用GDI +构建的应用程序使用绝对定位。调整父级的大小时,子元素不会随之调整大小。在WPF中构建的应用程序可以使用绝对,动态或数据绑定定位。无论是绝对定位还是动态定位,控件都相对于父元素定位。
图片基础
在GDI / GDI +中形成的图像是基于像素的光栅图像。在WPF中形成的那些可以是可缩放的矢量图像。
渲染引擎
GDI和GDI +都是基于Win32构建的。 GDI基于设备上下文的概念,其中应用程序获取设备上下文的句柄,并使用句柄以与设备交互。 GDI +是围绕GDI的包装器,它创建了一个C ++ Graphics对象。另一方面,WPF建立在DirectX上,这意味着它可以在执行绘图操作时利用硬件加速。
渲染模式
使用GDI和GDI +,渲染使用立即渲染:应用程序重新绘制失效的区域。在WPF中,渲染使用保留渲染:应用程序跟踪绘图信息,但系统执行绘制。
<强>绘画强>
使用GDI和GDI +,剪切用于确定已变为无效且需要绘制的区域的边界。在WPF中,绘画是从后到前进行的,并且组件相互涂漆。
钢笔和画笔
GDI和GDI +使用当前画笔和当前笔的概念。在WPF中,必须在每次绘图调用时传递画笔和笔。
绘制区域优化
绘制区域优化是使用GDI或GDI +绘画的重要部分。在WPF中,它不被考虑。
<强>事件强>
GDI和GDI +使用订阅/通知来使用事件和事件处理程序委托。 WPF使用冒泡,隧道和直接事件通知,事件在VisualTree中上下移动。
视频和音频
GDI +或Windows Forms不提供对视频和音频的直接支持,但必须通过Windows Media Player等媒体播放器获取。 WPF直接支持视频和音频。