C++呼叫API初步建立Windows視窗程式
首先在進行介紹前,先介紹一下api,個人理解,api是在windows.h中提供的一些封裝好的函式。
建立一個視窗程式的一般步驟是先註冊一個視窗類名,然後再建立一個視窗,傳遞資訊進行處理(視窗的操作都是通過資訊傳遞來實現的)
下面介紹幾個要用到api函式
RegistetClass() //該函式只有一個引數,是一個指向WNDCLASS結構的指標
//該函式用來註冊一個視窗類
WNDCLASS:一個包含了視窗類的全部資訊的資料結構
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;
CreateWindowEx()//該函式有多個引數,用來建立一個視窗
HWND CreateWindowEx( DWORD DdwExStyle, //視窗的擴充套件風格 LPCTSTR lpClassName, //指向註冊類名的指標 LPCTSTR lpWindowName, //指向視窗名稱的指標 DWORD dwStyle, //視窗風格 int x, //視窗的水平位置 int y, //視窗的垂直位置 int nWidth, //視窗的寬度 int nHeight, //視窗的高度 HWND hWndParent, //父視窗的控制代碼 HMENU hMenu, //選單的控制代碼或是子視窗的識別符號 HINSTANCE hInstance, //應用程式例項的控制代碼 LPVOID lpParam //指向視窗的建立資料 );
ShowWindow(hwnd,bool)//該函式用來顯示/隱藏視窗
接下來介紹一個結構體MSG,該結構體用來儲存視窗傳遞的訊息
typedef struct tagMSG {
HWND hwnd;
UINT message;
WPARAM wParam;
LPARAM lParam;
DWORD time;
POINT pt;
} MSG;
GetMessage() //該函式用來從呼叫該函式的執行緒中取回一個與指定視窗相關聯和由PostThreadMessage寄送的執行緒訊息的訊息,並將之從訊息佇列中刪除,該函式會一直等到有訊息取出才返回
GetMessage(
LPMSG lpMsg,//指向MSG結構的指標,該結構從執行緒的訊息佇列裡接收訊息資訊
HWND hWnd,//取得其訊息的視窗的控制代碼。當其值取NULL時,GetMessage為任何屬於呼叫執行緒的視窗檢索訊息,執行緒訊息通過PostThreadMessage寄送給呼叫執行緒。
UINT wMsgFilterMin,//指定被檢索的最小訊息值的整數。可省略
UINT wMsgFilterMax//指定被檢索的最大訊息值的整數。可省略
)
//返回值:如果函式取得WM_QUIT之外的其他訊息,返回非零值。如果函式取得WM_QUIT訊息,返回值是零。如果出現了錯誤,返回值是-1
TranslateMessage(&MSG)//該函式將虛擬鍵訊息轉換為字元資訊。字元訊息將被寄送到呼叫執行緒的訊息佇列裡
DispatchMessage(&MSG)//該函式分發一個訊息給過程函式 lpfnWndProc,然後視窗進入訊息處理階段。
DefWindowProc(hwnd,MSG,lParam,wParam)//該函式用來處理所不想處理的訊息,確保每個訊息得到處理
下面介紹一個函式
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);//該函式就是處理訊息的過程函式(回撥函式)
下面是程式碼
#include<windows.h>
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
HINSTANCE hinhwnd = 0;
HWND editor = 0;
int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE, PWSTR pCmdLine, int nCmdeShow)
{
const wchar_t CLASS_NAME[] = L"test";//類名
WNDCLASS wc = {};
wc.style = 0;//預設
wc.cbClsExtra = 0;//預設
wc.cbWndExtra = 0;//預設
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);//預設
wc.hCursor = LoadCursor(NULL, IDC_ARROW);//箭頭游標
wc.hbrBackground = (HBRUSH)(GetStockObject(WHITE_BRUSH));//白色刷子
wc.lpszMenuName = NULL;//無選單
wc.lpfnWndProc = WindowProc;//訊息處理函式
hinhwnd=wc.hInstance = hInstance;
wc.lpszClassName = CLASS_NAME;
RegisterClass(&wc);
HWND hwnd = CreateWindowEx(
0,
CLASS_NAME,
L"test",//標題
WS_OVERLAPPEDWINDOW,//一般風格
CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,//預設位置及尺寸
NULL,
NULL,
hInstance,
NULL
);
if (hwnd == NULL)
return 0;
ShowWindow(hwnd,1);
MSG msg = {};
while (GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
switch (uMsg)
{
case WM_DESTROY:
{
PostQuitMessage(0);
return 0;
}
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
FillRect(hdc, &ps.rcPaint, (HBRUSH)(COLOR_WINDOW + 1));
EndPaint(hwnd, &ps);
}
return 0;
}
return DefWindowProc(hwnd, uMsg, wParam, lParam);
}
以上是執行效果,如果需要或許更多詳細的API使用方法可以參考MSDN(雖然我一般選擇百度)
個人建議,但是如果實在實在實在實在是搞不懂每個引數每句程式碼的意義的話,不要鑽牛角尖,可以通過多接觸這方面的知識後再來理解,畢竟這個只是第一個程式。
該程式執行系統為win10/執行工具為Visual Studio 2015