當前位置:編程學習大全網 - 編程語言 - 電腦硬件有什麽關系?

電腦硬件有什麽關系?

2.1 Windows應用程序、操作系統和計算機硬件之間的關系

WINDOWS編程是壹種與傳統DOS模式完全不同的編程方式。它是壹種事件驅動的編程模式,主要基於消息。當用戶需要完成某項功能時,會調用操作系統的壹些支持,然後操作系統會將用戶的需求打包成消息,發布到消息隊列中。最後,應用程序將從消息隊列中獲取消息並做出響應。

讓我們這樣來解釋上面的圖例。向下的箭頭1表示操作系統可以操縱輸出設備執行特定的功能,比如讓聲卡發出聲音,讓顯卡繪制圖形。向上箭頭2表示操作系統可以感知輸入設備的狀態變化,比如鼠標移動和鍵盤按壓,可以知道鼠標移動的具體位置和鍵盤按壓的是哪個字符。這是操作系統和計算機硬件之間的交互,應用開發者通常不需要知道具體的實現細節。

2.1.1關於API

向下箭頭3表示應用程序可以通知操作系統執行特定的操作。比如操作系統可以控制聲卡發出聲音,但是它不知道什麽時候發出什麽樣的聲音,所以應用程序要告訴操作系統發出什麽樣的聲音。這種關系就像有壹個會走路的機器人,但是如果人不告訴它往哪個方向走,機器人就不會主動走。這裏的機器人是操作系統,人是應用。

那麽,應用程序是如何通知操作系統執行某個功能的呢?有編程經驗的讀者應該知道,應用程序中的壹個功能是以函數調用的形式實現的。類似地,應用程序以函數調用的形式通知操作系統執行相應的功能。壹個操作系統能完成的每壹個特殊功能,通常都有壹個功能與之對應。也就是說,操作系統把自己能完成的功能以函數的形式提供給應用程序,應用程序調用這些函數稱為系統調用。這些函數的集合就是Windows操作系統提供給應用程序的應用程序編程接口,簡稱Windows API。例如,CreateWindow是壹個API函數。如果在應用程序中調用這個函數,操作系統會根據這個函數提供的參數信息生成相應的窗口。不妨看看EX02_00中的源程序,體驗壹下如何在程序中調用這個CreateWindow API函數。有關該功能的詳細說明,請參考MSDN(微軟開發系統)。

順便說壹下,壹個真正的程序員是不可能記住每壹個API函數的細節及其參數的。通常情況下,妳只記住英文的拼寫,有時候甚至會用語義來拼寫,比如用ShowWindow來顯示窗口,用ExitWindows來退出Windows操作系統等等。API函數的正確拼寫格式和參數的所有信息都是在MSDN快速檢索到的,所以不需要刻意去記憶這些信息,在多次使用的時候這些信息就會在不知不覺中掌握,但是妳必須有能力在必要的時候從幫助系統中檢索到想要的信息,這樣,學習VC++,必須有真實的練習環境,學會查閱幫助系統。千萬不能紙上談兵,要按書上說的壹步壹步來,不然真的不是壹兩年就能學會VC++的。

註意:請不要將這裏的API與java API和其他API混淆。就像它的語義壹樣,API已經成為壹個廣泛使用的技術術語。如果系統或設備向應用程序提供功能、類、組件等的集合。,它被稱為系統的API。有同學曾經問過我這個問題。java API和windows API是什麽關系?是不是意味著Java也可以調用windows中的API?讀者現在應該明白這個問題了,所以我不需要回答了吧?

2.1.2關於消息和消息隊列

向上箭頭4表示操作系統可以將輸入設備的改變上傳到應用程序。如果用戶在程序活動期間按下鍵盤,操作系統可以立即感知事件並知道用戶按下了哪個鍵。操作系統不決定如何響應這個事件,而是把它傳遞給應用程序,應用程序決定如何響應這個事件。例如,如果壹只蚊子咬了我們,我們的神經末梢(相當於操作系統)會立即感知事件,並將其傳輸到我們的大腦(相當於應用程序),我們的大腦最終決定如何對事件做出反應,例如趕走蚊子或將其射殺。對事件作出反應的過程是消息響應,由水平箭頭5表示。

操作系統如何將感知到的事件傳遞給應用程序?這是通過消息機制實現的。操作系統將每個事件打包成壹個名為message MSG的結構,並將其傳遞給應用程序,參見MSDN。

MSG結構定義如下:

typedef結構tagMSG { // msg

HWND hwnd

UINT消息;

WPARAM wParam

LPARAM lParam

DWORD時間;

點pt;

} MSG

不能理解這個定義的讀者,請快速復習壹下C語言。它的基本含義是定義壹個struct tagMsg的結構,在以後的應用中用MSG來代替struct tagMSG。該結構中每個成員變量的作用如下:

第壹個成員變量HWND表示消息所屬的窗口。消息通常與壹個窗口相關聯。例如,如果您在活動窗口中按下鍵盤,鍵盤消息將被發送到該窗口。在VC中,窗口由hwnd變量類型標識。關於windows的知識後面會詳細講解。

第二個成員變量message表示消息代碼。無論是按下鍵盤還是移動鼠標,都是用數字來表示的,不同的值對應不同的消息。因為數值不好記,所以在VC中,消息對應的數值定義為WM_xxx宏的形式,xxx對應某個消息的英文拼寫的大小寫,比如鼠標移動消息是WM_MOUSEMOVE,鍵盤按壓消息是WM_KEYDOWN,壹個字符消息的輸入是WM_CHAR等。我們通常在程序中使用WM_xxx宏形式的消息。

提示:如果想知道WM_xxx消息對應的具體數值,請在程序中選擇WM_xxx,點擊右鍵,在彈出菜單中選擇goto definition,可以看到宏的具體定義。跟蹤、檢查變量的定義,使用這種方法非常有效。

第三,四個成員變量是wParam和lParam,用於補充消息。比如message成員表示壹個字符消息,但是沒有指定輸入的是哪個字符,所以需要補充其他變量。wParam和lParam的含義因消息而異。讀者可以用goto定義函數查看WPARAM和LPARAM的定義,發現它們分別是無符號int和long,並不是什麽神秘的變量類型。VC++之所以要這麽做,是為了區分變量的用途和變量定義的類型。對於同壹個變量類型,可以根據其用途細分定義成許多其他形式。這個概念在VC++中被廣泛使用,也是造成初學者困惑的壹個因素。

最後兩個變量分別代表消息發送的時間和鼠標的當前位置,這裏沒什麽好解釋的。

理解了消息,我們來看看消息隊列。如上圖所示,每個Windows程序都有壹個消息隊列。隊列是先進先出的緩沖區,通常是某種可變類型的數組。消息隊列中的每個元素都是壹條消息,操作系統將生成的每條消息按順序放入消息隊列,第壹條消息在第壹個單元中,第二條消息在第二個單元中,依此類推。應用程序總是從隊列中取出第壹條消息。取完消息後,第二條消息成為第壹條,其余消息依次向前。應用程序獲得消息後,可以知道用戶的操作和程序狀態的變化。

例如,如果壹個應用程序從隊列中獲得壹個WM_CHAR消息,它必須是用戶輸入了壹個字符,並且能夠知道輸入的是哪個字符。應用程序得到消息後,必須對其進行處理,也就是我們通常所說的消息響應。消息響應是通過編碼來實現的,這也是Windows程序的主要代碼區。在消息響應代碼中,我們很可能會調用操作系統提供的API函數來完成某個特定的功能。如果收到窗口的WM_CLOSE消息,可以調用API函數DestroyWindow關閉窗口,或者使用API函數MessageBox提示用戶是否真的關閉窗口。

從上面的分析可以想象,要想用VC++編寫Windows程序,不僅要有很好的C語言知識,還要掌握兩個知識點:1。不同消息表示的用戶操作和程序狀態;2 .讓操作系統執行某個函數對應的API函數。

2.2關於手柄

在Windows編程中,我們總是會接觸到壹個叫做句柄的東西。Handle可以這樣理解。Windows程序中產生的任何資源(占用或大或小的內存),如圖標、光標、窗口、應用程序實例(已加載到內存中的程序)等。當操作系統生成這樣的資源時,它應該將它們放入相應的內存中,並為這些內存分配壹個唯壹的標識號。這個標識號是資源的句柄。

為了管理和操作這些資源,操作系統通過句柄找到相應的資源。根據資源的類型,句柄可以細分為各種類型的句柄,如圖標句柄(HICON)、光標句柄(HCURSOR)、窗口句柄(HWND)、應用實例句柄(HINSTANCE)等。由操作系統分配給每個窗口的唯壹標識號是窗口句柄。

  • 上一篇:制作蜂蜜柚子茶應該選擇哪種柚子,紅心柚還是白心柚?
  • 下一篇:大學生創新創業訓練計劃實施方案怎麽寫
  • copyright 2024編程學習大全網