窗口
窗口的概念很輕易了解,就是我們運(yùn)用軟件時(shí)看到的界面。Windows 的中心就是窗口,它是Windows一統(tǒng)PC操作零碎市場(chǎng)的殺手锏,如下圖所示:
為南木林等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及南木林網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為做網(wǎng)站、成都網(wǎng)站建設(shè)、南木林網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
\"\"
圖1:記事本程序
我們運(yùn)用的軟件都有本人的窗口,比方 QQ、盤算器、記事本等。這些窗口可以包括輸出框、下拉菜單、單選按鈕、多選按鈕、文本區(qū)域等各類各樣的控件(Controls),有的乃至還有動(dòng)畫!
窗口、控件、圖像、音頻視頻等都稱為資本(Resource),在程序中都可以運(yùn)用、創(chuàng)立、添加、修正等。
句柄
在Windows編程中,分歧窗口、控件、圖像等都對(duì)應(yīng)一個(gè)獨(dú)一的數(shù)字(初學(xué)者可以了解為 ID),稱為句柄(Handle)。經(jīng)過句柄,程序可以獲取對(duì)應(yīng)資本的各類信息,也可以運(yùn)用、修正、刪除該資本。
你可以將句柄了解為學(xué)號(hào),你不需求記住先生的姓名、住址、成果等各類信息,當(dāng)你需求理解這邏輯學(xué)生時(shí),只需去教務(wù)處,將學(xué)號(hào)(句柄)通知那邊的任務(wù)人員(Windows),他就可以幫你找到這個(gè)先生。
句柄屏障了許多細(xì)節(jié),程序員不需求理解面前的機(jī)制。例如用 CreateFile() 函數(shù)創(chuàng)立文件后會(huì)前往一個(gè)文件句柄,然后經(jīng)過這個(gè)句柄就可以讀寫、刪除該文件,而不需求理解Windows是若何將句柄與文件聯(lián)系關(guān)系起來的,也不需求理解句柄究竟保管了哪些信息,Windows 是閉源的,這些面前的細(xì)節(jié)只要微軟曉得。
Windows的音訊機(jī)制
在普通的編程中,我們多是經(jīng)過 API 函數(shù)來挪用零碎功用,讓操作零碎來幫我們完成許多任務(wù),例如挪用 CreateFile() 函數(shù),操作零碎會(huì)幫我們創(chuàng)立一個(gè)文件,而不需求我們介入任何任務(wù),十分便利。
反過去,操作零碎也會(huì)“偷懶”,會(huì)挪用我們程序中的函數(shù),讓我們本人處置某些工作。例如用戶敲擊鍵盤,操作零碎會(huì)起首收到告訴,但它并不會(huì)處置,而是挪用程序中的函數(shù),通知程序用戶敲擊了鍵盤,你本人處置好了;假如程序不處置,操作零碎才會(huì)停止默許的操作。
當(dāng)然,這不克不及了解為操作零碎“偷懶”,而是給我們一個(gè)時(shí)機(jī),讓我們自行處置某些工作,從而使程序愈加靈敏和強(qiáng)健,也讓程序員有了更多發(fā)揚(yáng)的空間。
用戶敲擊鍵盤、點(diǎn)擊鼠標(biāo)、拖動(dòng)窗口、選擇菜單、輸出文字等一切的操作都稱為事情(Event)。這與我們平常了解的“事情”是相似的,都表現(xiàn)發(fā)作了某些狀況,好的或許壞的。
當(dāng)有事情發(fā)作時(shí),Windows 會(huì)生成一條音訊(Message),通知程序發(fā)作了什么工作。這與我們平常了解的“音訊”是相似,都表現(xiàn)一種傳遞信息的載體。
那么,Windows 是若何經(jīng)過音訊將發(fā)作的事情告訴給使用程序的呢?
每當(dāng)事情發(fā)作時(shí),Windows 會(huì)生成一條音訊,并放到一個(gè)由零碎保護(hù)的隊(duì)列中。然后,程序會(huì)本人從這個(gè)隊(duì)列中獲撤消息并剖析,挪用事情處置函數(shù)(處置事情的代碼也就在這個(gè)函數(shù)中),對(duì)用戶的操作停止呼應(yīng)。
隊(duì)列是一種先輩先出的數(shù)據(jù)構(gòu)造,不明確的請(qǐng)自行Google或百度。
留意:Windows 向隊(duì)列平分派音訊和使用程序從隊(duì)列中獲撤消息并不是同步的,Windows 不論隊(duì)列中有沒有音訊,不論使用程序有沒有處置終了,只需有事情發(fā)作,就會(huì)將音訊丟進(jìn)隊(duì)列,什么時(shí)分處置終了是使用程序的事。
可見,音訊是銜接 Windows 和使用程序的紐帶,Windows 經(jīng)過音訊通知使用程序發(fā)作了什么,使用程序經(jīng)過音訊曉得該做什么。
音訊構(gòu)造體
音訊其實(shí)是一個(gè)構(gòu)造體,名字為 MSG,界說為:
typedef struct tagMSG { HWND hwnd; UINT message; WPARAM wParam; LPARAM lParam; DWORD time; POINT pt; } MSG;
Windows 向隊(duì)列中送達(dá)音訊,其實(shí)就是將一個(gè)類型為 MSG 的構(gòu)造體變量丟進(jìn)隊(duì)列。
MSG 構(gòu)造體中各成員變量的寄義如下:
1) hwnd表現(xiàn)音訊所屬的窗口。用戶普通是在程序的窗口下停止操作,所以一個(gè)音訊普通多是與某個(gè)窗口相干聯(lián)的。例如在某個(gè)運(yùn)動(dòng)窗口中按下鼠標(biāo)左鍵,發(fā)生的按鍵音訊就是發(fā)給該窗口的。
2) message表現(xiàn)音訊類型,是一個(gè)數(shù)值。在Windows中,音訊是由一個(gè)數(shù)值來表現(xiàn)的,分歧類型的音訊對(duì)應(yīng)分歧的數(shù)值。然則因?yàn)閿?shù)值方便于記憶,所以Windows將音訊對(duì)應(yīng)的數(shù)值界說為WM_XXX宏(WM是Window Message的縮寫)的方式,XXX 對(duì)應(yīng)某種音訊的英文拼寫的大寫方式。例如,鼠標(biāo)左鍵按下音訊是WM_LBUTTONDOWN,鍵盤按下音訊是WM_KEYDOWN,字符音訊是WM_CHAR,等等。在程序中我們平日多是以WM_XXX宏的方式來運(yùn)用音訊的。
3) 第三、第四個(gè)成員變量wParam和lParam,用于指定音訊的附加信息。例如,當(dāng)我們收到一個(gè)字符音訊的時(shí)分,message成員變量的值就是WM_CHAR,但用戶究竟輸出的是什么字符,那么就由wParam和lParam來闡明。wParam、lParam表現(xiàn)的信息隨音訊的分歧而分歧。
4) 最初兩個(gè)變量辨別表現(xiàn)音訊送達(dá)到音訊隊(duì)列中的工夫和鼠標(biāo)的以后地位。