“Windows編程就像去見牙科醫(yī)生:雖然明明知道最自己是有益處的,可還是沒人喜歡總是找牙醫(yī)。”記得很早的時(shí)候,看了一下MFC,還根本不知道窗口啊,按鈕啊,菜單啊,現(xiàn)在讀這一章才看到的Windows的真面目了。
1. 傳說中的“匈牙利符號表示法”,早有耳聞此法,但未曾一見啊,最是頭痛的就屬看幫助文檔的,尤其是MSDN了,不過要想閱讀Microsoft的一些代碼,還真的懂此法呀。
* 匈牙利符號表示法前綴代碼
前綴 |
數(shù)據(jù)類型(基礎(chǔ)類型) |
c |
Char字符 |
by |
BYTE字節(jié)(無符號字符) |
n |
Short短整數(shù)和整數(shù)(表示一個(gè)數(shù)) |
i |
int整數(shù) |
x,y |
Short短整數(shù)(通常用于x和y坐標(biāo)) |
cx,cy |
short短整數(shù)(通常用于x和y的長度;c表示計(jì)數(shù)) |
b |
BOOL(整數(shù)) |
w |
UINT(無符號數(shù))和WORD(無符號字) |
l |
LONG(長整數(shù)) |
dw |
DWORD(無符號長整數(shù)) |
fn |
函數(shù)指針 |
s |
字符串 |
sz,str |
以一個(gè)字節(jié)的0(空值)終止的字符串 |
lp |
32位指針 |
h |
編號(常用于表示W(wǎng)indows對象) |
msg |
消息 |
*變量的命名
變量的命名應(yīng)用匈牙利符號表示法,變量可用上表中的前綴代碼表示。另外,變量由一個(gè)或幾個(gè)子名構(gòu)成時(shí),每一個(gè)子名都要大寫字母開頭。
例如: char *szFileName; // a null terminated string
int *lpiData; //a 32-bit pointer to a int
還有一點(diǎn)就是,全局變量以g_或g開頭。
*函數(shù)命名
函數(shù)命名和變量命名規(guī)則相同,但是沒有前綴。也就是說,只需要子名的第一個(gè)字母要大寫。
而且函數(shù)名中使用下劃線是非法的。例如,下面的函數(shù)名表示是無效的匈牙利符號表示法:
int Get_Pixel(int ix,int iy);
*類型和常量的命名
所有的類型和常量都是大寫的字母,但名字中可以允許使用下劃線。
*類的命名
所有c++的類必須使用大寫的C為前綴。類名字的每一個(gè)子名的第一個(gè)字母要大寫。
*參數(shù)的命名
函數(shù)的參數(shù)命名和標(biāo)準(zhǔn)變量命名約定相同。
2.怎樣創(chuàng)建一個(gè)完全實(shí)用的Windows程序,也就是那個(gè)我們經(jīng)常見面的那個(gè)窗口。你只需要下面幾步:
1.創(chuàng)建一個(gè)Windows類。
2.創(chuàng)建一個(gè)事件句柄或WinProc。
3.用Windows注冊Windows類。
4.用前面創(chuàng)建的Windows類創(chuàng)建一個(gè)窗口。
5.創(chuàng)建一個(gè)能夠從事件句柄獲得或向事件句柄傳遞Windows信息的主事件循環(huán)。
2.1 Windows類
“ Windows中的每一個(gè)窗口、控件、列表框、對話框和小部件等等實(shí)際上都是一個(gè)窗口。區(qū)別它們的就是定義它們的類。一個(gè)Windows類就是Windows能夠操作的一個(gè)窗口類型的描述。”
“控制Windows類信息的數(shù)據(jù)結(jié)構(gòu)有兩個(gè):WNDCLASS和WNDCLASSEX。WNDCLASS是比較古老的一個(gè),可能不久將廢棄,因此我們應(yīng)當(dāng)使用新的擴(kuò)展版WNDCLASSEX。”
typedef struct _WNDCLASSEX
{
UNIT cbsize;
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HANDLE hInstance;
HICON hIcon;
HCURSON hCoursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
HICON hIconSm;
}WNDCLASSEX;
創(chuàng)建一個(gè)這樣的結(jié)構(gòu),然后就是填寫里面所有的成員變量:WNDCLASSEX winclass;
2.2事件句柄
這里所說的句柄(exent handler)就是當(dāng)事件發(fā)生時(shí)Windows從主事件循環(huán)調(diào)用的回調(diào)
函數(shù)。對于創(chuàng)建的任何一個(gè)Windows類,都有一個(gè)獨(dú)立的事件句柄,我們稱呼它為WinProc,當(dāng)用戶
和Windows運(yùn)行任務(wù)時(shí),你的窗口和/或其他的應(yīng)用程序窗口產(chǎn)生事件和消息。所有的消息都進(jìn)入一
個(gè)隊(duì)列,而你的窗口的消息發(fā)送你的窗口專用隊(duì)列中。然后主事件循環(huán)檢索這些消息,并且將它們發(fā)
送到你的窗口的WinProc中來處理。
WinProc原型:
LRESULT CALLBACK WindowProc(
HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam );
2.3注冊Windows類
Windows類已經(jīng)定義并且存放在Windsclass中,必須將新的類通知Windows。該功能通過
RegisterClassEx()函數(shù)實(shí)現(xiàn),使用一個(gè)指向新類定義的指針來實(shí)現(xiàn)。如下:
RegisterClassEx(&winclass);
2.4創(chuàng)建窗口
創(chuàng)建窗口使用CreateWindow()或CreateWindowEx()函數(shù)。
2.5主事件循環(huán)
while(TRUE)
{
// test if there is a message in queue, if so get it
if (PeekMessage(&msg,NULL,0,0,PM_REMOVE))
{
// test if this is a quit
if (msg.message == WM_QUIT)
break;
// translate any accelerator keys
TranslateMessage(&msg);
// send the message to the window proc
DispatchMessage(&msg);
} // end if
// main game processing goes here
Game_Main();
} // end while