一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Windows程序設(shè)計零碎整理【1】-- 字符處理與消息機制

 lhzstudio 2012-05-09
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)閉的原因之一。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    美国欧洲日本韩国二本道| 久热香蕉精品视频在线播放| 国产又粗又猛又爽又黄| 黄色av尤物白丝在线播放网址| 91国自产精品中文字幕亚洲| 欧美一区二区在线日韩| 日韩美女偷拍视频久久| 日韩性生活片免费观看| 日韩视频在线观看成人| 成年女人午夜在线视频| 日韩一区二区免费在线观看| 在线观看国产午夜福利| 国产偷拍盗摄一区二区| 久久中文字幕中文字幕中文| 亚洲国产精品av在线观看| 久久99热成人网不卡| 国产av一区二区三区麻豆| 国产美女网红精品演绎| 中日韩美女黄色一级片| 久久99夜色精品噜噜亚洲av | 天堂网中文字幕在线视频| 欧美国产极品一区二区| 精品人妻一区二区三区四区久久| 亚洲中文字幕视频在线播放| 日韩精品福利在线观看| 亚洲男人的天堂就去爱| 日韩精品人妻少妇一区二区| 91香蕉国产观看免费人人| 少妇在线一区二区三区| 亚洲中文字幕免费人妻| 深夜福利亚洲高清性感| 国产精品免费视频视频| 亚洲视频在线观看免费中文字幕| 99热在线精品视频观看| 经典欧美熟女激情综合网| 国产在线不卡中文字幕| 欧美自拍系列精品在线| 午夜精品一区二区av| 国产日韩精品欧美综合区| 色综合久久六月婷婷中文字幕| 99精品国产一区二区青青|