在上一篇中我著重介紹了WINDOWS API32程序的基本結(jié)構(gòu)框架,您一定想完成自己的第一個(gè)WINDOWS程序吧?別忙我先向您介紹一下API的窗口函數(shù),只有了解它您才能進(jìn)行編程。
什么是窗口函數(shù)呢?它又定義了什么呢?窗口函數(shù)定義了應(yīng)用程序?qū)邮艿降牟煌⒌捻憫?yīng),其中包含了應(yīng)用程序?qū)Ω鞣N可能接受到的消息的處理過(guò)程,是消息處理分支控制語(yǔ)句的集合。一般來(lái)說(shuō),窗口函數(shù)由一個(gè)或多個(gè)switch語(yǔ)句組成。每一個(gè)case語(yǔ)句對(duì)應(yīng)一種消息,當(dāng)應(yīng)用程序接受到一個(gè)消息時(shí),在窗口函數(shù)內(nèi)的相應(yīng)的case語(yǔ)句就會(huì)被激活并執(zhí)行相應(yīng)的響應(yīng)程序模塊。
簡(jiǎn)單的說(shuō)窗口函數(shù)就是應(yīng)用程序處理接受到的消息的函數(shù),其中包含了應(yīng)用程序?qū)Ω鞣N可能接受到的有用的消息的處理過(guò)程。
窗口函數(shù)的一般格式是這樣的:
LRESULT CALLBACK WndProc
( HWND hwnd, //窗口句柄
UNIT message, //代表所處理消息的消息值
WPARAM wParam, //消息的附加參數(shù)(1)
LPARAM lParam //消息的附加參數(shù)(2)
)
{
... //省略
switch(message) //message為標(biāo)識(shí)消息的消息值
{
case...
...
break;
...
case WM_DESTROY:
PostQuitMessage(0);
default:
return DefWindowProc(hwnd,message,wParam,lParam);
}
return(0);
}
窗口函數(shù)主體內(nèi)容是消息處理語(yǔ)句,它由多個(gè)case語(yǔ)句組成。您只需要將窗口可能接收到的消息在case語(yǔ)句中編寫相應(yīng)的處理程序段就可以了。
在case語(yǔ)句的消息處理程序段中一般都有對(duì)消息WM_DESTROY的處理。這個(gè)消息是關(guān)閉窗口時(shí)發(fā)出的。一般情況下,應(yīng)用程序調(diào)用函數(shù)PostQuitMessage響應(yīng)這條消息。PostQuitMessage函數(shù)的定義如下:
void PostQuitMessage(int nExitCode); //nExitCode為應(yīng)用程序退出代碼
在處理case語(yǔ)句中不包含的信息時(shí)我們用這個(gè)默認(rèn)處理:
return DefWindowProc(hwnd,message,wParam,lParam);
來(lái)保證所有發(fā)送到窗口的消息都得到了應(yīng)有的處理。
除了了解窗口函數(shù)的基本結(jié)構(gòu),我們還要掌握一些基本W(wǎng)INDOWS程序的數(shù)據(jù)結(jié)構(gòu)
(1)MSG,前文已介紹過(guò)了
(2)WNDCLASS
結(jié)構(gòu)WNDCLASS包含一個(gè)窗口類的全部信息。應(yīng)用程序通過(guò)定義一個(gè)窗口類來(lái)確定窗口的屬性。它的定義如下:
typedef struct tagWNDCLASS
{
UNIT style;/t //窗口的樣式,一般為0
WNDPROC lpfWndProc; //指向窗口函數(shù)的指針
int cbClsExtra; //分配在窗口類結(jié)構(gòu)后的字節(jié)數(shù)
int cbWndExtra; //分配在窗口實(shí)例后的字節(jié)數(shù)
HINSTANCE hInstance; //定義窗口類的應(yīng)用程序的實(shí)例句柄
HICON hIcon;/t //窗口類的圖標(biāo)
HCURSOR hCursor; //窗口類的光標(biāo)
HBRUSH hbrBackground; //窗口類的背景刷
LPCSTR lpszMenuName; //窗口類的菜單資源名
LPCSTR lpszClassName; //窗口類名
} WNDCLASS;
現(xiàn)在我就可以教您寫出自己的第一個(gè)WINDOWS程序(點(diǎn)擊此處下載)
#include <windows.h>
//窗口函數(shù)說(shuō)明
LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
//初始化窗口類
//WinMain函數(shù)說(shuō)明
int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInst, LPSTR lpszCmdLine, int nCmdShow)
{
HWND hwnd ;
MSG Msg ;
WNDCLASS wndclass ;
char lpszClassName[] = "窗口"; //窗口類名
char lpszTitle[]= "My_Windows"; //窗口標(biāo)題名
//窗口類的定義
wndclass.style = 0;/t //窗口類型為缺省類型
wndclass.lpfnWndProc = WndProc ; //窗口處理函數(shù)為WndProc
wndclass.cbClsExtra = 0 ;/t//窗口類無(wú)擴(kuò)展
wndclass.cbWndExtra = 0 ;/t//窗口實(shí)例無(wú)擴(kuò)展
wndclass.hInstance = hInstance ; //當(dāng)前實(shí)例句柄
wndclass.hIcon = LoadIcon( NULL, IDI_APPLICATION) ;
//窗口的最小化圖標(biāo)為缺省圖標(biāo)
wndclass.hCursor = LoadCursor( NULL, IDC_ARROW) ;
//窗口采用箭頭光標(biāo)
wndclass.hbrBackground = GetStockObject( WHITE_BRUSH) ;
//窗口背景為白色
wndclass.lpszMenuName = NULL ; //窗口中無(wú)菜單
wndclass.lpszClassName = lpszClassName ; //窗口類名為"窗口示例"
//窗口類注冊(cè)
if( !RegisterClass( &wndclass)) //如果注冊(cè)失敗則發(fā)出警告聲音
{
MessageBeep(0) ;
return FALSE ;
}
//創(chuàng)建窗口
hwnd=CreateWindow(lpszClassName, //窗口類名
lpszTitle,/t/t //窗口實(shí)例的標(biāo)題名
WS_OVERLAPPEDWINDOW,/t //窗口的風(fēng)格
CW_USEDEFAULT,
CW_USEDEFAULT,/t/t //窗口左上角坐標(biāo)為缺省值
CW_USEDEFAULT,
CW_USEDEFAULT,,/t/t//窗口的高和寬為缺省值
NULL,/t/t/t //此窗口無(wú)父窗口
NULL,/t/t/t //此窗口無(wú)主菜單
hInstance,/t/t //創(chuàng)建此窗口的應(yīng)用程序的當(dāng)前句柄
NULL) ;/t/t/t//不使用該值
//顯示窗口
ShowWindow( hwnd, nCmdShow) ;
//繪制用戶區(qū)
UpdateWindow(hwnd);
//消息循環(huán)
while(GetMessage(&Msg, NULL, 0, 0))
{
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
return Msg.wParam; //消息循環(huán)結(jié)束即程序終止時(shí)將信息返回系統(tǒng)
}
//窗口函數(shù)
LRESULT CALLBACK WndProc(HWND hwnd,UINT message,WPARAM wParam, LPARAM lParam)
{
switch(message)
{
case WM_DESTROY:
PostQuitMessage(0); //調(diào)用PostQuitMessage發(fā)出WM_QUIT消息
default: //默認(rèn)時(shí)采用系統(tǒng)消息默認(rèn)處理函數(shù)
return DefWindowProc(hwnd,message,wParam,lParam);
}
return 0;
}
您的程序成功了嗎?在下一章我將向您介紹WINDOWS繪圖。