如果我想在传统的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中,如果我试图扩展画布类,就没有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是一个矩形。
我的问题是,这些绘制形式的方法之间的根本区别是什么?
发布于 2014-06-01 12:03:05
与GDI/GDI+的基本区别
(WPF)从根本上不同于图形设备接口(,GDI)和GDI+,要求以不同的方式处理编程的许多方面。本主题简要概述了主要的区别。
Windows
使用GDI/GDI+ API构建的应用程序使用许多窗口,并驻留在父窗口(MDI)下。在WPF中构建的应用程序只有一个窗口。
测度单位
使用GDI/GDI+ API构建的应用程序使用硬件像素作为度量单位。在这些应用中,当显示设备的分辨率增加时,产生的图像就会下降。WPF中的应用程序使用独立于设备的单元(1/96-英寸)作为测量单位。当系统的新闻部为96时,两者是相等的。
控制定位
使用GDI+构建的应用程序使用绝对定位。当父元素被调整大小时,子元素不会随之调整大小。WPF中构建的应用程序可以使用绝对定位、动态定位或数据绑定定位.无论是绝对定位还是动态定位,控件都相对于父元素定位。
图像基
GDI/GDI+中形成的图像是基于像素的光栅图像.在WPF中形成的图像可以是可伸缩的矢量图像。
渲染引擎
GDI和GDI+都建立在Win32上。GDI基于设备上下文的概念,其中应用程序获取设备上下文的句柄,并使用句柄与设备交互。GDI+是GDI的包装器,它创建了一个C++图形对象。另一方面,WPF是建立在DirectX上的,这意味着它在执行绘图操作时可以利用硬件加速。
渲染模式
对于GDI和GDI+,呈现使用立即呈现:应用程序重新绘制无效的区域。在WPF中,呈现使用保留呈现:应用程序跟踪绘图信息,但系统执行绘制。
绘画
对于GDI和GDI+,裁剪用于确定已失效并需要绘制的区域的界限。在WPF中,油漆是从后到前进行的,而组件之间则相互覆盖。
笔和画笔
GDI和GDI+使用了当前笔刷和当前笔的概念。在WPF中,画笔和笔必须与每个绘图调用一起传递。
涂料区域优化
油漆区域优化是用GDI或GDI+绘制涂料的重要组成部分。在WPF中,它不被考虑。
Events
GDI和GDI+使用使用订阅/通知的事件和事件处理程序委托。WPF使用冒泡、隧道和直接事件通知,事件在VisualTree上来回传播。
视频和音频
对视频和音频的直接支持不是由GDI+或Windows提供的,而是必须通过像这样的媒体播放器获得。WPF直接支持视频和音频。
source: http://www.leadtools.com/help/leadtools/v18/dh/to/leadtools.topics~leadtools.topics.differencesbetweengdiandwpf.html
https://stackoverflow.com/questions/23974359
复制相似问题