int WINAPI WinMain(
HINSTANCE hInstance, // handle to current instance 程序當前運行實(shí)例句柄
HINSTANCE hPrevInstance, // handle to previous instance 前一個(gè)實(shí)例句柄,參數總為NULL
LPSTR lpCmdLine, // command line 以空字符串結尾的命令行參數
int nCmdShow // show state 指定窗口的顯示方式
)
二、創(chuàng )建一個(gè)窗口
1.設計一個(gè)窗口類(lèi)
2.注冊一個(gè)窗口類(lèi)
3.創(chuàng )建窗口
4.顯示及更新窗口
(1).設計一個(gè)窗口類(lèi)
typedef struct _WNDCLASS{
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HANDLE hInstance;
HICON Icon;
HCURSOR Cursor;
HBRUSH hbrBackground;
LPCTSTR lpszMenuName;
LPCTSTR lpszClassName;
} WNDCLASS;
?、?style 屬性指定窗口樣式:
CS_HREDRAW - 水平寬度變化重繪。
CS_VREDRAW - 垂直方向高度變化重繪.
CS_NOCLOSE - 禁用系統CLOSE命令.設關(guān)閉按鈕.
CS_DBLCLKS - 窗口接收雙擊消息.
?、?lpfnwndproc 函數指針
指向窗口過(guò)程函數
窗口過(guò)程函數是一個(gè)回調函數
?、?cbclsExtra; -- 一般值為0
Windows 系統中每一個(gè)窗口類(lèi)型管理一個(gè)WNDCLASS結構
?、?cbwndExtra; -- 一般值為0
Windows系統中為每一個(gè)窗口管理一個(gè)內部數據結構,在注冊一個(gè)窗口類(lèi)時(shí),
應用程序能夠指定一定字節數的附加內存空間,稱(chēng)為窗口附加內存.
?、輍Instance
包含窗口過(guò)程的程序實(shí)例句柄
?、辢Icon 窗口類(lèi)圖標句柄
成員變量須為一個(gè)圖標資源句柄且成員為NULL,為系統提供默認圖標
我們可使用loadIcon函數來(lái)加載一個(gè)圖標資源,并且它給系統分配圖標句柄.
函數原型:
HIcon loadIcon(HINSTANCE hInstance, LPCTSTR lpIconName)
?、遠Cursor指定窗口類(lèi)光標句柄 -- 必須加載一個(gè)光標資源句柄,如果成員為NULL,
無(wú)論何時(shí)鼠標進(jìn)入到應用程序窗口中,應用程序都必須明確設置光標形狀。
?、鄅brBackgound指定窗口類(lèi)背景畫(huà)刷句柄
當窗口發(fā)生重繪,系統使用這里指定畫(huà)刷來(lái)擦除窗口背影.
?、?lpszMenuName -- 指定菜單資源名字(以以后終止字符串)
如果使用菜單資源ID,那么需要用MAKENTRESouRCE宏來(lái)轉換
如果將其初始化為NULL,那么就算默認沒(méi)有菜單。
三、注冊窗口類(lèi)
設計宏窗口類(lèi)后(WNDCLASS),我們還需要用 RegisterClass函數
對其進(jìn)行注冊,注冊成功后,才可創(chuàng )建該類(lèi)型窗口 原型如下:
ATOM RisterClass(Const WNDCLASS *LPWNDCLass);
函數只有 - 參數,即上步驟中所設計窗口類(lèi)對象指針。
四、創(chuàng )建窗口 -- CreateWindow 函數
HWND CreateWindow(
LPCTSTR lpClassName, // 窗口類(lèi)的名稱(chēng) 說(shuō)明1
LPCTSTR lpWindowName // 窗口的名字 - 窗口樣式又標題欄,指定窗口名是在標題欄
DWORD dwstyle, // 指定窗口類(lèi)樣式,具體參考WS_OVERLAPPEDWINDOW類(lèi)型
int x, // 窗口左上角x.y坐標 -- 寬、高。 -- x,設為CW_USEDEFAULT,窗口默認左上角坐標忽略y參數。
int y,
int nWidth,
int nHeight, // - 設為 CW_USEDEFAULT 窗口默認寬、高,nHight忽略。
HWND hwndparent, // 創(chuàng )建窗口的父窗口句柄
HMENU hmenu. // 指定窗口菜單句柄
HANDLE hInstance, // 指定窗口所屬應用程序實(shí)例句柄
LPVOID lparam // WM_CREATE消息附加參數lparam傳入數據指針
// 創(chuàng )建多文檔界面窗口,lparam指向CLIENTCREATESRUCT結構體多數窗口設為NULL
// 說(shuō)明1、調用CreateWindows函數前,沒(méi)有用RegisterClass函數,注冊名稱(chēng)的窗口類(lèi)。
#define WS_OVERLAPPEDWINDOW (WS_OVERLAPPED // 產(chǎn)生層疊窗口有標題欄和邊框
WS_CAPTION |\ 創(chuàng )建一個(gè)有標題窗口
WS_SYSMENU |\ 創(chuàng )建在標題欄上有系統菜單和WS_CAPTION類(lèi)型一起作用
WS_THICKFRAME |\ 創(chuàng )建一個(gè)具有可調邊框窗口
WS_MINIMIZEBOX |\ 最小化窗口,設定WS_SYSMENU類(lèi)型
WS_MAXIMIZEBOX |\ 最大化窗口,設定WS_SYSMENU類(lèi)型
)
窗口創(chuàng )建成功,CreaeWindow 函數返回系統為窗口分配句柄,否則返回NULL
五、顯示及更新窗口 -- ShowWindow 函數
原型
Bool ShowWindow(
HWND hwnd, // 創(chuàng )建窗口后返回哪個(gè)窗口句柄。
int nCmdshow // 用來(lái)指定窗口顯示狀態(tài)。
);
nCmdShow 參數一般為:
SW_HIDE -- 隱藏并激活其他窗口 SW_SHOW --窗口原位置 以原來(lái)尺寸激活和顯示窗口
SW_SHOWMAXIMIZED -- 激活窗口并將其最大化顯示
SW_SHOWMINIMIZED -- 激活窗口并將其最小化顯示
SW_SHOWNORMAL -- 激活并顯示窗口 -- 窗口最小化或最大化狀態(tài) 系統其恢復原來(lái)尺寸和大小。
更新窗口 -- updateWindow來(lái)刷新窗口
原型
Bool updateWindow(
HWHD hwndl;// 指創(chuàng )建成功后的窗口句柄
) updateWindow 函數通過(guò)發(fā)送一個(gè)WM_PAINT 消息來(lái)刷新窗口
updateWindow 將WM_PAINT消息直接發(fā)送給窗口過(guò)程函數進(jìn)行處理,而沒(méi)放到我們前面所說(shuō)的消息隊列中。
六、消息循環(huán) -- GetMessage函數
原型:
Bool Getmessage(
LPMSG lpmsg, // 指向一個(gè)消息結構體 -- 將消息隊列中信息保存在結構體對象中。
HWND hwnd, // 接收屬于哪個(gè)窗口消息,通常設置NULL接收屬于調用線(xiàn)程所有窗口的窗口消息
UINT WMsgFiltermin, // 獲取消息最小值,設為0接收所有消息。
UINT WMsgFiltermax // 獲取消息最大值,設為0接收所有消息。
GetMessage 接收除WM_QUIT外消息的非零值,對于WM_QUIT消息函數返回零,如果出現錯誤,
函數直接返回-1
MSG msg;
while (GetMessage(&msg,null,0,0))
{
Translatemessage(&msg); // 用于將虛擬鍵消息轉換為字符消息
Dispatchmessage(&msg); // 分配一個(gè)消息到窗口過(guò)程,窗口過(guò)程函數對消息進(jìn)行處理
}
七、編寫(xiě)窗口過(guò)程函
LRESULT CALLBACK WinSunProc(
HWND hwnd, // 窗口句柄
UINT uMsg, // 消息代碼
WPARAM wParam, // 第一條消息參數
LPARAM lParam // 第二條消息參數
);
{
switch(uMsg)
{
case WM_CHAR: // 用戶(hù)按下字符鍵時(shí)...收到WM_CHAR消息通過(guò)Translatemessage函數轉換ASCII值。
char szChar[20];
sprintf(szChar,"char code is %d",wParam);
MessageBox(hwnd,szChar,"char",0);
break;
case WM_LBUTTONDOWN: // 接收窗口按下鼠標左鍵 會(huì )產(chǎn)生 WM_LBUTTONDOWN 消息.
MessageBox(hwnd,"mouse clicked","message",0);
HDC hdc;
hdc=GetDC(hwnd);
TextOut(hdc,0,50,"程序員之家",strlen("程序員之家"));
//ReleaseDC(hwnd,hdc);
break;
case WM_PAINT: // 對 WM_PAINT 消息進(jìn)行處理。當窗口客戶(hù)區部分或全部無(wú)效時(shí),系統發(fā)生 WM_PAINT 消息
// 通知應用程序重新繪制窗口。
HDC hDC;
PAINTSTRUCT ps;
hDC=BeginPaint(hwnd,&ps);
TextOut(hDC,0,0,"http://www.sunxin.org",strlen("http://www.sunxin.org"));
EndPaint(hwnd,&ps);
break;
case WM_CLOSE: // 用戶(hù)點(diǎn)擊關(guān)閉按鈕時(shí) 系統會(huì )接收 WM_CLOSE
if(IDYES==MessageBox(hwnd,"是否真的結束?","message",MB_YESNO))
{
DestroyWindow(hwnd); // 當用戶(hù)在對話(huà)框上選擇 是時(shí)~~會(huì )調用DestroyWindow銷(xiāo)毀窗口。
}
break;
case WM_DESTROY: // 要想讓程序正常退出,必須響應 WM_DESTROY 消息~~并在消息代碼中調用 PostQuitMessage 函數
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam); // 函數調用默認的窗口過(guò)程,對程序沒(méi)有處理的其他消息提供默認處理。
}
聯(lián)系客服