青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

小山日志
讀書,學習與思考.
posts - 9,comments - 14,trackbacks - 0
本文譯自codeproject.com,原文鏈接與工具及其源代碼下載點擊這里
-----------------------------------
?導引:WINDOWSX.H頭文件簡化Win32 SDK編程

許多的新手或者調試程序員在編寫C/C++的Windows API程序時都要面對像意大利面一樣的switch...case代碼塊。當你需要加入一個消息處理到你的窗口處理過程中時,在些代碼塊中查找例如:WM_COMMANDWM_CHAR,是相當讓人恐懼的事情。

早在Windows 3.1時代的Windows軟件開發工具包和C/C++7.0編譯器就附帶一個包含一千多行Windows處理代碼的頭文件。這個頭文件是<windowsX.h>,它包含
了許多有用的宏。微軟的對這個頭文件的介紹如下:

  • 對C程序做更嚴格的類型檢查的STRICT宏。
  • 一些簡化Windows編程的通用操作的宏。
  • 一些簡化與Windows控件交流的控件宏。
  • 消息分流器(一種方便,輕便并且類型安全的處理消息的方法)以及它們在Windows環境下的參數和返回值。

在Message Cracker Wizard被設計出現之前,我就從使用這些的宏中獲得了效率。如果你對Windows.h的簡單描述感興趣,你可以參見MS知識庫的文章#8356

好了,讓我們來介紹消息分流器的便利,以及,為什么這里發布的工具可以你編寫代碼的效率。

當你在編寫Win32 SDK程序時,你處理窗口消息通過一個窗口函數,通常命名為WndProc。在Windows C 程序中常見的是窗口函數通過關鍵字switch和分支標簽case處理所有你需要處理的消息。

可以料想的是我們通常需要在主窗口中處理WM_COMMANDWM_KEYUPWM_CLOSEWM_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);
??}
}
這是自Windows 1.0時代以來處理Windows消息使用最多的,確實地,它工作。但是問題是當你開始向你程序中加入更多復雜的特性,例如 MDI,OLE,通用控件,等等,你會獲得一個行數以千記的窗口函數。你開始反復使用PageDn和PageUp鍵跳躍,來尋找你需要修改的消息。

這是使用消息分流器的第一個好處:它們提供了處理函數來簡化case標簽意大利面,就像MFC做的那樣。

第二個好處是正確的參數規范化了你的處理函數的使用。你可以簡單地使用switch(id)來替代switch(LOWORD(wparam)),因為你把id作為一個“分流器”的參數傳遞給消息函數時,等同于LOWORD(wparam)

消息處理宏HANDLE_MSG定義在windows.h中,如下:

#define?HANDLE_MSG(hwnd,?message,?fn)?\
????
case?(message)?:?return?HANDLE_##message((hwnd),?(wParam),?(lParam),?(fn))?

如你從上面宏定義中可以想到的是,將你的代碼轉換成“消息分流器”版本,你必須支持分流宏,HANDLE_MSG,并且使用函數來處理消息。現在將HANDLE_MSG宏加入到窗口函數中來。這個宏需要三個參數:一個窗口句柄(hwnd),你要處理的消息(WM_xxxx),以及你用來處理此消息的函數。為了更好的說明,我把之前的窗口函數替換成下面的消息分流版:
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);
??}
}


哇!這是更好的,簡潔的并且容易控制的窗口函數。現在你需要定義的的消息處理函數(OnKeyUp, OnCloseOnDestroy)。更加便利的是你可以使用Visual Studio IDE跳到你消息處理函數:


問題是每一次你增加一個消息處理你都必須搜尋WINDOWS.H里的定義,以匹配你的消息處理函數的參數類型,因為你不能隨意的使用參數類型:處理函數的格式是清楚定義的。在頭文件中反復的查找是單調乏味的任務,且容易出錯。消息分流器Wizard工具來搭救你了:它允許你粘貼任何你需要的消息處理的正確的參數。如果你剛剛開始編寫代碼,它還可以生成一個窗口模板或者對話框函數作為你處理窗口消息的開始。

Message forwarding宏:另一個WINDOWS.H特色

頭文件windowsx.h的另一個特色大約是message forwarding。它用來“拆除”消息處理函數的參數為有效的WPARAMLPARAM的值,以調用諸如PostMessageSendMessageCallWindowProc等等,此類的函數。


假設你你希望使用SendMessage函數來發送WM_COMMAND消息給父窗口,通過以一個通知碼BN_DBLCLK來“模擬”雙擊一個命名為IDC_USERCTL的控件。你通常會這樣寫:

SendMessage (hwndParent, WM_COMMAND,
??? MAKEWPARAM(IDC_USERCTL, BN_DBLCLK),
???? (LPARAM)GetDlgItem(hwnd, ID_USERCTL));

這是一個復雜的的語法:函數SendMessage期望WPARAM參數的底字節是控件的ID,高字節是通知碼;并且我們要通過API函數GetDlgItem獲得控件句柄,傳給LPARAM參數。

上面的代碼可以用Windows.h的message forwarding宏替換,FORWARD_WM_XXXX。對于每一個消息,forwarding宏都使用和消息分流器生成的消息處理函數相同的“捆扎”參數,增加你希望調用的函數并且傳給它“拆除”后的LPARAM/WPARAMs。例如,消息分流器Wizard為WM_COMMAND消息和窗口IDmyWnd生成如下的函數原型:
void myWnd_OnCommand (HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
好了,這些分流器參數也同樣被用于forwarding宏--因此,如你所期望的,我們之前調用SendMessage函數時展現的混亂可以減少了:
FORWARD_WM_COMMAND (hwndParent, IDC_USERCTL, 
GetDlgItem(hwnd, ID_USERCTL), BN_DBLCLK, SendMessage);
這種方式非常簡便,并且可以為所有消息分流器Wizard支持的消息工作。


使用消息分流Wizard工具

當你運行消息分流器Wizard時,你可以看到下面的窗口:



Wizard在左上角的列表框里為你提供了WINDOWS.H里有的消息處理,你可以點擊一個或者多個消息。你可以在窗口ID編輯框里指定一個窗口標識,以指定你要發送消息的
窗口。通用的ID有
MainWnd ,About (關于對話框),等等。這個標識會體現在消息處理函數中,和 HANDLE_MSG 宏中,如果你剛剛開始編寫代碼,它還可以體現在窗
口/對話框處理函數中。“ Make Window Procedure”選定框的作用是:允許你通過選定的消息分流器的宏來生成一個窗口/對話框函數的框架。以這種方式來開始一
個Windows API項目,你可以清晰的編寫和組織你的代碼,當然還有,避免錯誤。在窗口下面的兩個編輯框會包含分流器的宏和處理所選消息的函數(只是原型)生成的代
碼。要注意的是,當你選擇“Make Window Procedure”時窗口處理函數的模板代碼不出現在這里:它僅體現在你點擊了“Copy Macro”時復制到你的C++編輯器中
的代碼里。

讓我們通過例子來快速的瀏覽消息分流器Wizard工具的特性。記住你必須先通過#include <windowsx.h>將頭文件<windowsx.h>包含到你.C/.CPP文件中。

快速瀏覽消息分流器Wizard特性

讓我們開始吧。假設你已經編寫了你的 WinMain 的基本代碼:已經成功填充了 WNDCLASS 結構,注冊了窗口類,并且編寫了消息循環。現在你需要一個為你主函數編寫
的消息處理函數。

打開消息分流器Wizard。我們需要為我們的窗口選擇消息,因為MCW需要用它來生成我們的消息處理函數。如你所知,Windows程序非常常見的處理消息是
WM_CLOSE
WM_DESTROY WM_CREATE ,所以讓我們選擇消息分流器處理這些消息來創建窗口函數。然后,我們創建窗口函數的主體消息處理函數。

在列表框中選擇
WM_CLOSE , WM_DESTROY WM_CREATE 。因為此窗口是我們程序的主窗口,我們選用main做為窗口的ID。這個窗口ID表識了我們的窗口/對話框,并且
使分流宏和出理函數作為后綴。當然,你要使特定窗口的所有消息處理保持一致。觀察下面的編輯框。它們顯示 HANDLE_MSG 分流宏和關聯的消息處理函數的原型。



但是,等一下......我們說我們需要一個準備好的窗口處理函數。所以單擊“Make Window Procedure”選定框,并且確認Window 單選按鈕已經被選擇了。現在
我們準備好了。要注意的是,對話框的工作也像這樣,但是要改變處理函數為對話框類型。

首先,我們需要我們源代碼的窗口處理函數。點擊“Copy Macro”按鈕(或者使用Ctrl-M),最小化Wizard(或者把它放到一邊),回到你的IDE并且從剪貼板粘貼
Ctrl-V)代碼到你的窗口函數的位置。
Voilá(阿根廷拉丁語,認識的通知下)!你可以得到像下面的代碼:
//
//?main??Window?Procedure
//
LRESULT?CALLBACK?main_WndProc?(HWND?hwnd,?UINT?msg,?WPARAM?wParam,???LPARAM?lParam)
{
??
switch
(msg)
??{
????HANDLE_MSG?(hwnd,?WM_CLOSE,?main_OnClose);
????HANDLE_MSG?(hwnd,?WM_CREATE,?main_OnCreate);
????HANDLE_MSG?(hwnd,?WM_DESTROY,?main_OnDestroy);
??????
////?TODO:?Add?window?message?crackers?here

??default:?return?DefWindowProc?(hwnd,?msg,?wParam,?lParam);
??}
}


這個窗口處理函數以三個消息分流宏展開工作!并且,通過TODO注釋提示你記得必須在這里添加消息分流器宏。當你只是要添加一個 HANDLE_MSG 宏到窗口函數中時,
記得取消“Mke Window Procedure”選定框的選擇。


但是這些代碼現在還什么都做不了,因為我們還需要添加三個我們需要的消息處理函數。回到消息分流器Wizard工具的界面,并且單擊“Copy Function”按鈕。切
換到你的代碼,用鼠標定位到你需要函數主體插入的位置,然后用Ctrl+V或者菜單Edit/Paste粘貼。Wizard自動生成函數,使用 main 標識窗口ID,并修正參數類型
使之符合 WINDOWSX.H 頭文件的宏:

//
//Process?WM_CLOSE?message?for?window/dialog:?main
//
void
?main_OnClose(HWND?hwnd)
{
??
//?TODO:?Add?your?message?processing?code?here

}
//

//??Process?WM_CREATE?message?for?window/dialog:?main
//
BOOL?main_OnCreate(HWND?hwnd,?LPCREATESTRUCT?lpCreateStruct)
{
??
//?TODO:?Add?your?message?processing?code?here

}
//

//??Process?WM_DESTROY?message?for?window/dialog:?main
//
void
?main_OnDestroy(HWND?hwnd)
{
??
//?TODO:?Add?your?message?processing?code?here

}




Wizard還可以自動生成開頭注釋,和TODO行以提醒你添加代碼。現在你可以添加消息處理了,可以是簡單的處理處理邏輯,或者復雜窗口函數。你也可以通過選定框移除
注釋。

更多的消息分流器Wizard特性

消息過濾

你可以過濾你暫時不打算處理的消息。單擊“Filters..”按鈕(或者Ctrl+L),你會打開下面對話框。列表的消息按類型分類(分類標準來自Microsoft Spy++的效果),
你可以取消選定你不處理的消息。


要注意的是在 v2.0 當前的問題是,當你打開消息過濾對話框時所有類型的消息都是選定的,當你點擊OK,之前選定的消息會丟失(這并不意味著你粘貼到目標代碼的
內容會消失)。



簡潔窗口模式

你可能需要減小消息分流Wizard窗體的大小。這可以通過取消菜單 View 的 “Show Target Code”選項的選定(或者使用Ctrl+F11)。主窗口會取消目標代碼區域:

窗體透明,取消注釋和置頂

(譯注:Sorry,暫不做翻譯了,你可以通過嘗試菜單 View 的其它幾個選項自己體會^_^)



未來特性

下面的特性會在下一次發布時實現:
  • 幫助文件。
  • 所有消息分流的參數和消息的完整幫助。
  • 支持WTL!:)
  • 窗口ID和配置保存(這個會在下一個2.x版本實現)。
  • 項目配置和“消息映射”(a la MFC)(譯注:好像是西班牙語,不認識:P)(這個也會在之后的2.5版本實現)。

快樂的編程!

我希望這個小工具可以讓每個 Windows SDK 程序員感興趣,并且干凈的編寫 Win32 API 程序。我樂于接受改進這個工具的主意。如果你發現這個程序很好用,請給我發郵件,因為我非常高興聽到任何好的意見。

謝謝所有支持!!You know who you are!(譯注:不太明白這個要表達什么意思,“你知道你是誰!”乎?)

任何時候,打開我的主頁,你可以在那里找到這個程序的最新更新。

歷史:
? 略...

關于作者:
Hernán Di Pietro

業余程序員。

開始于1986年,在Commodore 64上編寫BASIC程序。
在1990年第一臺 8086 PC 上開始編寫 QB 4.x。
1995-1996年轉移到Visual Basic。
2002年,23歲時開始編寫C++程序,并對 Windows API 上癮。

主頁: http://usuarios.lycos.es/hernando



posted on 2006-11-02 00:00 小山日志 閱讀(1295) 評論(3)  編輯 收藏 引用 所屬分類: windows program

FeedBack:
# re: Message Crack Wizard for Win32 SDK Developer
2006-11-02 19:15 | 刀劍如夢
嗯~~,不錯不錯。還有這么個好東西。  回復  更多評論
  
# re: Message Crack Wizard for Win32 SDK Developer
2007-02-05 20:34 | Lidi
很好,謝謝  回復  更多評論
  
# re: Message Crack Wizard for Win32 SDK Developer
2007-12-06 20:39 | oldnwind
Programming application for Microsoft Windows 的附錄中有詳細說明。
應該是很方便的,關鍵是要有個熟悉過程。  回復  更多評論
  
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美一区视频在线| 亚洲一区二区三区免费观看| 欧美一区二区视频在线观看2020| 亚洲人成人一区二区在线观看| 久久久999精品免费| 国产一区二区毛片| 久久久综合香蕉尹人综合网| 欧美专区日韩专区| 亚洲成人在线视频播放| 欧美国产日本在线| 欧美片在线播放| 午夜国产精品视频免费体验区| 亚洲深夜福利视频| 国产农村妇女精品一二区| 久久精品2019中文字幕| 久久人91精品久久久久久不卡| 亚洲国产经典视频| 99国内精品久久| 国产精品视频精品视频| 久久香蕉国产线看观看av| 你懂的亚洲视频| 亚洲一区激情| 久久久久久久久久久久久9999| 亚洲高清在线观看| 一区二区毛片| 好吊日精品视频| 亚洲国产精品欧美一二99| 国产精品日韩欧美综合 | 欧美激情一区二区久久久| 中文av一区二区| 久久国产精品久久久久久电车 | 欧美另类在线播放| 欧美资源在线观看| 欧美成人精品不卡视频在线观看 | 国产伦精品一区二区三区视频黑人| 老司机成人网| 国产精品久久97| 亚洲国产高潮在线观看| 国产色婷婷国产综合在线理论片a| 亚洲国产精品免费| 韩国精品主播一区二区在线观看| 99re视频这里只有精品| 一区在线观看| 亚洲一区免费网站| 一区二区三区国产在线| 久久这里只精品最新地址| 亚洲欧美日韩国产综合在线| 快射av在线播放一区| 午夜精品国产更新| 欧美日韩在线免费观看| 亚洲国产美女精品久久久久∴| 国产精品视区| 一区二区三区|亚洲午夜| 亚洲成人在线视频播放| 久久九九99| 亚洲香蕉伊综合在人在线视看| 亚洲国产精品久久久久| 午夜在线观看免费一区| 在线观看日韩www视频免费| 亚洲精品乱码久久久久久| 欧美高清视频www夜色资源网| 欧美日韩在线直播| 亚洲国产精品一区二区www| 国产精品毛片在线| 日韩一区二区久久| 亚洲国产色一区| 久久精品视频在线| 午夜精品福利在线观看| 欧美视频在线观看视频极品| 美女脱光内衣内裤视频久久影院 | 欧美一区二区日韩一区二区| 欧美福利在线| 欧美高清在线| 国产在线欧美日韩| 久久五月婷婷丁香社区| 久久亚洲综合色| 国产一区二区久久精品| 性欧美激情精品| 亚洲欧美日韩区| 欧美少妇一区二区| 夜夜嗨av一区二区三区网页| 99亚洲视频| 欧美美女喷水视频| 亚洲乱码国产乱码精品精| 亚洲欧洲精品天堂一级| 蜜臀av性久久久久蜜臀aⅴ| 另类专区欧美制服同性| 国产伦精品一区二区三区高清| 一区二区三区视频在线看| 亚洲自拍啪啪| 国产毛片一区二区| 性色av一区二区三区在线观看| 性感少妇一区| 国产主播一区| 久久精品视频免费播放| 欧美激情 亚洲a∨综合| 亚洲一区二区日本| 国产精品久久久久9999| 久久久久一区| 亚洲国产综合在线看不卡| 亚洲精品社区| 国产精品高潮粉嫩av| 亚洲欧美精品中文字幕在线| 久久这里有精品15一区二区三区| 国产精品一区二区久久久久| 亚洲一区免费看| 久久久久免费视频| 激情小说另类小说亚洲欧美| 美脚丝袜一区二区三区在线观看| 亚洲国产精品嫩草影院| 亚洲性人人天天夜夜摸| 国产精品永久入口久久久| 久久国产精品99国产精| 欧美在线网站| 亚洲第一区在线观看| 欧美精品日韩www.p站| 中文国产成人精品| 麻豆精品在线视频| 日韩亚洲欧美在线观看| 午夜精品久久久久久99热| 伊人成年综合电影网| 欧美日韩一区在线| 欧美二区在线| 性做久久久久久久免费看| 欧美成人综合一区| 亚洲中字在线| 亚洲国产精品国自产拍av秋霞| 新狼窝色av性久久久久久| 亚洲成人中文| 国产精品剧情在线亚洲| 美女露胸一区二区三区| 亚洲免费中文字幕| 亚洲国产精品高清久久久| 久久久91精品国产一区二区三区 | 欧美阿v一级看视频| 亚洲综合色视频| 亚洲精品久久久久久下一站| 欧美一区二区在线免费播放| 日韩亚洲综合在线| 在线电影国产精品| 国产精品夜夜夜一区二区三区尤| 欧美激情亚洲另类| 久久久久久综合| 久久精品男女| 欧美一区二区三区在线观看视频| 亚洲黄色免费网站| 麻豆精品视频在线| 欧美专区在线观看一区| 久久精品国产免费观看| 销魂美女一区二区三区视频在线| 亚洲精选中文字幕| 亚洲精品国产精品国自产在线| 狠狠色综合色综合网络| 国产日产精品一区二区三区四区的观看方式| 欧美风情在线观看| 午夜综合激情| 久久精品日韩欧美| 欧美在线网站| 欧美在线三区| 欧美一区二粉嫩精品国产一线天| 亚洲欧美日韩天堂| 亚洲欧美国产精品桃花| 亚洲综合大片69999| 亚洲午夜91| 亚洲在线观看免费视频| 久久久久久久网| 久久婷婷综合激情| 欧美aⅴ一区二区三区视频| 美日韩在线观看| 麻豆成人av| 欧美高清在线| 麻豆9191精品国产| 欧美日韩午夜视频在线观看| 欧美日韩国产黄| 国产一区二区欧美| 精品二区视频| 亚洲一二三级电影| 香蕉久久夜色精品国产| 久久久久在线观看| 久久亚洲精选| 洋洋av久久久久久久一区| 午夜精品福利一区二区蜜股av| 欧美一级二区| 美女视频黄免费的久久| 欧美午夜精品久久久久久久 | 欧美专区亚洲专区| 榴莲视频成人在线观看| 亚洲国产日韩欧美| 一区二区免费在线视频| 欧美伊人久久久久久午夜久久久久| 久久精品国产一区二区电影 | 能在线观看的日韩av| 久色婷婷小香蕉久久| 这里只有精品丝袜| 久久久中精品2020中文| 欧美日韩精品在线观看| 国产一区二区三区精品欧美日韩一区二区三区 | 亚洲影院免费观看| 久久久精品久久久久| 免费高清在线一区|