當前位置:編程學習大全網 - 編程語言 - C語言學習問題

C語言學習問題

呵呵.... 在知道這麽幾年了,程序設計區是不是就會有些勤奮又好奇的孩子來問這個問題“如何用C/C++寫出有按鈕和界面的程序啊?”

以下是我的個人經驗,就當拋磚引玉了希望對樓主有用。

另外不是我說樓上的幾位,初學者再接觸到這個問題時很容易被誤導,作為壹個過來人,我希望樓主能從基本原理開始學習再接觸MFC之類的AFrm。

我大二的時候也是被這個問題困擾了好久,從進入計算機系就期待學習編程,可是編程課開了才發現,老師講的這個語言那個庫,編出來的程序和我們平時在電腦上用的有按鈕有文本框有圖片的程序根本不壹樣嘛,編出來的都是DOS壹樣的黑框程序,壹股被騙了的感覺。

於是就跟妳現在壹樣開始摸索,可惜那時候還沒有百度知道什麽的,想搜索也無從下手,後來終於從各種各樣的資料中拼湊出了壹點知識,原來我想要編寫的那種有按鈕有對話框的程序,就是所謂基於GUI的程序。

GUI- Graphic User Interface --圖形用戶界面,是和只有main函數的控制臺程序完在交互方式上完全不同的。控制臺程序--也就是妳說的黑窗口,完全通過輸出字符、輸入字符的方式和用戶進行交互,而GUI,則使用各種圖形化的控件來接受輸入和產生輸出,這些控件就包括按鈕、文本框、輸入框、甚至圖片、視頻和聲音等等。

那麽,怎麽使用我們熟悉的C語言真正去寫這樣壹個基於GUI的程序呢?首先很遺憾,C語言本身,也就是C語言的語法元素和標準庫,並不提供對GUI的支持,也就是說妳無法使用C語言和stdio或者stdlib寫出壹個有“對話框”的程序...至於C為什麽不提供GUI,原因很多也很有道理,這裏我就不細說了。那麽要寫出GUI程序,就必須有第三方提供的庫。

很幸運的是,我們常用的Windows操作系統理所應當的為我們提供了GUI庫,這個庫可以通過簡單的包含<windows.h>來進行使用,而這個庫本身的代碼,則放在Windows最核心的壹個文件裏:user32.dll(所以這是壹個動態鏈接庫),不光我們可以使用這個現成的GUI庫,事實上,妳所看到的絕大多數在Windows下運行的程序都使用了user32.dll,包括微軟自己的visual stdio等等。

說到了User32.dll就不得不提壹下另壹個重要概念,那就是API,Application Programming Interface,API是操作系統或其他程序提供給編程人員的壹個接口,使用這個接口能夠“命令”操作系統做壹些事情。在Windows中為例,如果妳想通過資源管理器去查看某個文件,就可以使用Windows提供給妳的文件API,如果想在屏幕上繪制圖形,則使用Windows的圖形API(也就是微軟的GDI),那麽我現在想寫壹個有“窗口、對話框、按鈕”的程序呢?當然有現成的生成窗口、對話框等控件的API供我們使用了。

具體的WindowsAPI可以很容易查到,但是其總數非常多(妳可以想想,像Windows這樣龐大的壹個操作系統,需要給我們提供多少函數才能描述他的各種功能)這裏是W32API手冊:/net/357/9344857.shtml

妳可能發現效果和妳想象的還有差距,而且很多東西看不懂(HINSTANCE是啥東西?LPTSTR什麽意思?)記住,萬事開頭難,尤其是Windows這樣復雜的東西。

這個程序運行後妳會看到壹個啥也沒有的窗口,壹運行就彈出壹個Windows下常見的對話框,顯示壹句hello world,怎樣,不是黑框了吧?但是估計還是很沒有成就感...好簡單是吧?記住,再復雜的程序,都是在這樣簡單的壹個框架基礎上構架起來的。

其中的

MessageBox(NULL, _T("Goodbye, cruel world!"), _T("Note"), MB_OK);

這壹句,就是調用了Windows提供的壹個函數(WinAPI),該函數的作用也很簡單:彈出壹個普通的消息框,第壹個參數為該消息框標題,第二個為顯示的內容,第三個是圖標類型,第四個是這個消息框提供哪些按鈕。(長久不用winAPI了,如果記錯了請諒)

除了簡單的消息框,Windows程序常見的按鈕、文本框等等,微軟都幫我們做好了並且提供了相應的API供我們使用,舉個簡單的例子:

hwndButton = CreateWindow(

"BUTTON", // predefined class

"OK", // button text

WS_VISIBLE | WS_CHILD | BS_DEFPUSHBUTTON, // styles

// Size and position values are given explicitly, because

// the CW_USEDEFAULT constant gives zero values for buttons.

10, // starting x position

10, // starting y position

100, // button width

100, // button height

hwnd, // parent window

NULL, // No menu

(HINSTANCE) GetWindowLong(hwnd, GWL_HINSTANCE),

NULL); // pointer not needed

看起來很唬人吧?這條語句創建了壹個按鈕,參數很多但是實現的功能很簡單。其他的東西妳可以類推。

講到這裏,我就只能點到為之了,因為壹個健全的窗口程序,最起碼應該有壹個消息循環,來捕捉用戶的鼠標移動、鼠標點擊、鍵盤輸入等等,才能實現真正的GUI功能,這些遠不是我壹個帖子能夠說清的,樓主想要了解的話可以看看這裏:/Article/34471.html

呵呵,很好的菜鳥入門站,我當年就沒有這些資源啊...

接下來,先不說深度了,(實在說不完),說說廣度吧。

妳可能註意到了,我之前說的這些窗口程序都輸入所謂的Windows窗口程序設計,因為妳使用了Windows系統提供的GUI,那麽自然地,這些程序只能在Windows平臺上運行,並且回去動態鏈接user32.dll或者kernel32.dll等存放著WindowsAPI具體實現代碼的庫。因此這些程序在Linux下是無法運行的。

除了最最常見的WindowsGUI,在Linux下我們還有很多選擇,比如GTK,這是另外壹套GUI,也會為妳提供對話框、按鈕等等的控件,但是他們的外觀就和Windows下的完全不同啦。類似的還有Java的圖形界面庫Swing等等。

熟悉了WIndowsAPI之後,很多人會感嘆,使用WinAPI寫程序太麻煩太復雜,所有的消息要用戶自己處理,控件要單獨維護,尤其麻煩的是,WinAPI不是面向對象的。

於是乎,微軟乘著C++的東風,推出了能夠以面向對象方式編寫WIndows窗口程序的另壹大套類庫,也就是樓上某同學所提到的:MFC(Microsoft Fundation Class libray),在MFC中,壹個窗口也好,壹個按鈕也好都是屬於某個類的對象,其使用方式、消息處理和事件處理方式遠比直接使用WIndowsAPI方便。但其實在底層,這些MFC提供的類還是在調用WinAPI.

MFC從VC6.0開始就和微軟的VS系列捆綁在壹起,妳可以直接使用VS的新建項目向導建立“MFC項目”。

等到了這壹步,相信妳就可以基本熟練地寫出“非黑框”程序了。

但是記住,GUI只是程序的型,算法、業務流和數據結構才是程序的神。現在妳也許覺得“圖形程序”看起來比黑框程序要“高級”,其實很多運算復雜、任務繁重的程序反而更偏向使用控制臺程序,因為從健壯性上來說,控制臺程序遠強於GUI程序,更重要的原因是,壹旦使用GUI,勢必依賴某個GUI庫(因為C本身不含GUI),則會影響程序移植性。

在嵌入式領域、密集計算領域等,選擇黑框程序更加明智。而明顯註重用戶體驗的程序,則GUI更加重要。

...呼,寫完~

  • 上一篇:求Free Pascal函數與過程的教案(課件)
  • 下一篇:怎樣徹底刪除電腦軟件?
  • copyright 2024編程學習大全網