windows API,為應(yīng)用程序提供windows系統(tǒng)特殊函數(shù)以及數(shù)據(jù)結(jié)構(gòu).
windows應(yīng)用程序可以利用大量api函數(shù)調(diào)用系統(tǒng)功能.
是win系統(tǒng)與應(yīng)用程序間的標(biāo)準(zhǔn)程序接口.
幾個(gè)類別
- 窗口管理函數(shù): 實(shí)現(xiàn)窗口創(chuàng)建,移動(dòng)和修改功能.
- 系統(tǒng)服務(wù)函數(shù): 實(shí)現(xiàn)與操作系統(tǒng)有關(guān)的多種功能.
- 圖形設(shè)備函數(shù): 實(shí)現(xiàn)與設(shè)備無(wú)關(guān)的圖形操作功能.
windows程序的幾個(gè)概念:
- 窗口概念:
是系統(tǒng)管理應(yīng)用程序的基本單位,應(yīng)用程序與用戶交互的接口環(huán)境.是win應(yīng)用程序基本的操作單元.
- 事件驅(qū)動(dòng)概念:
- 句柄概念:
句柄是一個(gè)8字節(jié)長(zhǎng)(相當(dāng)于64位操作系統(tǒng))的數(shù)值,用于表示應(yīng)用程序中不同的對(duì)象和同類對(duì)象的不同的實(shí)例.
- 消息的概念:
觀察MSG結(jié)構(gòu)體的定義:
- windows 應(yīng)用程序組成以及編程步驟
- 定義窗口類
- 注冊(cè)窗口類
- 創(chuàng)建一個(gè)窗口類的實(shí)例
- 顯示窗口
- 消息循環(huán)
- 窗口函數(shù) WinProc
// 主函數(shù),入口函數(shù).函數(shù)說(shuō)明,初始化,進(jìn)入消息循環(huán).
// 四個(gè)參數(shù),分別傳入當(dāng)前句柄,父窗口句柄,命令行指針(給應(yīng)用程序下命令的),樣式.
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrstance,LPSTR lpszCmdLine,int nCmdShow) {
HWND hwnd; // 定義一個(gè)窗口句柄
MSG mMsg; // 定義一消息實(shí)例.
// 定義一個(gè)窗口類實(shí)例.
WNDCLASS wndclass;
// unicode 編碼.
wchar_t lpszClassName[] = L"窗口";// 窗口類名.
wchar_t lpszTitle[] = L"my_windows";// 窗口標(biāo)題名.
wndclass.cbClsExtra = 0; // 窗口類無(wú)擴(kuò)展
wndclass.cbWndExtra = 0; // 窗口實(shí)例無(wú)擴(kuò)展
wndclass.hbrBackground =(HBRUSH)GetStockObject(WHITE_BRUSH); // 背景顏色,使用系統(tǒng)畫刷填充.
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); // 系統(tǒng)光標(biāo)
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); // 圖標(biāo),使用系統(tǒng).
wndclass.hInstance = hInstance; // 當(dāng)前實(shí)例句柄.
wndclass.lpfnWndProc = WinProc; // 定義窗口處理函數(shù)
wndclass.lpszClassName =lpszClassName; // 類名
wndclass.lpszMenuName = NULL; // 菜單名.
wndclass.style = 0; //值設(shè)0,默認(rèn)樣式,缺省處理.(詳細(xì)設(shè)置,class style cs_)
// 注冊(cè)窗口類
if (!RegisterClass(&wndclass))
{
MessageBeep(0);
return FALSE;
}
// 創(chuàng)建窗口.
hwnd = CreateWindow(
lpszClassName, // 窗口類名
lpszTitle, // 窗口名
WS_OVERLAPPEDWINDOW, // 窗口風(fēng)格window style
CW_USEDEFAULT,
CW_USEDEFAULT, //窗口左上角坐標(biāo) usedefault 使用默認(rèn)值(缺省,使用系統(tǒng)默認(rèn)大小)
CW_USEDEFAULT,
CW_USEDEFAULT, // 窗口高寬使用默認(rèn)值.
NULL, // 無(wú)父窗口
NULL, // 無(wú)菜單項(xiàng)(menu) window系統(tǒng)的一種資源.
hInstance, // 創(chuàng)建此窗口的當(dāng)前實(shí)例句柄
NULL // lParam 類型.設(shè)為NULL不使用該值.
);
// 顯示窗口
ShowWindow(hwnd,nCmdShow);
// 跟新,繪制用戶區(qū).
UpdateWindow(hwnd);
// 進(jìn)入消息循環(huán)
while (GetMessage(&mMsg,NULL,0,0))
{
TranslateMessage(&mMsg); // 將消息的虛擬鍵轉(zhuǎn)換為字符消息
DispatchMessage(&mMsg); // 將消息傳送到指定的窗口函數(shù)
}
return mMsg.wParam;
}
// 窗口函數(shù),消息處理函數(shù),回調(diào)函數(shù).
LRESULT CALLBACK WinProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam) {
switch (uMsg)
{
case WM_DESTROY:
PostQuitMessage(0); // 退出.
return 0;
default:
return
DefWindowProc(hWnd, uMsg, wParam, lParam); // 缺省的消息處理
}
}
- 數(shù)據(jù)類型:
- 數(shù)據(jù)結(jié)構(gòu)
-
WNDCLASSEX 結(jié)構(gòu)
圖片.png RECT 結(jié)構(gòu)
- 總結(jié)一下創(chuàng)建一個(gè)windows程序的過(guò)程:
引入頭文件<windows.h>,聲明入口函數(shù) WinMain函數(shù),其帶入的四個(gè)參數(shù),第一個(gè)是當(dāng)前的實(shí)例句柄,第二個(gè)父窗口句柄,第三個(gè)LPSTR類型的指針,指向命令行指令.第四個(gè)是整型的樣式值.
主函數(shù)需要先通過(guò)WNDCLASS wndclass;
來(lái)進(jìn)行窗口類的定義,然后通過(guò)RegisterClass(&wndclass)
注冊(cè)窗口類,如果注冊(cè)失敗,返回FALSE.如果注冊(cè)成功,則通過(guò)HWND hWnd = CreateWindow()
創(chuàng)建一個(gè)窗口.并初始化.如果創(chuàng)建失敗返回FALSE,否則通過(guò)ShowWindow(hInstance,nCmdShow)
顯示,并使用UpdateWindow(hWnd)
更新窗口.在主函數(shù)中定義一個(gè)MSG結(jié)構(gòu)體變量 mMsg
,通過(guò)while循環(huán)和GetMessage(&mMsg)
進(jìn)入消息循環(huán),循環(huán)中不端通過(guò)TranslateMessage(&mMsg)
將虛擬鍵消息轉(zhuǎn)換為字符消息,再通過(guò)DispatchMessage(&mMsg)
將消息分派到指定的窗口函數(shù).進(jìn)入窗口函數(shù)WndProc()
,WndProc函數(shù)有四個(gè)參數(shù),分別傳入消息發(fā)生的窗口句柄,消息類型,消息所攜帶的字參數(shù)wParam
和長(zhǎng)字參數(shù)lParam
,通過(guò)switch(mMsg)
結(jié)構(gòu)分別對(duì)接收到的不同消息做處理.在默認(rèn)情況下要通過(guò)DefWindowProc()
函數(shù)做默認(rèn)(缺省)處理.當(dāng)接收到WM_DESTROY消息是通過(guò)PostQuitMessage()
函數(shù)退出消息循環(huán).并在主函數(shù)中返回一個(gè)mMsg的字參數(shù)(wParam)作為程序的結(jié)束.
2019.1.3
11.08