怎么查詢網(wǎng)站是否被收錄百度網(wǎng)址大全設(shè)為主頁(yè)
(詳解入門(mén))Windows 應(yīng)用程序的 簡(jiǎn)單窗口創(chuàng)建
以及關(guān)鍵函數(shù)詳細(xì)解釋
。
前言(有必要了解):
Windows API
就是Windows應(yīng)用程序接口,是針對(duì)Microsoft Windows操作系統(tǒng)家族的系統(tǒng)編程接口,為搭建各種圖形界面提供庫(kù)函數(shù)。實(shí)際上如果我們要開(kāi)發(fā)出更靈活、更實(shí)用、更具效率的應(yīng)用程序,雖然類(lèi)庫(kù)和控件使應(yīng)用程序的開(kāi)發(fā)簡(jiǎn)單的多,但它們只提供Windows的一般功能,對(duì)于比較復(fù)雜和特殊的功能來(lái)說(shuō),使用類(lèi)庫(kù)和控件是非常難以實(shí)現(xiàn)的,這時(shí)就需要采用API函數(shù)來(lái)實(shí)現(xiàn)。
MFC
是微軟公司提供的一個(gè)類(lèi)庫(kù),以C++類(lèi)的形式封裝了Windows API,并且包含應(yīng)用程序框架,以減少應(yīng)用程序開(kāi)發(fā)人員的工作量。其中包含大量Windows句柄封裝類(lèi)和很多Windows的內(nèi)建控件和組件的封裝類(lèi)。
其中32位Windows操作系統(tǒng)的編程接口稱為
Win32 API
,以便與以前16位版本W(wǎng)indows編程接口(16位Windows API)區(qū)別開(kāi)來(lái)。
一、簡(jiǎn)單窗口的創(chuàng)建
1.演示(以Dev C++為例,其他編譯器也差不多)
選擇文件----新建----項(xiàng)目----WindowsApplication----確定
2.完成以上操作會(huì)自行生成以下代碼(有解釋)
// 包括頭文件
#include <windows.h>
// 消息處理函數(shù)
LRESULT CALLBACK WndProc(HWND hwnd, // hwnd是要處理窗口的句柄,UINT Message, // message是消息ID,代表了不同的消息類(lèi)型WPARAM wParam, // wParam的值為按下按鍵的虛擬鍵碼LPARAM lParam) // lParam則存儲(chǔ)按鍵的相關(guān)狀態(tài)信息
{ switch(Message) {case WM_DESTROY: { // 處理窗口結(jié)束消息PostQuitMessage(0);break;}default:return DefWindowProc(hwnd, Message, wParam, lParam);}return 0;
}
lParam則存儲(chǔ)按鍵的相關(guān)狀態(tài)信息(比如當(dāng)鼠標(biāo)消息發(fā)出時(shí),wParam值為鼠標(biāo)按鍵的信息,而lParam則儲(chǔ)存鼠標(biāo)的坐標(biāo),高字節(jié)代表y坐標(biāo),低字節(jié)代表x坐標(biāo)。
// WinMain函數(shù)是應(yīng)用程序的入口,相當(dāng)DOS程序的main函數(shù)
int WINAPI WinMain(HINSTANCE hInstance, // 當(dāng)前實(shí)例句柄HINSTANCE hPrevInstance, // 前一個(gè)實(shí)例句柄LPSTR lpCmdLine, // 指向命令行參數(shù)的指針int nCmdShow) // 窗口的顯示狀態(tài)
{// 注冊(cè)窗口WNDCLASSEX wc; // 定義窗口類(lèi)HWND hwnd; // 窗口句柄MSG msg; // 定義消息memset(&wc,0,sizeof(wc)); // 為新申請(qǐng)的內(nèi)存做初始化wc.cbSize = sizeof(WNDCLASSEX); // WNDCLASSEX的大小wc.lpfnWndProc = WndProc; // 指定消息處理函數(shù)wc.hInstance = hInstance; // 實(shí)例句柄wc.hCursor = LoadCursor(NULL, IDC_ARROW); // 光標(biāo)句柄wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); // 背景畫(huà)刷的句柄wc.lpszClassName = "WindowClass"; // 窗口類(lèi)名wc.hIcon = LoadIcon(NULL, IDI_APPLICATION); // 圖標(biāo)句柄wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION); //和窗口類(lèi)關(guān)聯(lián)的小圖標(biāo)if(!RegisterClassEx(&wc)) { // 注冊(cè)窗口MessageBox(NULL, "Window Registration Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);return 0;}// 創(chuàng)建窗口hwnd = CreateWindowEx(WS_EX_CLIENTEDGE,"WindowClass","Caption",WS_VISIBLE|WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT, 640,480, NULL,NULL,hInstance,NULL);if(hwnd == NULL) {MessageBox(NULL, "Window Creation Failed!","Error!",MB_ICONEXCLAMATION|MB_OK);return 0;}ShowWindow(hwnd,nCmdShow); // 顯示窗口UpdateWindow(hwnd); // 更新窗口// 消息循環(huán)while(GetMessage(&msg, NULL, 0, 0) > 0) { TranslateMessage(&msg); // 翻譯消息DispatchMessage(&msg); // 將消息發(fā)送給WndProc處理}return msg.wParam;
}
3.代碼運(yùn)行結(jié)果(如圖)
二、關(guān)鍵函數(shù)的詳解
1.注冊(cè)窗口 RegisterClassEx
注冊(cè)一個(gè)窗口類(lèi),以便在調(diào)用 CreateWindow或 CreateWindowEx函數(shù)時(shí)使用。
函數(shù)原型:
ATOM WINAPI RegisterClassEx(_In_ const WNDCLASSEX *lpwcx
);
參數(shù)解釋:
參數(shù)
lpwcx [in]
類(lèi)型:const WNDCLASSEX *
指向WNDCLASSEX結(jié)構(gòu)的指針 。在將結(jié)構(gòu)傳遞給函數(shù)之前,必須使用適當(dāng)?shù)念?lèi)屬性填充結(jié)構(gòu)。
注意:RegisterClass 函數(shù)己經(jīng)被 RegisterClassEx 函數(shù)代替。然而,如果你不需要設(shè)置類(lèi)的小圖標(biāo),你仍然可以使用 RegisterClass 函數(shù)。
2.創(chuàng)建窗口 CreateWindowEx
函數(shù)原型 :
HWND CreateWindowEx(DWORD dwExStyle, // 窗口的擴(kuò)展風(fēng)格LPCTSTR lpClassName, // 已經(jīng)注冊(cè)的窗口類(lèi)名稱LPCTSTR lpWindowName, // 窗口標(biāo)題欄的名字DWORD dwStyle, // 窗口的基本風(fēng)格int x, // 窗口左上角水平坐標(biāo)位置int y, // 窗口左上角垂直坐標(biāo)位置int nWidth, // 窗口的寬度int nHeight, // 窗口的高度HWND hWndParent, // 窗口的父窗口句柄HMENU hMenu, // 窗口菜單句柄HINSTANCE hInstance, // 應(yīng)用程序?qū)嵗浔鶯PVOID lpParam // 窗口創(chuàng)建時(shí)附加參數(shù)
); // 創(chuàng)建成功返回窗口句柄
參數(shù)解釋 :
參數(shù)一:dwExStyle 指定窗口的擴(kuò)展風(fēng)格
dwExStyle窗口的擴(kuò)展風(fēng)格 | 含義 |
---|---|
WS_EX_NODRAG: | 防止窗口被移動(dòng) |
WS_EX_ACCEPTFILES: | 指定以該風(fēng)格創(chuàng)建的窗口接受一個(gè)拖拽文件。 |
WS_EX_APPWINDOW: | 當(dāng)窗口可見(jiàn)時(shí),將一個(gè)頂層窗口放置到任務(wù)條上。 |
WS_EX_CLIENTEDGE: | 指定窗口有一個(gè)帶陰影的邊界。 |
WS_EX_CONTEXTHELP: | 在窗口的標(biāo)題條包含一個(gè)問(wèn)號(hào)標(biāo)志。當(dāng)用戶點(diǎn)擊了問(wèn)號(hào)時(shí),鼠標(biāo)光標(biāo)變?yōu)橐粋€(gè)問(wèn)號(hào)的指針、如果點(diǎn)擊了一個(gè)子窗口,則子窗口接收到WM_HELP消息。子窗口應(yīng)該將這個(gè)消息傳遞給父窗口過(guò)程,父窗口再通過(guò)HELP_WM_HELP命令調(diào)用WinHelp函數(shù)。這個(gè)Help應(yīng)用程序顯示一個(gè)包含子窗口幫助信息的彈出式窗口。WS_EX_CONTEXTHELP不能與WS_MAXIMIZEBOX和WS_MINIMIZEBOX同時(shí)使用。 |
WS_EX_CONTROLPARENT: | 允許用戶使用Tab鍵在窗口的子窗口間搜索。 |
WS_EX_DLGMODALFRAME: | 創(chuàng)建一個(gè)帶雙邊的窗口;該窗口可以在dwStyle中指定WS_CAPTION風(fēng)格來(lái)創(chuàng)建一個(gè)標(biāo)題欄。 |
WS_EX_LEFT: | 窗口具有左對(duì)齊屬性,這是缺省設(shè)置的。 |
WS_EX_LEFTSCROLLBAR: | 如果外殼語(yǔ)言是如Hebrew,Arabic,或其他支持reading order alignment的語(yǔ)言,則標(biāo)題條(如果存在)則在客戶區(qū)的左部分。若是其他語(yǔ)言,在該風(fēng)格被忽略并且不作為錯(cuò)誤處理。 |
WS_EX_LTRREADING: | 窗口文本以LEFT到RIGHT(自左向右)屬性的順序顯示。這是缺省設(shè)置的。 |
WS_EX_MDICHILD: | 創(chuàng)建一個(gè)MDI子窗口。 |
WS_EX_NOPATARENTNOTIFY: | 指明以這個(gè)風(fēng)格創(chuàng)建的窗口在被創(chuàng)建和銷(xiāo)毀時(shí)不向父窗口發(fā)送WM_PARENTNOTFY消息。 |
WS_EX_OVERLAPPEDWINDOW: | WS_EX_CLIENTEDGE和WS_EX_WINDOWEDGE的組合。 |
WS_EX_PALETTEWINDOW: | WS_EX_WINDOWEDGE, WS_EX_TOOLWINDOW和WS_WX_TOPMOST風(fēng)格的組合 |
WS_EX_RIGHT: | 窗口具有普通的右對(duì)齊屬性,這依賴于窗口類(lèi)。只有在外殼語(yǔ)言是如Hebrew,Arabic或其他支持讀順序?qū)R(reading order alignment)的語(yǔ)言時(shí)該風(fēng)格才有效,否則,忽略該標(biāo)志并且不作為錯(cuò)誤處理。 |
WS_EX_RIGHTSCROLLBAR: | 垂直滾動(dòng)條在窗口的右邊界。這是缺省設(shè)置的。 |
WS_EX_RTLREADING: | 如果外殼語(yǔ)言是如Hebrew,Arabic,或其他支持讀順序?qū)R(reading order alignment)的語(yǔ)言,則窗口文本是一自左向右)RIGHT到LEFT順序的讀出順序。若是其他語(yǔ)言,在該風(fēng)格被忽略并且不作為錯(cuò)誤處理。 |
WS_EX_STATICEDGE: | 為不接受用戶輸入的項(xiàng)創(chuàng)建一個(gè)3一維邊界風(fēng)格 |
WS_EX_TOOLWINDOW: | 創(chuàng)建工具窗口,即窗口是一個(gè)游動(dòng)的工具條。工具窗口的標(biāo)題條比一般窗口的標(biāo)題條短,并且窗口標(biāo)題以小字體顯示。工具窗口不在任務(wù)欄里顯示,當(dāng)用戶按下alt+Tab鍵時(shí)工具窗口不在對(duì)話框里顯示。如果工具窗口有一個(gè)系統(tǒng)菜單,它的圖標(biāo)也不會(huì)顯示在標(biāo)題欄里,但是,可以通過(guò)點(diǎn)擊鼠標(biāo)右鍵或Alt+Space來(lái)顯示菜單。 |
WS_EX_TOPMOST: | 指明以該風(fēng)格創(chuàng)建的窗口應(yīng)放置在所有非最高層窗口的上面并且停留在其L,即使窗口未被激活。使用函數(shù)SetWindowPos來(lái)設(shè)置和移去這個(gè)風(fēng)格。 |
WS_EX_TRANSPARENT: | 指定以這個(gè)風(fēng)格創(chuàng)建的窗口在窗口下的同屬窗口已重畫(huà)時(shí),該窗口才可以重畫(huà)。由于其下的同屬窗口已被重畫(huà),該窗口是透明的。 |
參數(shù)二:lpClassName 已經(jīng)注冊(cè)的窗口類(lèi)名稱
- 窗口類(lèi)名稱,可以是一個(gè)指向 NULL 結(jié)束的字符串或一個(gè)整型數(shù)值
- 如果是字符串,它指定了窗口的類(lèi)名。這個(gè)類(lèi)名可以是任何用函數(shù) RegisterClass 注冊(cè)的類(lèi)名,或是任何預(yù)定義的控制類(lèi)名
- 如是一個(gè)整型量,它是由此前調(diào)用 theGlobalAddAtom 函數(shù)產(chǎn)生的全局量。這個(gè)小于 0xC000 的 16 位數(shù)必須是 lpClassName 參數(shù)字的低 16 位,該參數(shù)的高位必須是 0
參數(shù)三:lpWindowName 窗口標(biāo)題欄的名字
- 窗口標(biāo)題,一個(gè)指向 NULL 結(jié)束的字符串指針
- 如果窗口風(fēng)格指定了標(biāo)題條,由 lpWindowName 指向的窗口標(biāo)題將顯示在標(biāo)題條上
- 當(dāng)使用 Createwindow 函數(shù)來(lái)創(chuàng)建控制例如按鈕,選擇框和靜態(tài)控制時(shí),可使用 lpWindowName 來(lái)指定控制文本
參數(shù)四:dwStyle 窗口的基本風(fēng)格
dwStyle窗口的基本風(fēng)格 | 含義 |
---|---|
WS_BORDER: | 創(chuàng)建一個(gè)帶邊框的窗口。 |
WS_CAPTION: | 創(chuàng)建一個(gè)有標(biāo)題框的窗口(包括WS_BODER風(fēng)格)。 |
WS_CHILD: | 創(chuàng)建一個(gè)子窗口。這個(gè)風(fēng)格不能與WS_POPUP風(fēng)格合用。 |
WS_CHILDWINDOW: | 與WS_CHILD相同。 |
WS_CLIPCHILDREN: | 當(dāng)在父窗口內(nèi)繪圖時(shí),排除子窗口區(qū)域。在創(chuàng)建父窗口時(shí)使用這個(gè)風(fēng)格。 |
WS_CLIPSIBLINGS: | 排除子窗口之間的相對(duì)區(qū)域,也就是,當(dāng)一個(gè)特定的窗口接收到WM_PAINT消息時(shí),WS_CLIPSIBLINGS 風(fēng)格將所有層疊窗口排除在繪圖之外,只重繪指定的子窗口。如果未指定WS_CLIPSIBLINGS風(fēng)格,并且子窗口是層疊的,則在重繪子窗口的客戶區(qū)時(shí),就會(huì)重繪鄰近的子窗口。 |
WS_DISABLED: | 創(chuàng)建一個(gè)初始狀態(tài)為禁止的子窗口。一個(gè)禁止?fàn)顟B(tài)的窗口不能接受來(lái)自用戶的輸入信息。 |
WS_DLGFRAME: | 創(chuàng)建一個(gè)帶對(duì)話框邊框風(fēng)格的窗口。這種風(fēng)格的窗口不能帶標(biāo)題條。 |
WS_GROUP: | 指定一組控制的第一個(gè)控制。這個(gè)控制組由第一個(gè)控制和隨后定義的控制組成,自第二個(gè)控制開(kāi)始每個(gè)控制,具有WS_GROUP風(fēng)格,每個(gè)組的第一個(gè)控制帶有WS_TABSTOP風(fēng)格,從而使用戶可以在組間移動(dòng)。用戶隨后可以使用光標(biāo)在組內(nèi)的控制間改變鍵盤(pán)焦點(diǎn)。 |
WS_HSCROLL: | 創(chuàng)建一個(gè)有水平滾動(dòng)條的窗口。 |
WS_ICONIC: | 創(chuàng)建一個(gè)初始狀態(tài)為最小化狀態(tài)的窗口。與WS_MINIMIZE風(fēng)格相同。 |
WS_MAXIMIZE: | 創(chuàng)建一個(gè)初始狀態(tài)為最大化狀態(tài)的窗口。 |
WS_MAXIMIZEBOX: | 創(chuàng)建一個(gè)具有最大化按鈕的窗口。該風(fēng)格不能與WS_EX_CONTEXTHELP風(fēng)格同時(shí)出現(xiàn),同時(shí)必須指定WS_SYSMENU風(fēng)格。 |
WS_OVERLAPPED: | 產(chǎn)生一個(gè)層疊的窗口。一個(gè)層疊的窗口有一個(gè)標(biāo)題條和一個(gè)邊框。與WS_TILED風(fēng)格相同。 |
WS_OVERLAPPEDWINDOW: | 創(chuàng)建一個(gè)具有WS_OVERLAPPED,WS_CAPTION,WS_SYSMENU - WS_THICKFRAME,WS_MINIMIZEBOX,WS_MAXIMIZEBOX風(fēng)格的層疊窗口,與WS_TILEDWINDOW風(fēng)格相同。 |
WS_POPUP: | 創(chuàng)建一個(gè)彈出式窗口。該風(fēng)格不能與WS_CHILD風(fēng)格同時(shí)使用。 |
WS_POPUPWINDOW: | 創(chuàng)建一個(gè)具有WS_BORDER,WS_POPUP,WS_SYSMENU風(fēng)格的窗口,WS_CAPTION和WS_POPUPWINDOW必須同時(shí)設(shè)定才能使窗口某單可見(jiàn)。 |
WS_SIZEBOX: | 創(chuàng)建一個(gè)可調(diào)邊框的窗口,與WS_THICKFRAME風(fēng)格相同。 |
WS_SYSMENU: | 創(chuàng)建一個(gè)在標(biāo)題條上帶有窗口菜單的窗口,必須同時(shí)設(shè)定WS_CAPTION風(fēng)格。 |
WS_TABSTOP: | 創(chuàng)建一個(gè)控制,這個(gè)控制在用戶按下Tab鍵時(shí)可以獲得鍵盤(pán)焦點(diǎn)。按下Tab鍵后使鍵盤(pán)焦點(diǎn)轉(zhuǎn)移到下一具有WS_TABSTOP風(fēng)格的控制。 |
WS_THICKFRAME: | 創(chuàng)建一個(gè)具有可調(diào)邊框的窗口,與WS_SIZEBOX風(fēng)格相同。 |
WS_TILED: | 產(chǎn)生一個(gè)層疊的窗口。一個(gè)層疊的窗口有一個(gè)標(biāo)題和一個(gè)邊框。與WS_OVERLAPPED風(fēng)格相同。 |
WS_TILEDWINDOW: | 創(chuàng)建一個(gè)具有WS_OVERLAPPED,WS_CAPTION,WS_SYSMENU, WS_THICKFRAME,WS_MINIMIZEBOX,WS_MAXIMIZEBOX風(fēng)格的層疊窗口。與WS_OVERLAPPEDWINDOW風(fēng)格相同。 |
WS_VISIBLE: | 創(chuàng)建一個(gè)初始狀態(tài)為可見(jiàn)的窗口。 |
WS_VSCROLL: | 創(chuàng)建一個(gè)有垂直滾動(dòng)條的窗口。 |
參數(shù)五:x 初始窗口左上角水平坐標(biāo)位置
- 指定窗口的初始水平位置(x 坐標(biāo))
- 對(duì)一個(gè)層疊或彈出式窗口,x 參數(shù)是屏幕坐標(biāo)系的窗口的左上角的初始 x 坐標(biāo)
- 對(duì)于子窗口,x 是子窗口左上角相對(duì)父窗口客戶區(qū)左上角的初始 x 坐標(biāo)
- 如果該參數(shù)被設(shè)為 CW_USEDEFAULT 則系統(tǒng)為窗口選擇缺省的左上角坐標(biāo)并忽略 y 參數(shù),CW_USEDEFAULT 只對(duì)層疊窗口有效,如果為彈出式窗口或子窗口設(shè)定,則 x 和 y 參數(shù)被設(shè)為零。
參數(shù)六: y 初始窗口左上角垂直坐標(biāo)位置
- 指定窗口的初始垂直位置(y 坐標(biāo))
- 對(duì)一個(gè)層疊或彈出式窗口,y 參數(shù)是屏幕坐標(biāo)系的窗口的左上角的初始 y 坐標(biāo)
- 對(duì)于子窗口,y 是子窗口左上角相對(duì)父窗口客戶區(qū)左上角的初始 y 坐標(biāo)
- 對(duì)于列表框,y 是列表框客戶區(qū)左上角相對(duì)父窗口客戶區(qū)左上角的初始 y 坐標(biāo)
- 如果層疊窗口是使用 WS_VISIBLE 風(fēng)格位創(chuàng)建的并且 x 參數(shù)被設(shè)為 CW_USEDEFAULT,則系統(tǒng)將忽略 y 參數(shù)
參數(shù)七:nWidth 初始窗口的寬度
- 以設(shè)備單元指明窗口的寬度
- 對(duì)于層疊窗口,nWidth 的值或是屏幕坐標(biāo)的窗口寬度或是 CW_USEDEFAULT
- 若 nWidth 是 CW_USEDEFAULT,則系統(tǒng)為窗口選擇一個(gè)默認(rèn)的高度和寬度(默認(rèn)寬度為從初始 x 坐標(biāo)開(kāi)始到屏幕的右邊界,缺省高度為從初始 y 坐標(biāo)開(kāi)始到目標(biāo)區(qū)域的頂部。),CW_USEDEFAULT 只對(duì)層疊窗口有效,如果為彈出式窗口和子窗口設(shè)定 CW_USEDEFAULT 標(biāo)志則 nWidth 和 nHeight 被設(shè)為零
參數(shù)八:nHeight 初始窗口的高度
- 以設(shè)備單元指明窗口的高度
- 對(duì)于層疊窗口,nHeight 是屏幕坐標(biāo)的窗口寬度
- 若 nWidth 被設(shè)為 CW_USEDEFAULT,則系統(tǒng)忽略 nHeight 參數(shù),自動(dòng)為 nWidth 和 nHeight 設(shè)置默認(rèn)參數(shù)
參數(shù)九: hWndParent 窗口的父窗口句柄
- 指向被創(chuàng)建窗口的父窗口或所有者窗口的句柄
- 若要?jiǎng)?chuàng)建一個(gè)子窗口或一個(gè)從屬窗口,需提供一個(gè)有效的窗口句柄
- 創(chuàng)建一個(gè)單純的消息窗口,可以提供 HWND_MESSAGE 或提供一個(gè)己存在的消息窗口的句柄
參數(shù)十: hMenu 窗口菜單句柄
- 指向窗口菜單句柄,或依據(jù)窗口風(fēng)格指明一個(gè)子窗口標(biāo)識(shí)
- 對(duì)于層疊或彈出式窗口,hMenu 指定窗口使用的菜單:如果使用了菜單類(lèi),則 hMenu 可以為 NULL
- 對(duì)于子窗口,hMenu 指定了該子窗口標(biāo)識(shí)(一個(gè)整型量),一個(gè)對(duì)話框使用這個(gè)整型值將事件通知父類(lèi)。應(yīng)用程序確定子窗口標(biāo)識(shí),這個(gè)值對(duì)于相同父窗口的所有子窗口必須是唯一的
參數(shù)十一: hInstance 應(yīng)用程序?qū)嵗浔?/strong>
- 與窗口相關(guān)聯(lián)的模塊實(shí)例的句柄
參數(shù)十二:lpParam窗口創(chuàng)建時(shí)附加參數(shù)
- 指向一個(gè)值的指針,該值傳遞給窗口 WM_CREATE 消息。該值通過(guò)在 IParam 參數(shù)中的 CREATESTRUCT 結(jié)構(gòu)傳遞
- 如果應(yīng)用程序調(diào)用 CreateWindow 創(chuàng)建一個(gè) MDI 客戶窗口,則 lpParam 必須指向一個(gè) CLIENTCREATESTRUCT 結(jié)構(gòu)
3.顯示窗口 ShowWindow
函數(shù)原型:
BOOL WINAPI ShowWindow(_In_ HWND hWnd,_In_ int nCmdShow
);
參數(shù)解釋:
hWnd [in]
類(lèi)型:HWND
窗戶的句柄。
nCmdShow [in]
輸入:int
控制窗口的顯示方式。如果啟動(dòng)應(yīng)用程序的程序提供STARTUPINFO結(jié)構(gòu),則在 應(yīng)用程序第一次調(diào)用ShowWindow時(shí)會(huì)忽略此參數(shù)。否則,第一次調(diào)用ShowWindow時(shí),該值應(yīng)該是WinMain函數(shù)在其nCmdShow參數(shù)中獲取的值 。在后續(xù)調(diào)用中,此參數(shù)可以是以下值之一。
返回值:
返回值
類(lèi)型:BOOL
如果窗口先前可見(jiàn),則返回值為非零。
如果窗口先前已隱藏,則返回值為零。
nCmdShow值 | 含義 |
---|---|
SW_FORCEMINIMIZE 11 | 最小化窗口,即使擁有窗口的線程沒(méi)有響應(yīng)。僅在最小化來(lái)自不同線程的窗口時(shí)才應(yīng)使用此標(biāo)志。 |
SW_HIDE 0 | 隱藏窗口并激活另一個(gè)窗口。 |
SW_MAXIMIZE 3 | 最大化指定的窗口。 |
SW_MINIMIZE 6 | 最小化指定的窗口并激活Z順序中的下一個(gè)頂級(jí)窗口。 |
SW_RESTORE 9 | 激活并顯示窗口。如果窗口最小化或最大化,系統(tǒng)會(huì)將其恢復(fù)到原始大小和位置。應(yīng)用程序應(yīng)在還原最小化窗口時(shí)指定此標(biāo)志。 |
SW_SHOW 5 | 激活窗口并以當(dāng)前大小和位置顯示它。 |
SW_SHOWDEFAULT 10 | 根據(jù)啟動(dòng)應(yīng)用程序的程序傳遞給CreateProcess函數(shù)的STARTUPINFO結(jié)構(gòu)中 指定的SW_值設(shè)置show狀態(tài) 。 |
SW_SHOWMAXIMIZED 3 | 激活窗口并將其顯示為最大化窗口。 |
SW_SHOWMINIMIZED 2 | 激活窗口并將其顯示為最小化窗口。 |
SW_SHOWMINNOACTIVE 7 | 將窗口顯示為最小化窗口。此值類(lèi)似于SW_SHOWMINIMIZED,但窗口未激活。 |
SW_SHOWNA8 | 以當(dāng)前大小和位置顯示窗口。此值類(lèi)似于SW_SHOW,但窗口未激活。 |
SW_SHOWNOACTIVATE 4 | 顯示最近大小和位置的窗口。此值類(lèi)似于SW_SHOWNORMAL,但窗口未激活。 |
SW_SHOWNORMAL 1 | 激活并顯示一個(gè)窗口。如果窗口最小化或最大化,系統(tǒng)會(huì)將其恢復(fù)到原始大小和位置。應(yīng)用程序應(yīng)在首次顯示窗口時(shí)指定此標(biāo)志。 |
4.更新窗口 UpdateWindow
如果窗口的更新區(qū)域不為空,則UpdateWindow函數(shù)通過(guò)向窗口發(fā)送WM_PAINT消息來(lái)更新指定窗口的客戶區(qū)域 。該函數(shù)將WM_PAINT消息直接發(fā)送到指定窗口的窗口過(guò)程,繞過(guò)應(yīng)用程序隊(duì)列。如果更新區(qū)域?yàn)榭?#xff0c;則不發(fā)送任何消息。
函數(shù)原型:
BOOL UpdateWindow(_In_ HWND hWnd
);
參數(shù)解釋:
參數(shù)
hWnd [in]
處理要更新的窗口。
返回值:
如果函數(shù)成功,則返回值為非零值。
如果函數(shù)失敗,則返回值為零。
5.顯示模式對(duì)話框MessageBox
顯示模式對(duì)話框,其中包含系統(tǒng)圖標(biāo),一組按鈕和簡(jiǎn)要的特定于應(yīng)用程序的消息,例如狀態(tài)或錯(cuò)誤信息。消息框返回一個(gè)整數(shù)值,指示用戶單擊的按鈕。
函數(shù)原型:
int WINAPI MessageBox(_In_opt_ HWND hWnd,_In_opt_ LPCTSTR lpText,_In_opt_ LPCTSTR lpCaption,_In_ UINT uType
);
參數(shù)解釋:
參數(shù)
hWnd
要?jiǎng)?chuàng)建的消息框的所有者窗口的句柄。如果此參數(shù)為NULL,則消息框沒(méi)有所有者窗口。
lpText
要顯示的消息。如果字符串由多行組成,則可以使用每行之間的回車(chē)符和/或換行符分隔行。
lpCaption
對(duì)話框標(biāo)題。如果此參數(shù)為NULL,則默認(rèn)標(biāo)題為“ 錯(cuò)誤”。
uType
對(duì)話框的內(nèi)容和行為。此參數(shù)可以是來(lái)自以下標(biāo)志組的標(biāo)志的組合。
消息框中顯示的按鈕值 | 含義 |
---|---|
MB_ABORTRETRYIGNORE 0x00000002L | 消息框包含三個(gè)按鈕:Abort,Retry和Ignore。 |
MB_CANCELTRYCONTINUE 0x00000006L | 消息框包含三個(gè)按鈕:取消,再試一次,繼續(xù)。使用此消息框類(lèi)型而不是MB_ABORTRETRYIGNORE。 |
MB_HELP 0x00004000L | 在消息框中添加“ 幫助”按鈕。當(dāng)用戶單擊“ 幫助”按鈕或按F1時(shí),系統(tǒng)會(huì)向所有者發(fā)送 WM_HELP消息。 |
MB_OK 0x00000000L | 消息框包含一個(gè)按鈕:確定。這是默認(rèn)值。 |
MB_OKCANCEL 0x00000001L | 消息框包含兩個(gè)按鈕:確定和取消。 |
MB_RETRYCANCEL 0x00000005L | 消息框包含兩個(gè)按鈕:重試和取消。 |
MB_YESNO 0x00000004L | 消息框包含兩個(gè)按鈕:是和否。 |
MB_YESNOCANCEL 0x00000003L | 消息框包含三個(gè)按鈕:是,否和取消。 |
消息框中顯示圖標(biāo) | 含義 |
---|---|
MB_ICONEXCLAMATION 0x00000030L | 消息框中會(huì)出現(xiàn)一個(gè)驚嘆號(hào)圖標(biāo)。 |
MB_ICONWARNING 0x00000030L | 消息框中會(huì)出現(xiàn)一個(gè)驚嘆號(hào)圖標(biāo)。 |
MB_ICONINFORMATION 0x00000040L | 消息框中將出現(xiàn)一個(gè)由圓圈中的小寫(xiě)字母i組成的圖標(biāo)。 |
MB_ICONASTERISK 0x00000040L | 消息框中將出現(xiàn)一個(gè)由圓圈中的小寫(xiě)字母i組成的圖標(biāo)。 |
MB_ICONQUESTION0x00000020L | 消息框中會(huì)出現(xiàn)一個(gè)問(wèn)號(hào)圖標(biāo)。不再推薦使用問(wèn)號(hào)消息圖標(biāo),因?yàn)樗荒芮宄乇硎咎囟?lèi)型的消息,并且因?yàn)樽鳛閱?wèn)題的消息的措辭可以應(yīng)用于任何消息類(lèi)型。此外,用戶可以將消息符號(hào)問(wèn)號(hào)與幫助信息混淆。因此,請(qǐng)勿在消息框中使用此問(wèn)號(hào)消息符號(hào)。系統(tǒng)繼續(xù)支持其僅包含向后兼容性。 |
MB_ICONSTOP 0x00000010L | 消息框中會(huì)出現(xiàn)一個(gè)停止標(biāo)志圖標(biāo)。 |
MB_ICONERROR 0x00000010L | 消息框中會(huì)出現(xiàn)一個(gè)停止標(biāo)志圖標(biāo)。 |
MB_ICONHAND 0x00000010L | 消息框中會(huì)出現(xiàn)一個(gè)停止標(biāo)志圖標(biāo)。 |
默認(rèn)按鈕 | 含義 |
---|---|
MB_DEFBUTTON1 0x00000000L | 第一個(gè)按鈕是默認(rèn)按鈕。MB_DEFBUTTON1是默認(rèn)值,除非指定了MB_DEFBUTTON2,MB_DEFBUTTON3或MB_DEFBUTTON4。 |
MB_DEFBUTTON2 0x00000100L | 第二個(gè)按鈕是默認(rèn)按鈕。 |
MB_DEFBUTTON3 0x00000200L | 第三個(gè)按鈕是默認(rèn)按鈕。 |
MB_DEFBUTTON4 0x00000300L | 第四個(gè)按鈕是默認(rèn)按鈕。 |
返回值:
返回代碼/值 | 描述 |
---|---|
IDABORT 3 | 的中止按鈕被選中。 |
IDCANCEL 2 | “ 取消”按鈕已被選中。 |
IDCONTINUE 11 | 該繼續(xù)按鈕被選中。 |
IDIGNORE 5 | “ 忽略”按鈕已被選中。 |
IDNO 7 | 在沒(méi)有按鈕被選中。 |
IDOK 1 | 在OK按鈕被選中。 |
IDRETRY 4 | 選擇了“ 重試”按鈕。 |
IDTRYAGAIN 10 | 選中了“ 再試一次”按鈕。 |
IDYES 6 | 該是按鈕被選中。 |
6.檢索消息GetMessage
從調(diào)用線程的消息隊(duì)列中檢索消息。該函數(shù)調(diào)度傳入的已發(fā)送消息,直到發(fā)布的消息可供檢索。
與GetMessage不同, PeekMessage函數(shù)不會(huì)在返回之前等待發(fā)布消息。
函數(shù)原型:
BOOL WINAPI GetMessage(_Out_ LPMSG lpMsg,_In_opt_ HWND hWnd,_In_ UINT wMsgFilterMin,_In_ UINT wMsgFilterMax
);
參數(shù)解釋:
lpMsg
指向MSG結(jié)構(gòu)的指針,該 結(jié)構(gòu)從線程的消息隊(duì)列接收消息信息。
hWnd
要檢索其消息的窗口句柄。該窗口必須屬于當(dāng)前線程。
如果hWnd為NULL,則GetMessage將檢索屬于當(dāng)前線程的任何窗口的消息,以及當(dāng)前線程的消息隊(duì)列中hwnd值為NULL的任何消息(請(qǐng)參閱 MSG結(jié)構(gòu))。因此,如果hWnd為NULL,則處理窗口消息和線程消息。
如果hWnd為-1,則GetMessage僅檢索當(dāng)前線程的hwnd值為NULL的消息隊(duì)列中的消息,即PostMessage發(fā)布的線程消息 (當(dāng)hWnd參數(shù)為NULL時(shí))或PostThreadMessage。
wMsgFilterMin
要檢索的最低消息值的整數(shù)值。使用WM_KEYFIRST(0x0100)指定第一個(gè)鍵盤(pán)消息或使用WM_MOUSEFIRST(0x0200)指定第一個(gè)鼠標(biāo)消息。
在此處和wMsgFilterMax中使用 WM_INPUT僅指定WM_INPUT消息。
如果wMsgFilterMin和wMsgFilterMax都為零,則GetMessage將返回所有可用消息(即,不執(zhí)行范圍過(guò)濾)。
wMsgFilterMax
要檢索的最高消息值的整數(shù)值。使用WM_KEYLAST指定最后一個(gè)鍵盤(pán)消息,或使用WM_MOUSELAST指定最后一條鼠標(biāo)消息。
在此處和wMsgFilterMin中使用 WM_INPUT僅指定WM_INPUT消息。
如果wMsgFilterMin和wMsgFilterMax都為零,則GetMessage將返回所有可用消息(即,不執(zhí)行范圍過(guò)濾)。
返回值:
類(lèi)型:BOOL
如果函數(shù)檢索WM_QUIT以外的消息 ,則返回值為非零值。
如果函數(shù)檢索 WM_QUIT消息,則返回值為零。
如果有錯(cuò)誤,則返回值為-1。
7.翻譯消息TranslateMessage
將虛擬密鑰消息轉(zhuǎn)換為字符消息。字符消息被發(fā)布到調(diào)用線程的消息隊(duì)列,以便在線程下次調(diào)用GetMessage或 PeekMessage函數(shù)時(shí)讀取 。
函數(shù)原型:
BOOL WINAPI TranslateMessage(_In_ const MSG *lpMsg
);
參數(shù)解釋:
lpMsg
類(lèi)型:const MSG *
指向MSG結(jié)構(gòu)的指針,該 結(jié)構(gòu)包含使用GetMessage或 PeekMessage函數(shù)從調(diào)用線程的消息隊(duì)列中檢索的消息信息 。
返回值:
類(lèi)型:BOOL
如果消息被轉(zhuǎn)換(即,字符消息被發(fā)布到線程的消息隊(duì)列中),則返回值非零。
如果消息是 WM_KEYDOWN, WM_KEYUP, WM_SYSKEYDOWN或 WM_SYSKEYUP,則無(wú)論轉(zhuǎn)換如何,返回值都是非零的。
如果消息未被轉(zhuǎn)換(即,字符消息未發(fā)布到線程的消息隊(duì)列中),則返回值為零。
8.傳遞消息 DispatchMessage
該函數(shù)分發(fā)一個(gè)消息給窗口程序。通常消息從GetMessage函數(shù)獲得或者TranslateMessage函數(shù)傳遞的。消息被分發(fā)到回調(diào)函數(shù)(過(guò)程函數(shù)),作用是消息傳遞給操作系統(tǒng),然后操作系統(tǒng)去調(diào)用我們的回調(diào)函數(shù),也就是說(shuō)我們?cè)诖绑w的過(guò)程函數(shù)中處理消息。
函數(shù)原型:
LONG DispatchMessage(CONST MSG*lpmsg);
參數(shù)解釋:
lpmsg:指向含有消息的MSG結(jié)構(gòu)的指針。
返回值:
返回值是窗口程序返回的值。盡管返回值的含義依賴于被調(diào)度的消息,但返回值通常被忽略。
三、補(bǔ)充
1. WIndow API 函數(shù)大全(方便查找):
鏈接:https://blog.csdn.net/qq_27361833/article/details/78192526
2.CreateWindowEx和CreateWindow的區(qū)別
鏈接:https://blog.csdn.net/ohmygol/article/details/6135897
作者說(shuō):
從中午一直寫(xiě)到現(xiàn)在,晚飯都還沒(méi)有呢,我發(fā)現(xiàn)自己總結(jié)再寫(xiě)出來(lái)后,這樣記得更牢固,效率高了很多。最大的好處就是方便自己以后查找相關(guān)知識(shí)。
這篇知識(shí)總結(jié)是windows 應(yīng)用程序編程和win32的敲門(mén)磚,認(rèn)真看完理解后,能很快進(jìn)入windows 應(yīng)用程序的編程。
注:下一篇將是VS的Win32 應(yīng)用程序創(chuàng)建,用于補(bǔ)充這篇未涉及的內(nèi)容。
參考1:Win32學(xué)習(xí)筆記 - CreateWindowEx()函數(shù)
參考2:CreateWindow函數(shù)詳解
參考3:msdn官網(wǎng)
參考4:《數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)編程實(shí)例----基于Win32 API編程 厲旭杰、趙漢理編著