1. 要定義包含一個寬字符的變量,可使用下面的語句: wchar_t c = 'A' ; 變量c是一個雙字節(jié)值0x0041,是Unicode表示的字母A。(然而,因為Intel微處理器從最小的字節(jié)開始儲存多字節(jié)數(shù)值,該字節(jié)實際上是以0x41、0x00的順序保存在內(nèi)存中。如果檢查Unicode文字的計算機儲存應(yīng)注意這一點。) 您還可定義指向?qū)捵址闹羔槪?BR> wchar_t * p = L"Hello!" ; 注意緊接在第一個引號前面的大寫字母L(代表「long」)。這將告訴編譯器該字符串按寬字符保存-即每個字符占用2個字節(jié)。通常,指針變量p要占用4個字節(jié),而字符串變量需要14個字節(jié)-每個字符需要2個字節(jié),末尾的0還需要2個字節(jié)。 2. 通用類型TCHAR 、 PTCHAR _T("...") TEXT("....")通用字符類型 (根據(jù)UNICODE宏是否定義代表不同) L"..."表示寬字符串 3. typedef CHAR * PCHAR, * PSTR ; PCHAR指向字符的指針,PSTR 指向字符串的指針,本質(zhì)上是指向第一個字符的指針,所以二者本質(zhì)上一樣。主要是要理解后面這個,以及這種連續(xù)定義的方式。 4. MessageBox也是個通用的函數(shù),會根據(jù)UNICODE宏是否定義分別代表MessageBoxW及MessageBoxA 5. Windows對C語言的標準輸入和標準輸出沒有概念。但可以使用sprintf及sprintf系列中的其它函數(shù)來顯示文字。這些函數(shù)除了將內(nèi)容格式化輸出到函數(shù)第一個參數(shù)所提供的字符串緩沖區(qū)以外,其功能與printfI相同。然后便可對該字符串進行操作(例如將其傳給MessageBox)。 vsprintf是sprintf的一個變形,它只有三個參數(shù)。vsprintf用于執(zhí)行有多個參數(shù)的自訂函數(shù),類似printf格式。vsprintf的前兩個參數(shù)與sprintf相同:一個用于保存結(jié)果的字符緩沖區(qū)和一個格式字符串。第三個參數(shù)是指向格式化參數(shù)數(shù)組的指針。實際上,該指針指向在堆棧中供函數(shù)呼叫的變量。va_list、va_start和va_end宏(在STDARG.H中定義)幫助我們處理堆棧指針。 int sprintf (char * szBuffer, const char * szFormat, ...) { int iReturn ; va_list pArgs ; va_start (pArgs, szFormat) ; iReturn = vsprintf (szBuffer, szFormat, pArgs) ; va_end (pArgs) ; return iReturn ; } 通用的wsprintf(最前面的w似乎代表的是Windows,不是wide) wsprintfA(ASCII) wsprintfW(寬字符) 6. 在Win32 API中,長指標和短指標(或者近程指標)沒有區(qū)別。這只是16位Windows的遺物。 在Win32中near和long指標沒有區(qū)別。 7. 更確切地說,窗口通常是在「窗口類別」的基礎(chǔ)上建立的。窗口類別標識了處理窗口消息的窗口消息處理程序。使用窗口類別使多個窗口能夠?qū)儆谕粋€窗口類別,并使用同一個窗口消息處理程序。例如,所有Windows程序中的所有按鈕均依據(jù)同一個窗口類別。這個窗口類別與一個處理所有按鈕消息的窗口消息處理程序(位于Windows的動態(tài)鏈接庫中)聯(lián)結(jié)。 8. Windows程序開始執(zhí)行后,Windows為該程序建立一個「消息隊列」。這個消息隊列用來存放該程序可能建立的各種不同窗口的消息。程序中有一小段程序代碼,叫做「消息循環(huán)」,用來從隊列中取出消息,并且將它們發(fā)送給相應(yīng)的窗口消息處理程序。有些消息直接發(fā)送給窗口消息處理程序,不用放入消息隊列中。 while (GetMessage (&msg, NULL, 0, 0)) { TranslateMessage (&msg) ; DispatchMessage (&msg) ; } TranslateMessage 轉(zhuǎn)譯某些鍵盤消息。 DispatchMessage 將消息發(fā)送給窗口消息處理程序。 PostQuitMessage 在消息隊列中插入一個「退出程序」消息。 只要從消息隊列中取出消息的message字段不為WM_QUIT(其值為0x0012),GetMessage就傳回一個非零值。WM_QUIT消息將導(dǎo)致GetMessage傳回0。 9. 在發(fā)生輸入事件之后,Windows將事件轉(zhuǎn)換為一個「消息」并將消息放入程序的消息隊列中。 10. 程序通常不直接呼叫窗口消息處理程序,窗口消息處理程序通常由Windows本身呼叫。通過呼叫SendMessage函數(shù),程序能夠直接呼叫它自己的窗口消息處理程序。 Windows程序所作的一切,都是響應(yīng)發(fā)送給窗口消息處理程序的消息。這是概念上的主要難點之一,在開始寫作Windows程序之前,必須先搞清楚。程序的所有實際動作均在窗口消息處理程序中發(fā)生。 11. 換句話說,消息循環(huán)和窗口消息處理程序不是并發(fā)執(zhí)行的。當一個消息循環(huán)從其消息隊列中接收一個消息,然后呼叫DispatchMessage將消息發(fā)送給窗口消息處理程序時,直到窗口消息處理程序?qū)⒖刂苽骰亟oWindows,DispatchMessage才能結(jié)束執(zhí)行。 消息處理程序必須是可重入。在大多數(shù)情況下,這不會帶來問題,但是程序?qū)懽髡邞?yīng)該意識到這一點。例如,假設(shè)您在窗口消息處理程序中處理一個消息時設(shè)置了一個靜態(tài)變量,然后呼叫了一個Windows函數(shù)。在這個函數(shù)傳回時,您還能保證那個變數(shù)的值還是原來那個嗎?難說--很可能您呼叫的Windows函數(shù)產(chǎn)生了另外一個消息,并且窗口消息處理程序在處理這個消息時改變了該變量的值。這也是在編譯Windows程序時,有些編譯最佳化選項必須關(guān)閉的原因之一。 |
|