文章首發(fā)于:My Blog 歡迎大佬們前來逛逛
1. main函數(shù)入口點(diǎn)
win32的main函數(shù)入口點(diǎn)為 WinMain或者wWinMain,他們包含四個(gè)參數(shù):
int __clrcall WinMain(
[in] HINSTANCE hInstance,
[in] HINSTANCE hPrevInstance,
[in] LPSTR lpCmdLine,
[in] int nShowCmd
);
其中:
- hInstance:應(yīng)用程序當(dāng)前窗口的實(shí)例句柄
- hPrevInstance:應(yīng)用程序上一個(gè)窗口的實(shí)例句柄
- lpCmdLine:應(yīng)用程序的命令行
- nShowcmd:控制窗口的顯示方式
其中wWinMain與WinMain的區(qū)別是 wWinMain適用于多字節(jié)字符集,而WinMian適用于unicode字符集。
其中第三個(gè)參數(shù)WinMain是LPSTR類型:
typedef char CHAR;
但是wWinMain是LPWSTR類型:
typedef wchar_t WCHAR;
2. 窗口函數(shù)六部曲
2.1 注冊(cè)窗口類
ATOM RegisterClassExA(
[in] const WNDCLASSEXA *unnamedParam1
);
其中:
- unnamedParam1:一個(gè)WNDCLASSEXA結(jié)構(gòu)體指針變量,這個(gè)結(jié)構(gòu)包含了我們所創(chuàng)建對(duì)象的窗口的屬性信息
struct tagWNDCLASSEXW {
UINT cbSize;
/* Win 3.x */
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCWSTR lpszMenuName;
LPCWSTR lpszClassName;
/* Win 4.0 */
HICON hIconSm;
}
其中:比較重要的幾個(gè)參數(shù):
- hInstance:窗口的示例句柄,就是我們的WinMain包含的hInstance參數(shù)
- lpszClassName:窗口類名
- cbSize:結(jié)構(gòu)體的大小,必須指定其為sizeof(WNDCLASSEX)
- style:窗口類的樣式,設(shè)置水平與垂直重繪:CS_HREDRAW | CS_VREDRAW
- hbrBackground:窗口回調(diào)函數(shù),其接受一個(gè)WNDPROC的參數(shù),WNDPROC是一個(gè)typedef定義的函數(shù)指針,其中包含四個(gè)參數(shù):HWND UINT WPARAMS LPARAMS。
//回調(diào)函數(shù)m_WNDPROC:lpfnWndProc的數(shù)據(jù)類型
LRESULT CALLBACK m_WNDPROC(HWND hwnd, UINT msg, WPARAM wParams, LPARAM lParams) {
return DefWindowProc(hwnd, msg, wParams, lParams);
}//使用return DefWindowProc作為返回值
WNDCLASSEX mWinC = {NULL};
mWinC.cbSize = sizeof(WNDCLASSEX);
mWinC.hInstance = hInstance;
mWinC.lpszClassName = "我的第一個(gè)窗口";
mWinC.hbrBackground = (HBRUSH)NULL; //畫刷
mWinC.lpfnWndProc = m_WNDPROC;
mWinC.style = CS_HREDRAW | CS_VREDRAW;
//注冊(cè)窗口類
RegisterClassEx(&mWinC);
2.2 創(chuàng)建窗口
HWND CreateWindowExA(
DWORD dwExStyle,
LPCSTR lpClassName,
LPCSTR lpWindowName,
DWORD dwStyle,
int X,
int Y,
int nWidth,
int nHeight,
HWND hWndParent,
HMENU hMenu,
HINSTANCE hInstance,
LPVOID lpParam);
其中:重要的參數(shù)有:
- dwExStyle:設(shè)置為mWinC的style即可。
- lpClassName,lpWindowName:類名與窗口名
- dwStyle:窗口的樣式,設(shè)置為WS_OVERLAPPEDWINDOW即可。
- x y Width Height:窗口的大小和寬高
- hInstance:窗口的實(shí)例句柄。
HWND hwnd = CreateWindowEx(mWinC.style,
mWinC.lpszClassName,
"First Window",
WS_OVERLAPPEDWINDOW,
100, 100, 600, 600,
NULL, NULL,
mWinC.hInstance,
NULL);
if (!hwnd) return false;
其返回值為HWND,表示創(chuàng)建了一個(gè)窗口句柄hwnd,如果其為NULL,則創(chuàng)建失敗。
2.3 顯示窗口
BOOL ShowWindow(
[in] HWND hWnd,
[in] int nCmdShow
);
- hwnd:創(chuàng)建的窗口實(shí)例句柄
- nCmdshow:控制窗口的顯示方式
ShowWindow(hwnd, SW_SHOW);
2.4 刷新窗口
UpdateWindow(hwnd);
2.5 消息循環(huán)
接受消息
//從調(diào)用線程的消息隊(duì)列中檢索消息。
BOOL GetMessage(
[out] LPMSG lpMsg,
[in, optional] HWND hWnd,
[in] UINT wMsgFilterMin,
[in] UINT wMsgFilterMax
);
參數(shù):
- lpMsg:指向MSG的指針,我們需要?jiǎng)?chuàng)建一個(gè)MSG類型的變量表示消息變量。
處理消息
//將虛擬密鑰消息轉(zhuǎn)換為字符消息。
BOOL TranslateMessage(
[in] const MSG *lpMsg
);
- lpMsg:消息指針
發(fā)送消息
//將消息調(diào)度到窗口過程。
LRESULT DispatchMessage(
[in] const MSG *lpMsg
);
- 消息指針
// 消息循環(huán)
MSG msg{ NULL };
while (true) {
//接收消息
GetMessage(&msg, NULL, NULL, NULL);
//處理消息
TranslateMessage(&msg);
//發(fā)送消息
DispatchMessage(&msg);
}
2.6 消息處理函數(shù)
消息處理函數(shù)即:WNDPROC
我們已經(jīng)在 2.1 注冊(cè)窗口類時(shí)處理過了。
//消息處理函數(shù)
LRESULT CALLBACK m_WNDPROC(HWND hwnd, UINT msg, WPARAM wParams, LPARAM lParams) {
return DefWindowProc(hwnd, msg, wParams, lParams);
}
...
...
wMinC.lpfnWndProc=m_WNDPROC
...
...
3. 完整代碼
由于我們運(yùn)行的時(shí)Win32程序,我們應(yīng)該在:
項(xiàng)目 - 屬性 - 連接器 - 系統(tǒng) - 子系統(tǒng)
文章來源:http://www.zghlxwxcb.cn/news/detail-409394.html
把控制臺(tái)改為窗口文章來源地址http://www.zghlxwxcb.cn/news/detail-409394.html
#include <Windows.h>
//回調(diào)函數(shù)
LRESULT CALLBACK m_WNDPROC(HWND hwnd, UINT msg, WPARAM wParams, LPARAM lParams) {
return DefWindowProc(hwnd, msg, wParams, lParams);
}
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR cCmdLine,
int nShowCmd
) {
// 注冊(cè)窗口類
WNDCLASSEX mWinC = {NULL};
mWinC.cbSize = sizeof(WNDCLASSEX);
mWinC.hInstance = hInstance;
mWinC.lpszClassName = "我的第一個(gè)窗口";
mWinC.hbrBackground = (HBRUSH)NULL;
mWinC.lpfnWndProc = m_WNDPROC;
mWinC.style = CS_HREDRAW | CS_VREDRAW;
RegisterClassEx(&mWinC);
// 創(chuàng)建窗口類
HWND hwnd = CreateWindowEx(mWinC.style,
mWinC.lpszClassName,
"First Window",
WS_OVERLAPPEDWINDOW,
100, 100, 600, 600,
NULL, NULL,
mWinC.hInstance,
NULL);
if (!hwnd) return false;
// 顯示窗口類
ShowWindow(hwnd, SW_SHOW);
// 刷新窗口類
UpdateWindow(hwnd);
// 消息循環(huán)
MSG msg{ NULL };
while (true) {
//接收消息
GetMessage(&msg, NULL, NULL, NULL);
//處理消息
TranslateMessage(&msg);
//發(fā)送消息
DispatchMessage(&msg);
}
return true;
}
到了這里,關(guān)于windows編程(1)-第一個(gè)窗口程序的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!