現在還有必要學習 GDI 嗎?WPF 能完全替代 GDI 嗎?

大家對 GDI 有什麼看法?


GDI是圖形設備介面,而WPF是一個呈現框架,根本上並不是同一種東西。單就繪圖功能來說,GDI的大部分功能已經可以很簡單的使用WPF實現了,而且WPF做的更容易、更強大,開發效率和可維護性也更好。推薦學習WPF。

在寫.NET程序的時候,對本機代碼的態度一般是按需學習和使用,當.NET不能滿足你的特定功能或性能需求的時候(例如要處理Win32 消息),再通過互操作去使用本機代碼,如Win32 API、GDI和COM等。

WPF繪圖取代GDI的主要障礙在於WPF是託管的.NET代碼,而GDI是本機代碼。WPF程序如果不注意優化會遇到一些性能問題,同時部署上也有一定困難(需要同時部署.NET運行時,耗時太長,系統要求也高於本機代碼)。不過微軟從.NET4.0已經開始著重考慮簡化.NET部署的問題,而且隨著Windows 8中.NET API地位的提高,相信以後WPF等.NET應用會更加普及,長遠看WPF繪圖很可能會取代GDI成為主流的繪圖方式。


不相兼容XP的話,應該從Direct2D開始學。這是一個強大的繪圖系統,從功能上來講,GDI相比之下屁都不是。


現在除非去操作印表機否則不要用 GDI 了

有追求的 win32 程序員都應該直接用 DX11 做界面


回答你兩個問題

現在還有必要學習 GDI 嗎?

我認為沒有必要,除非你的項目有維護老項目的需求。

WPF 能完全替代 GDI 嗎?

看你所涉及的方面,比如是否能在新的平台上運行,如果不需要去兼容很老的平台,那麼WPF要比GDI好得多。


這些都是實現的手段,除非工作需要或者是有愛好想自己弄點小東西,最好花時間在內功修鍊上,比如.Net底層的一些機制,推薦CLR via C#這本書~或者演算法,數據結構,方面的書,我曾經也比較關注新技術,但是後來發現,基礎才是最重要的,所以現在每天都堅持看書,夯實基礎,學技術,切忌浮躁。


設計思想不同,應用場景也不同。

WPF傾向於提供一套矢量的、有VisualTree和狀態保存機制的完整方案,用了XAML作為展現層基礎,矢量繪圖、高集成度比如Storyboard等等還有Visual和後台對象的緊密連接讓WPF成為靠譜的解決方案。

GDI則是傳統的用Pixel來講話的圖形工具……兩者應用場景是不同的,有交集也有各自優勢。

WPF後來衍生出了Silverlight,Windows Phone的界面框架和Windows8的界面框架(XAML Based),如果你希望做這樣的App,可以直接看WPF。

如果你希望產生一張複雜圖表的靜態圖片,或者希望習慣各類draw loop形式的遊戲開發框架,可以看看GDI……對每一幀的掌控是一件很棒的事。

PS:兩者交集很多,WPF可以通過Renderer渲染到bmp來實現圖表的功能,但後台VisualTree並不節約資源如果你只是需要靜態圖片。WPF也可以通過在App里hook特定對象來控制Context的刷新,得到每一個frame的掌控,但並不是建議的編程方式。在WPF里你可以通過WriteableBitmap來產生Pixel based Image,推薦WriteableBitmapEx這個小庫,很方便哦


GDI GDI+ DX 可對比

Win32 MFC Winform WPF 可對比


公司項目要用GDI就學GDI,公司沒項目用GDI就不學,直接學WPF就好了


誰還用GDI啊!你看看DX11吧,用了DX你再用GDI你就發現卡的不是一點半點的


gdi不太了解,只知道wpf能讓圖形設計變的更加簡單,如果你想快速入手的話還是可以看看wpf的!


WPF底層也用到了GDI、GDI+、DirectX等技術,隨著展現層變得更強大,以後需要自己操作GDI的情形會越來越少,WinForm、MFC對於展現層的控制未能隨心所欲,而WPF在這方面簡單而又強大,也許以後GDI這一層的API會變得像彙編一樣。


推薦閱讀:

如何理解WPF中的依賴項屬性(DependencyProperty)?
學習C#的正確姿勢以及一些問題?
UWP 程序可以載入插件嗎?
請問c# 做wpf程序是如何將圖片嵌入到exe程序裡面的?
MFC 作為 Windows 原生的 GUI 庫還可以在項目中用嗎?

TAG:NET | C# | WindowsPresentationFoundationWPF | GDI |