Windows核心程式設計第01天 建立視窗
阿新 • • 發佈:2020-07-21
1.入口函式WinMain,該函式的功能是被系統呼叫,作為一個32位應用程式的入口點。
int WINAPI WinMain( HINSTANCE hInstance, //應用程式當前例項的控制代碼。
HINSTANCE hPrevInstance, //應用程式的先前例項的控制代碼。對於同一個程式開啟兩次,出現兩個視窗第一次開啟的視窗就是先前例項的視窗。對於一個32位程式,該引數總為NULL。
LPSTR lpCmdLine, //指向應用程式命令列的字串的指標,不包括執行檔名。pCmdLine是一個以空終止的字串,指定傳遞給應用程式的命令列引數。
intnCmdShow) //指明視窗如何顯示。
2.WNDCLASS,該結構包含一個視窗類的全部資訊,也是Windows程式設計中使用的基本資料結構之一,應用程式通過定義一個視窗類確定視窗的屬性
typedef struct _WNDCLASS { UINT style; // 視窗型別 WNDPROC lpfnWndProc; //視窗處理函式 int cbClsExtra; //視窗擴充套件 int cbWndExtra; //視窗例項擴充套件 HINSTANCE hInstance; //例項控制代碼 HICON hIcon; //視窗的最小化圖示 HCURSOR hCursor; //視窗滑鼠游標 HBRUSH hbrBackground; //視窗背景色 LPCTSTR lpszMenuName; //視窗選單 LPCTSTR lpszClassName;// 視窗類名 } WNDCLASS, *LPWNDCLASS;
初始化程式碼如下:
WNDCLASS wndclass;
wndclass.style = CS_HREDRAW | CS_VREDRAW; //設定當水平長度或垂直長度改變或移動視窗時,重畫整個視窗 wndclass.lpfnWndProc = (WNDPROC)WinSunProc; //設定WinSunProc為視窗處理函式 wndclass.cbClsExtra= 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; // wndclass.hIcon = LoadIcon(NULL, IDI_ERROR); //設定圖示為系統的錯誤圖示 wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); //設定滑鼠游標為系統箭頭游標 wndclass.hbrBackground = (HBRUSH)GetStockObject(DKGRAY_BRUSH); //設定背景畫刷為深灰色 wndclass.lpszMenuName = NULL; //無視窗選單 wndclass.lpszClassName = L"WeiXin"; //設定視窗類名
3.註冊視窗
RegisterClass(&wndclass);
4.建立視窗
HWND hwnd; hwnd = CreateWindow(L"WeiXin", //指定視窗類名,這可以是任何用函式RegisterClass註冊的類名,或是任何預定義的控制類名。
L"測試", //設定視窗名字
WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX, //設定無最大化(~WS_MAXIMIZEBOX表示取反最大化視窗)視窗風格
100, 100, 640, 480, //視窗初始位置設定為(100,100),大小為640x480
NULL, //無父視窗設為NULL
NULL, //無選單設為NULL
hInstance, //視窗例項控制代碼
NULL); //視窗建立資料
5.顯示並更新視窗
ShowWindow(hwnd, SW_SHOWNORMAL); //設定正常顯示
UpdateWindow(hwnd);
6.訊息迴圈(保證視窗一直顯示)
MSG msg; while (GetMessage(&msg, NULL, 0, 0)) //設定NULL表示接收所有視窗訊息 { TranslateMessage(&msg); DispatchMessage(&msg); }
完整程式碼如下:
#include <Windows.h> #include <stdio.h> LRESULT CALLBACK WinSunProc(HWND hwnd,UINT uMsg,WPARAM wParam,LPARAM lParam) { return DefWindowProc(hwnd, uMsg, wParam, lParam); } int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow) { WNDCLASS wndclass; wndclass.style = CS_HREDRAW | CS_VREDRAW; wndclass.lpfnWndProc = (WNDPROC)WinSunProc; wndclass.cbClsExtra = 0; wndclass.cbWndExtra = 0; wndclass.hInstance = hInstance; wndclass.hIcon = LoadIcon(NULL, IDI_ERROR); wndclass.hCursor = LoadCursor(NULL, IDC_ARROW); wndclass.hbrBackground = (HBRUSH)GetStockObject(DKGRAY_BRUSH); wndclass.lpszMenuName = NULL; wndclass.lpszClassName = L"WeiXin"; RegisterClass(&wndclass); HWND hwnd; hwnd = CreateWindow(L"WeiXin", L"測試", WS_OVERLAPPEDWINDOW & ~WS_MAXIMIZEBOX, 100, 100, 640, 480, NULL, NULL, hInstance, NULL); ShowWindow(hwnd, SW_SHOWNORMAL); UpdateWindow(hwnd); MSG msg; while (GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return 0; }