国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
windows.h和windowsx.h區(qū)別
區(qū)別 windows.h windowsx.h

windowsx.h頭文件:(全部都是網(wǎng)上查的)
http://www.codeproject.com/win32/msgcrackwizard.asp

 第一部分:
介紹:
WINDOWSX.H 頭文件為W32SDK的程序員提供方便(工具?)
很多初中級程序員用C/C++編寫Windwos API的程序時,經(jīng)常面對面條式的switch...case語句塊
當(dāng)你在Window過程(回調(diào)函數(shù)、下稱過程)中加入大量諸如WM_COMMAND or WM_CHAR的消息捕獲時。真是一場噩夢。
關(guān)于上千行代碼的Window過程的問題,隨著 C/C++ 7.0 編譯器和Windows SDK for Windows 3.1發(fā)行時帶的一個頭文件而被解決。
這個頭文件是<windowsx.h> 以及所包含的大量的有用的宏。按照微軟的說法:這些頭文件所帶來的便利可重復(fù)用于下面這些地方(Groups)

.在C程序中使用STRICT宏進(jìn)行嚴(yán)格的類型檢查。
.在windows程序中用宏簡化公共性操作。
.使用控件宏同windows控件進(jìn)行通訊。
.windows環(huán)境下的消息解析器(message crackers)(是一個方便的、可移植的、類型安全的處理消息的方法)以及和他相關(guān)的參數(shù)和返回值。
因為消息解析器向?qū)怯糜谙⒔馕銎鞯?,其他由這頭文件帶來的一些有用的宏,我就跳過不講了,如果你想看看關(guān)于
WINDOWSX.H的簡要介紹,可以看 MS Knowledge Base Article #83456.
(http://support.microsoft.com/default.aspx?scid=http://support.microsoft.com:80/support/kb/articles/q83/4/56.asp)
好,讓我們說下消息解析器的優(yōu)點,當(dāng)然也包括為什么這里提供的這個工具是如此有用。
當(dāng)你使用W32 SDK編程,用windows過程(通常叫做WndProc)處理窗口和對話框消息時,使用swich-case來捕獲你需要處理的消息是
非常普遍的做法。假設(shè)你想處理WM_COMMAND, WM_KEYUP, WM_CLOSE and WM_DESTROY消息,你是這樣作的:

LRESULT CALLBACK MainWndProc (HWND hwnd, UINT msg,
WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
case WM_COMMAND:
// ...
break;

case WM_KEYUP:
// ...
break;

case WM_CLOSE:
// ...
break;

case WM_DESTROY:
//...
break;

default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
}
這是自從Windows1.0誕生以來處理消息最常見的風(fēng)格了。而且很肯定,它工作得很好。
但問題是,當(dāng)你加入一個或多個復(fù)雜的特色到你的程序中時,如MDI,OLE 公共控件等等,
結(jié)果形成了一個上千行的Window過程,你開始用PageDn和PageUp來查找你想要修改的消息處理代碼了。

消息解析器的第一個好處就是:他把面條式的case標(biāo)簽轉(zhuǎn)換成類似MFC中易于維護(hù)和處理的函數(shù)。
第二個好處是:處理函數(shù)中合適的參數(shù)。你可以簡單使用switch(id)代替原先的switch(LOWORD(wparam)),
因為消息解析器傳遞給你的是"已解析"的參數(shù),他等價于LOWORD(wparam)。

HANDLE_MSG 這個消息處理宏在windowx.h中的定義如下:
#define HANDLE_MSG(hwnd, message, fn)
case (message) : return HANDLE_##message((hwnd), (wParam), (lParam), (fn))

你想要把你的代碼做成"消息解析"版的,你需要提供一個解析宏HANDLE_MSG及其函數(shù)來處理你的消息.
在window過程里HANDLE_MSG宏需要三個參數(shù):窗口句柄(hwnd), 消息(WM_XXXX), 處理你消息的函數(shù)(function)。
為更好地解釋這個:看下面,我們把上面那段代碼轉(zhuǎn)換成了下面的代碼:

LRESULT CALLBACK MainWndProc (HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch(msg)
{
HANDLE_MSG (hwnd, WM_COMMAND, OnCommand);
HANDLE_MSG (hwnd, WM_KEYUP, OnKeyup);
HANDLE_MSG (hwnd, WM_CLOSE, OnClose);
HANDLE_MSG (hwnd, WM_DESTROY, OnDestroy);
default:
return DefWindowProc(hwnd, msg, wParam, lParam);
}
}

哇,太好了,緊湊且易于管理的window過程?,F(xiàn)在你可以去定義你的消息處理函數(shù)了(OnKeyUp, OnClose, and OnDestroy)
還有一個真正的好處,你可以在visual studio IDE 環(huán)境中直接跳轉(zhuǎn)到消息處理函數(shù)。

圖片:...(看原文)

有個問題是:當(dāng)你每加入一個消息處理,你必須在windowx.h中查找相關(guān)參數(shù)的定義。
因為消息處理參數(shù)的格式是明確的而不能由你隨心所欲。但在頭文件中進(jìn)行重復(fù)搜索是乏味且易出錯的。

消息解析向?qū)Чぞ?/font>用于解決這個:他允許你粘貼你需要的函數(shù)參數(shù),
而你如果只是打草稿,他也會在在你消息處理中寫上一個模板化的window或?qū)υ捒蜻^程 (??這句有疑問)
消息前驅(qū)宏(message fowarding): WINDOWSX.H 的另一個特色 (消息前向?)
WINDOWSX.H另一個特色是消息前驅(qū)的可能性,
它是用于"解壓"消息處理參數(shù)到其他函數(shù)調(diào)用(如PostMessage, SendMessage, CallWindowProc等)所需要的合適的WPARAM和LPARAM值。
假設(shè)我們想用SendMessage發(fā)送一個WM_COMMAND消息到父窗口,"模擬"一個在名為IDC_USERCTL控件上的雙擊(通過發(fā)送BN_DBLCLK的通知碼)
我們通常這么做的:

SendMessage (hwndParent, WM_COMMAND,
MAKEWPARAM(IDC_USERCTL, BN_DBLCLK), // WPARAM 的低16位是控件ID,高16位是通知碼
(LPARAM)GetDlgItem(hwnd, ID_USERCTL));     //LPARAM 為控件句柄
這是相當(dāng)復(fù)雜的語法。SendMessage希望WPARAM參數(shù)的低字是控件ID而高字是通知碼,LPARAM參數(shù)是控件句柄,句柄我們通過GetDlgItem這

個API函數(shù)得到。
上述代碼可以被轉(zhuǎn)換為WINDOWSX.H的消息前驅(qū)宏,F(xiàn)ORWARD_WM_xxxxx。
對于每個消息,消息前向宏用同樣的方式"打包"消息解析向?qū)?chuàng)建的函數(shù)參數(shù),
并且傳遞給你的處理函數(shù)"已解壓"的參數(shù)(LPARAM/WPARAMs)。
例如:對于一個myWnd窗口的WM_COMMAND消息,消息解析器向?qū)⑸扇缦碌暮瘮?shù)原形:

void myWnd_OnCommand (HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)

那么,這些解析的參數(shù)也同樣用于消息前驅(qū)宏,這樣上面那使人混亂的SendMessage調(diào)用可以簡化為:

FORWARD_WM_COMMAND (hwndParent, IDC_USERCTL,
GetDlgItem(hwnd, ID_USERCTL), BN_DBLCLK, SendMessage);

使用所有這些消息解析器支持的消息簡單可行。(第一部分完)

在使用消息分流器來處理一個消息之前,應(yīng)該打開Wi n d o w s X . h文件并搜索要處理的消息。例如,如果搜索W M _ C O M M A N D,將會找到文件中包含下面代碼行的部分:

/* void Cls_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) */
#define HANDLE_WM_COMMAND(hwnd, wParam, lParam, fn)
    ((fn)((hwnd), (int)(LOWORD(wParam)), (HWND)(lParam), (UINT)HIWORD(wParam)), 0L)
#define FORWARD_WM_COMMAND(hwnd, id, hwndCtl, codeNotify, fn)
    (void)(fn)((hwnd), WM_COMMAND, MAKEWPARAM((UINT)(id),(UINT)(codeNotify)), (LPARAM)(HWND)(hwndCtl))
     第一行是注釋行,展示要編寫的函數(shù)原型。下一行是H A N D L E _ W M _ *宏,我們已經(jīng)討論過。最后一行是消息轉(zhuǎn)發(fā)器( f o r w a r d e r)。假定在你處理W M _ C O M M A N D消息時,你想調(diào)用默認(rèn)的窗口過程,并讓它為你做事。這個函數(shù)應(yīng)該是這個樣子:

void Cls_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) {

    //Do some normal processing.

    //Do default processing.

    FORWARD_WM_COMMAND(hwnd, id, hwndCtl, codeNotify, DefWindowProc);

}

F O RWA R D _ W M _ *宏將分流開的消息參數(shù)重新構(gòu)造成等價的w P a r a m和l P a r a m。然后這個宏再調(diào)用你提供的函數(shù)。在上面的例子中,宏調(diào)用D e f Wi n d o w P r o c函數(shù),但你可以簡單地使用S e n d M e s s a g e或P o s t M e s s a g e。實際上,如果你想發(fā)送(或登記)一個消息到系統(tǒng)中的任何窗口,可以使用一個F O RWA R D _ W M _ *宏來幫助合并各個參數(shù)。

應(yīng)注意Windows.h和Windowsx的不同之處.

2.tchar.h 頭文件
http://msdn2.microsoft.com/zh-cn/library/c426s321(VS.80).aspx

3.CmnHdr.h 頭文件

它包含宏及鏈接程序指令.

讀者要想建立本書的示例程序,必須要對編譯程序和鏈接程序的開關(guān)選項進(jìn)行設(shè)置,筆者已經(jīng)將設(shè)置方面的細(xì)節(jié)
放在了CmmHdr.h頭文件中了

因為無法將所有的設(shè)置都放在這個頭文件里,我們對每個示例程序的項目設(shè)置做了一些改變。對每個項目,我們顯示Project Settings對話框,然后做下面所說的改變。
" 在G e n e r a l欄,設(shè)定Output Files目錄,這樣所有最終的. e x e和. d l l文件都在一個目錄之下。
" 在C / C + +欄,選擇Code Generation 條目,并對Use Run-Time Library 字段選擇Multithreaded DLL。

注意要對每個項目的D e b u g建立和R e l e a s e建立都做上述兩個改變。

所有的示例程序都要包含C m m H d r. h頭文件,并且要在其他頭文件之前包含.這是因為CmnHdr.h頭文件中有一些鏈接程序指令,比如#define _WIN32_WINNT 0x0500 (它是Windows版本建立選項)的定義必須放在Windows.h之前,才能調(diào)用了Microsoft Windows 2000中提供的新函數(shù).否則編譯程序?qū)a(chǎn)生錯誤。微軟用_ W I N 3 2 _ W I N N T符號來保護(hù)這些函數(shù),以使程序員開發(fā)的應(yīng)用程序能夠運行在Windows 98及Windows NT的多個版本上。

Unicode建立選項.

筆者編寫的所有這些示例程序既可按A N S I來編譯,也可按U n i c o d e來編譯。當(dāng)針對x 8 6 C P U體系結(jié)構(gòu)來編譯這些程序時, A N S I為默認(rèn)選擇,這樣程序可以在Windows 98上執(zhí)行。但對其他C P U體系結(jié)構(gòu)建立程序就要用U n i c o d e,這樣程序可以占用較少的內(nèi)存,并且執(zhí)行得更快。

為了對x 8 6體系結(jié)構(gòu)建立U n i c o d e版本,只需將定義U N I C O D E的那一行代碼的注釋符去掉,并重建程序。通過在CmnHd r. h定義U N I C O D E宏,可以很容易地控制如何建立示例程序。關(guān)于U n i c o d e的詳細(xì)內(nèi)容,可參見第2章。

窗口定義和第四級警告
本節(jié)我確保警告級設(shè)定為3,而且C m nH d r. h包含標(biāo)準(zhǔn)的Wi n d o w s . h頭文件。當(dāng)包含了Wi n d o w s . h時,在我編譯其余代碼時就設(shè)置第4級警告。在第4級警告上,編譯程序?qū)δ切┪也徽J(rèn)為有問題的內(nèi)容發(fā)出“警告”,這樣我通過使用#pragma warning指令顯式地告訴編譯程序忽略某些良性的警告錯。

Pragma消息幫助宏
 
使用chMsg宏,例如#pragma chMSG(Fix this later),這個宏讓編譯程序輸出源代碼文件的名字,以及p r a g m a出現(xiàn)的行號。使用Microsoft Visual Developer Studio,在輸出窗口上雙擊這一行,將會自動定位到相應(yīng)文件的確切位置上。還有一個方便之處, c h M S G宏不要求對文本串使用引號。.

 chINRANGE和chDIMOF宏
chINRANGE 宏用來查看一個數(shù)值是否在另外兩個數(shù)值之間.
chDIMOF只是返回一個數(shù)組中元素的數(shù)目,
這個宏是用s i z e o f操作符先計算整個數(shù)組的字節(jié)數(shù),然后再用這個數(shù)除以數(shù)組中一個數(shù)據(jù)項所占的字節(jié)數(shù),從而得出結(jié)果。

chBEGINTHREADEX宏
多線程示例程序都使用了微軟的C/C + +運行時函數(shù)庫中的_ b e g i n t h r e a d e x函數(shù),而不是操作系統(tǒng)的C r e a t e T h r e a d函數(shù)。我使用這個函數(shù)是因為_ b e g i n t h r e a d e x函數(shù)為新線程做好了準(zhǔn)備,使新線程能夠使用C / C + +運行時函數(shù)庫中的函數(shù),而且還因為它保證在線程返回時清除每個線程的C / C + +運行時庫信息.
盡管_ b e g i n t h r e a d e x函數(shù)用的參數(shù)值同C r e a t e T h r e a d函數(shù)用的參數(shù)值是一樣的,但二者的參數(shù)的數(shù)據(jù)類型都不相匹配。
為了避免編譯程序警告,我在C m n H d r. h中定義了一個c h B E G I N T H RE A D E X宏,替我執(zhí)行所有這些轉(zhuǎn)換:

chMB宏
c h M B宏只是顯示一個消息框。消息框的標(biāo)題是調(diào)用進(jìn)程可執(zhí)行代碼的全路徑名

chASSERT和chVERIFY宏
在我開發(fā)這些示例程序時,為了查找潛在的問題,我在整個代碼中多處使用c h A S S E RT宏。這個宏測試由x所標(biāo)識的表達(dá)式是否為T R U E,如果不是,則顯示一個消息框指出失敗的文件、行和表達(dá)式。在程序的發(fā)行建立中,這個宏什么也不做。c h V E R I F Y宏與c h A S S E RT宏差不多,區(qū)別在于不論是調(diào)試建立(debug build)還是發(fā)行建立(release build),c h V E R I F Y都要對表達(dá)式進(jìn)行測試。

chHANDLE_DLGMSG宏

當(dāng)你通過對話框使用消息分流器時,不應(yīng)該使用微軟的Wi n d o w s X . h 頭文件中的H A N D L E _ M S G宏,因為這個宏并不能返回T R U E或FA L S E來指出消息是否由對話框的過程來處理。我定義的c h H A N D L E _ D L G M S G宏會通知窗口消息的返回值,適當(dāng)?shù)靥幚矸祷刂?,以便在一個對話框過程中使用。

chSETDLGICONS宏

由于多數(shù)示例程序使用一個對話框作為主窗口,你必須手工改變對話框圖標(biāo),以便讓它正確地顯示在Ta s k b a r(任務(wù)條)、任務(wù)切換窗口和程序本身的標(biāo)題上。當(dāng)對話框接收到一個W M _ I N I T D I A L O G消息時,總要調(diào)用c h S E T D L G I C O N S宏,以正確設(shè)置圖標(biāo)。

OS版本檢查內(nèi)聯(lián)函數(shù)

本書的大多數(shù)示例程序可運行在所有平臺上,但也有一些程序要求一些Windows 95和Windows 98所不支持的特性,有些程序要求一些只在Windows 2000中提供的特性。每個程序在初始化時要檢查宿主系統(tǒng)的版本,如果要求更適用的操作系統(tǒng)時,就顯示一個通知。

對那些不能在Windows 95和Windows 98上運行的程序,你會看到,在程序的_ t Wi n M a i n函數(shù)中有一個對Wi n d o w s 9 x N o t A l l o w e d函數(shù)的調(diào)用。對于要求Windows 2000的示例程序,你會看到在程序的_ t Wi n M a i n函中有一個對c h Wi n d o w s 2 0 0 0 R e q u i r e d函數(shù)的調(diào)用。

確認(rèn)宿主系統(tǒng)是否支持Unicode
有一種辦法能夠知道我的程序是對U n i c o d e建立的,但可能在Windows 98系統(tǒng)上運行。所以我建立了一個CUnicodeSupported C++類。這個類的構(gòu)造函數(shù)只是檢查宿主系統(tǒng)是不是對U n i c o d e有良好的支持,如果不是,就顯示一個消息框,并且進(jìn)程結(jié)束。

讀者會看到在C m n H d r. h中,我建立了這個類的一個全局的靜態(tài)實例。當(dāng)我的程序啟動時,C / C + +運行時庫啟動代碼調(diào)用這個對象的構(gòu)造函數(shù)。如果這個構(gòu)造函數(shù)檢測到操作系統(tǒng)完全支持U n i c o d e,構(gòu)造函數(shù)返回而程序繼續(xù)執(zhí)行。通過建立這個類的全局實例,我不需要在每個示例程序的源代碼模塊中再增加特殊的代碼。對于非U n i c o d e的程序建立,不需要聲明或?qū)嵗鲜龅腃 + +類。讓程序只管運行就是。

強(qiáng)制鏈接程序?qū)ふ?w)WinMain進(jìn)入點函數(shù)
我在C m n H d r. h中加入了一個p r a g m a,強(qiáng)制鏈接程序去尋找( w ) Wi n M a i n進(jìn)入點函數(shù),即使是用Visual C++建立了一個Win32 ConsoleA p p l i c a t i o n項目.

本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報。
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服