Win32 程序?qū)W習(xí)筆記_創(chuàng)建窗口
#include <windows.h>
#include <tchar.h>??? //用于寬字符TCHAR操作
?
//消息處理函數(shù)的前置聲明
LRESULT CALLBACK WindowsProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
?
//主函數(shù)WinMain()
int WINAPI WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance,_In_ LPSTR CmdLine, _In_ int nShowCmd)
{
???????? TCHAR clsName[] = TEXT("MyWindowsClass");??? //窗口類名稱
????????
???????? //設(shè)計窗口類
???????? WNDCLASSEX wc;
???????? wc.cbSize = sizeof(WNDCLASSEX);????????????????????????????????????????????? //結(jié)構(gòu)體的大小
???????? wc.style = CS_HREDRAW | CS_VREDRAW;????????????????????????????? //指定大小改變就水平|垂直重畫
???????? wc.lpfnWndProc = WindowsProc;????????????????????????????????????????? //窗口回調(diào)函數(shù)指針
???????? wc.cbClSEXtra = 0;???????????????????????????????????????????????????????????????????? //類的額外內(nèi)存
???????? wc.cbWndExtra = 0;?????????????????????????????????????????????????????????????????????????? //窗口的額外內(nèi)存
???????? wc.hInstance = hInstance;?????????????????????????????????????????????????????? //實例句柄
???????? wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);?????????????????? //使用預(yù)定義圖標(biāo)(大圖標(biāo))
???????? wc.hCursor = LoadCursor(NULL, IDC_ARROW);???????????? //使用預(yù)定義光標(biāo)
???????? wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);????? //使用系統(tǒng)顏色
???????? wc.lpszMenuName = NULL;??????????????????????????????????????????????????????????? //的指定菜單
???????? wc.lpszClassName = clsName;??????????????????????????????????????????????? //窗口類的名稱
???????? wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);?? //類的小圖標(biāo)
?
???????? if (!RegisterClasSEX(&wc))??????? //注冊窗口類
?????????????????? return 0;
?
???????? //創(chuàng)建窗口
???????? HWND hWnd = ::CreateWindowExW(
?????????????????? 0,?????????????????????????????????????????????????????????????????????? //dwExStyle, 擴(kuò)展樣式
?????????????????? clsName,???????????????????????????????????????????????? //lpClassName, 窗口類名
?????????????????? L"我的應(yīng)用程序",??????????????????????????????? //lpWindowName, 窗口顯示的標(biāo)題
?????????????????? WS_OVERLAPPEDWINDOW,??????????????????????????? //dwStyle, 窗口風(fēng)格
?????????????????? CW_USEDEFAULT,/*200*/?????????????????????? //X, 初始X坐標(biāo)
?????????????????? CW_USEDEFAULT,/*150*/?????????????????????? //Y, 初始Y坐標(biāo)
?????????????????? CW_USEDEFAULT,/*800*/?????????????????????? //nWith, 寬度
?????????????????? CW_USEDEFAULT,/*500*/?????????????????????? //nHeight, 高度
?????????????????? NULL,????????????????????????????????????????????????????????????? //hWndParent, 父窗口句柄
?????????????????? NULL,????????????????????????????????????????????????????????????? //hMenu, 菜單句柄
?????????????????? hInstance,??????????????????????????????????????????????????????? //hInstance, 實例句柄
?????????????????? NULL);???????????????????????????????????????????????????????????? //lParam, 用戶數(shù)據(jù)
?
???????? if (hWnd == NULL)
???????? {
?????????????????? ::MessageBox(hWnd, TEXT("創(chuàng)建窗口出錯!"), TEXT("error"), MB_OK);
?????????????????? return -1;
???????? }
?
?
???????? //顯示與更新窗口
???????? ShowWindow(hWnd, SW_SHOW);
???????? UpdateWindow(hWnd);
?
???????? //消息循環(huán)
?
???????? MSG msg;
???????? while (GetMessage(&msg, NULL, 0, 0))
???????? {
?????????????????? TranslateMessage(&msg);????????????????? //轉(zhuǎn)化鍵盤消息
?????????????????? DispatchMessage(&msg);?????????????????? //將消息發(fā)送到相應(yīng)的窗口函數(shù)
???????? }
?
???????? return msg.wParam; //GetMessaage 返回FALSE 時程序結(jié)束
}
?
?
LRESULT CALLBACK WindowsProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
???????? TCHAR szText[] = TEXT("最簡單的窗口程序!");
???????? switch (uMsg)
???????? {
?????????????????? case WM_PAINT:
?????????????????? {
??????????????????????????? HDC hdc;
??????????????????????????? PAINTSTRUCT ps;
?
??????????????????????????? //使無效的客戶區(qū)變的有效,并取得設(shè)備環(huán)境句柄
??????????????????????????? hdc = ::BeginPaint(hWnd, &ps);
??????????????????????????? //顯示文字
??????????????????????????? ::TextOut(hdc, 10, 10, szText, _tcslen(szText));
?
??????????????????????????? ::EndPaint(hWnd, &ps);
??????????????????????????? return 0;
?????????????????? }
?
????????
?????????????????? case WM_DESTROY:????? //正在銷毀窗口
??????????????????????????? //向消息隊列發(fā)送一個WM_QUIT消息,使GetMessage函數(shù)返回0
??????????????????????????? ::PostQuitMessage(0);
??????????????????????????? return 0;
???????? }
???????? //不處理的消息交給系統(tǒng)默認(rèn)處理
???????? return ::DefWindowProc(hWnd, uMsg, wParam, lParam);

dwStyle:??? 窗口風(fēng)格樣式
?WS_BORDER???????????? 創(chuàng)建有單邊框的窗口
??WS_CAPTION??????????? 有標(biāo)題框的窗口,包括WS_BORDER
??WS_CHILD???????????????? 創(chuàng)建子窗口,不能和WS_POPUP合用
??WS_DISABLED????????? 創(chuàng)建一個初始禁止的子窗口
?WS_DLGFRAME?????? 帶對話框風(fēng)格的窗口,不帶標(biāo)題欄
??WS_HSCROLL??????????? 有水平滾動條
?WS_VSCROLL??????????? 有垂直滾動條
?WS_ICONIC?????????????? 初始化時最小化狀態(tài)的窗口,與WS_MINIMIZE相同
WS_MAXIMIZE???????? 最大化按鈕,不能和WS_EX_CONTESTHELP合用,同時必須指定WS_SYSMENU風(fēng)格
WS_OVERLAPPED??? 層疊窗口,有標(biāo)題,邊框.與WS_TILED相同
WS_OVERLAPPEDWINDOW??? 創(chuàng)建有WS_OVERLAPPED,WS_CAPTION,
??????????????????????????????????????????????????????? WS_SYSMENU,WS_THICKFRAME,WS_MINIMIZEBOX,WS_MAXMIZEBOX風(fēng)格的窗口
WS_POPUP??????????????? 彈出式窗口,不能與WS_CHILD合用
WS_POPUWINDOW???????? 創(chuàng)建有,WS_BORDER,WS_POPUP,WS_SYSMENU,風(fēng)格的窗口,
?????????????????????????????????????????????? WS_CAPTION與WS_POPUWINDOW同時設(shè)定才能使菜單可見
WS_SIZEBOX???????????? 可調(diào)大小的窗口,與WS_THICKFRAME相同
WS_THICKFRAME??? 可高大小的窗口,
WS_VISIBLE?????????????? 初始可見的窗口
消息結(jié)構(gòu)體:
typedef struct tagMSG {
???????? HWND??????? hwnd;?????????????? //消息要發(fā)送的窗口句柄
???????? UINT??????? message;??? ????????//消息標(biāo)識,以WM_開頭的預(yù)定義值
???????? WPARAM????? wParam;????????//消息參數(shù)1
???????? LPARAM????? lParam;??????????? //消息參數(shù)2
???????? DWORD?????? time;???????????????? //消息放入隊列的時間
???????? POINT?????? pt;??????????????????????? //消息放入隊列時鼠標(biāo)的位置
#ifdef _MAC
???????? DWORD?????? lPrivate;? //附加消息,Win32不可用
#endif
} MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG;