有一定基礎的 C++ 學習者該如何學習 Windows 編程?,windows
人的心理有個奇妙的特性:一項知識一旦學會之後,學習過程中面臨的困惑和不解很快就會忘得乾乾淨淨,似乎一切都是自然而然,本來就該這樣的。因此,關於「如何入門」這類問題,找頂尖高手來回答,未必能比一個剛入門不久的人來回答要好。就譬如最高票的那個回答,是一個非常精通 Windows 編程的高人回答的,但這樣的答案能給初學者帶來多少協助,我這裡想先打一個問號。
前段時間剛輔導了一個學生學會了 Win32 GUI 編程,剛好看到這個問題,順手就邀請他回答了。並非是給他布置總結作業,僅僅是希望能從他這裡得到第一手的經驗和個人體會,能給尚未入門的朋友帶來更多協助。可惜的是,讀了他的回答之後,我感覺他的總結相當不到位。一份好的總結,應該能做到讓一個尚未入門的人讀過之後,能夠原樣複製他的學習過程,學到和他目前一樣的程度。很可惜這份總結裡強調的全都是一些細支末節的東西,而最關鍵的核心問題卻一個都沒有提到。我只能站在我的角度把這個問題再總結一遍,希望這位學生在看過我的總結之後,能重新修改一下他的答案,讓它能夠真正對初學者有用起來。另外,這類問題的答案我希望他不要使用匿名身份,這也算是一個對自己的言論表示負責的態度吧。
接下來我就大致總結一下我是如何輔導這個學生學會 Win32 GUI 編程的:
———— 本文————
本文只涉及 Win32 GUI 入門,不涉及其它 Windows 編程的話題,譬如網路操作、非同步 IO、系統服務、線程同步什麼的,不要因為我沒有提到那些內容就跳出來說我「答非所問」,我相信題主想要問的也不會是那些話題。
要想學習 Windows 編程,首先最重要的一點是:C 語言必須入門。這個要求聽上去像是廢話,可是事實上目前國內大部分電腦專業的學生本科甚至碩士畢業都沒能達到,因此我不得不單獨提出來再次強調一遍。C 語言入門之後再學 Windows 編程,可以避免很多不必要的挫折,節約很多時間。固然,有很多人在 C 語言沒有入門的情況下就開始了 Windows 編程的學習,到處碰壁撞得頭破血流之後仍然學會了 Windows 編程,而且順便把 C 語言也入門了的,譬如我,但我並不認為這樣的經曆是值得向所有人推崇的。我個人認為,先停留在黑框框下把 C 語言入門了再開始學習 Windows 編程,是性價比更高的做法。
至於 C++ 的學習,C++ 和 Windows 編程是兩棵不相關的技能樹,學習 C++ 並不要求你必須懂得 Windows 編程,寫 Windows 程式也並非必須用 C++。熟悉 C++ 對於學習 Windows 編程或許有間接的協助,但至少直接的聯絡是沒有的,你完全可以在沒學過 C++ 的情況下就開始學習 Windows 編程。
要入門 Windows 編程,最重要的不是閱讀什麼教材,使用什麼工具,而是先必須把以下幾個對於初學者來說非常容易困惑的重要概念搞清楚:
1. 文字的編碼和字元集。這部分需要掌握 ANSI 模式和 Unicode 模式的區別(並且明白這裡 ANSI 和 Unicode 事實上都屬於術語的誤用);明白這兩種模式其實是通過宏實現的一個 dirty-hack(有相當數量的人在實際工作中因為這個宏的原因被咬過);知道如何通過 TCHAR、_T()、條件編譯等方式寫出 Unicode 相容的代碼(即使你將來寫的所有 Windows 程式的源碼都將是 pure Unicode 的,不再會支援 ANSI 模式編譯)。
2. 熟悉常見 Win32 類型名稱(譬如 LRESULT、WPARAM、UINT、LPCTSTR 等都是什麼意思),知道什麼是函數調用規範(譬如 __stdcall、__cdecl 等,以及常見別名譬如 WINAPI、PASCAL 等。不要求記住這些調用規範在彙編層面都是怎麼實現的,只需要知道它們是不同的,大概瞭解為什麼不同,為什麼不能混用)。
3. 瞭解控制代碼的大概原理和資源管理。這部分要求比較簡單,一個 C 語言真正入門的學生,在之前的學習裡應該早就已經涉及過動態記憶體分配和管理了,也在一些練習裡自己實現過類似控制代碼的物件導向封裝方式了,因此學到這裡的時候只要把控制代碼和他之前學過的內容聯絡起來,這部分並不難學。但如果你遇到動態記憶體分配的時候還是搞得一塌糊塗,對於對象所有權轉移、生命週期管理等還一頭霧水,我個人建議你先回到「黑框框」把 C 語言入門了再來學 Windows 編程。
4. 理解訊息模型。當一個程式調用 GetMessage 之後,在收到訊息之前你的程式是不在啟動並執行,相當於是死在那兒的,這對於之前從來沒有接觸過 Win32 GUI 編程的人來說這個概念相當反直覺,需要舉足夠的例子來協助他理解為什麼一個「收不到訊息就死在那裡完全不運行」的記事本能做到用滑鼠一點菜單就能彈出來,沒人動它的時候它的游標仍然隨時都在一閃一閃等等。思維轉過彎來,理解了這個概念之後,對於為什麼不能在表單過程裡做費時的操作,UI 線程和背景工作執行緒都有什麼用,以及什麼時候需要啟動背景工作執行緒等問題,也就自然而然就能想明白了。
5. 理解表單重繪機制。這點其實屬於訊息模型的一個子話題,但由於入門的時候會給初學者帶來的困擾很大,因此我單獨提出來作為一個點。在 Windows 9x 下,一個視窗出現在另外一個視窗上方的時候,是會把下面的視窗上的內容抹去的。當上面的視窗離開之後,下面的視窗需要重畫自己被抹去的內容。更高版本的 Windows 雖然系統能夠自動緩衝被遮蓋的表單上的內容,但從編程的角度來看,程式員仍然需要遵從之前的視窗繪製機制來編寫自己的程式,假定自己的程式被覆蓋的時候會被擦除。為了能夠正確處理擦除與重繪,繪製視窗內容必須通過監聽重繪訊息來進行,想改變視窗內容的時候不能隨時往視窗上畫,而是要先準備好要畫的內容但不畫,然後發訊息觸發重繪訊息讓系統通知你畫。這些反直覺的行為的理解和掌握,是初學的時候必須邁過的坎。
上面這些概念都掌握之後,入門 Win32 GUI 編程就是一件相對容易的事情了。接下來只要找一份入門教程,按部就班把例題都過一遍,再自己親手寫幾個 GUI 小程式,差不多也就上手了。這位學生在總結的時候提到說我推薦了一份非常有名的教程,很抱歉讓他失望了,那份教程其實我自己都沒看過,我只是在網上隨手搜了一個教程,看了一下目錄,發現他入門需要的知識點上面都有列舉,於是就發給他了。總之,入門 Windows 編程,最重要的是理解並掌握上面提到的幾個基本概念,概念掌握了,任何一份不要存在嚴重錯誤和硬傷的教材都可以用來入門,至於具體的 API 怎麼用,用的時候現查手冊就可以了,沒必要把「學習 API 的使用」作為一個重點去攻克。
先總結那麼多,歡迎補充!
http://www.bcwhy.com/thread-21734-1-1.html
要學習windows程式設計,需要什基礎?只有C語言基礎行?
我覺得完全可以的,我剛用c語言做了個圖形介面程式,全部調用API來實現的。我以前從沒做過windows編程。從這次做這個圖形介面程式看,感覺windows編程需要你懂點作業系統。比如進程、線程、線程通訊的方式等。
如果想學習WINDOWS中的編程,要先學習C或C++
編程首先要看你自己是不是適合學編程。
編程需要一定的邏輯思維能力才行。
想學c++/C#/java等程式設計語言
先把C語言學會了,C語言是程式設計語言的鼻祖。
這樣你再學c++/C#/java等會很容易的上手。
編程不是多看書,而是多動手操作,這樣才能提升,哪裡有錯誤了先自己解決,解決不了的話可以去Google或百度查去。或問其他人。
多練!!!