1. 程式人生 > 實用技巧 >Windows程式設計-圖形化框架

Windows程式設計-圖形化框架

Windows程式設計-圖形化框架

建立視窗

1 建立一個視窗類-WNDCLASS

typedef struct tagWNDCLASSA {
UINT style;
WNDPROC lpfnWndProc;
int cbClsExtra;
int cbWndExtra;
HINSTANCE hInstance;
HICON hIcon;
HCURSOR hCursor;
HBRUSH hbrBackground;
LPCSTR lpszMenuName;
LPCSTR lpszClassName;
} WNDCLASSA, *PWNDCLASSA, *NPWNDCLASSA, *LPWNDCLASSA;

其中的第二個引數lpfnWndProc,和lpszClassName必須要有

    WNDCLASS myclass = { 0 };
WCHAR lpszClassName[] = TEXT("Sm7");
myclass.lpszClassName = lpszClassName;
myclass.lpfnWndProc = NULL;

2 註冊視窗類-RegisterClass

ATOM RegisterClass(
const WNDCLASS *lpWndClass
);

引數

引數表明的是自己建立的視窗類的指標

返回值

如果函式成功,則返回值是一個類原子,它唯一地標識正在註冊的類。這個類原子只有由具體的Windows函式來操作

如果建立失敗則返回值為0

3 建立視窗-CreateWindow

void CreateWindowW(
lpClassName,
lpWindowName,
dwStyle,
x,
y,
nWidth,
nHeight,
hWndParent,
hMenu,
hInstance,
lpParam
);

引數

第一個引數表示剛剛註冊的視窗的類名

第二個引數表示視窗的名字

第三個引數表示視窗的風格,這個有很多的巨集定義

第四個和第五個引數表示視窗的初始位置

第六個和第七個引數表示視窗的寬度和高度

第七個引數 hWndParent表示視窗的父視窗或所有者的控制代碼

第八個引數hMenu表示視窗的選單的控制代碼

第九個引數hInstance表示WINMAIN函式的例項控制代碼

第十個引數lpParam 是用來呼叫回撥函式的引數

    WCHAR My_Window_Name[] = L"sm7的視窗";
LPCWSTR Point_My_Window_Name = My_Window_Name;
CreateWindowW(
lpszClassName,
Point_My_Window_Name,
WS_BORDER,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
100,
NULL,
NULL,
NULL,
NULL
);

返回值

如果成功則返回視窗的控制代碼

如果失敗則返回NULL

4 顯示視窗-ShowWindow

BOOL ShowWindow(
HWND hWnd,
int nCmdShow
);

引數

第一個hWnd表示視窗控制代碼

第二個引數nCmdShow表示顯示的風格

訊息

windows系統是基於訊息的作業系統

每個視窗都在處理訊息,所有的操作都是有操作響應後的操作

產生訊息的機制叫做訊息迴圈,處理訊息的視窗呼叫回撥函式來處理訊息

訊息的產生

訊息的分類

1 user主動產生的訊息

2 Windows系統自己產生的訊息

3 應用程式自己的訊息

4 其他程式產生的訊息

應用程式如何接受訊息

windows有系統訊息佇列,每個GUI程式程式也都有自己的訊息佇列,系統訊息佇列負責將系統發給不同GUI程式的訊息佇列。應用程式獲取本程式訊息佇列的資訊,然後將訊息發給訊息處理函式來處理訊息。

訊息的API函式

GetMessage 從訊息佇列中取出1個訊息
BOOL GetMessage(
LPMSG lpMsg,
HWND hWnd,
UINT wMsgFilterMin,
UINT wMsgFilterMax
);

引數:

第一個lpMsg表示訊息的結構體的指標,用的是一個MSG的結構體

第二個引數hWnd表示獲取的訊息的視窗的控制代碼,這個控制代碼必須屬於當前執行緒

第三個和第四個引數表示獲取的訊息範圍,第三個表示訊息最低整數值,第四個表示最高整數值,如果都為0表示獲取所有的訊息。

DispatchMessage 將訊息傳送給訊息處理函式
LRESULT DispatchMessage(
const MSG *lpMsg
);
訊息處理函式

這裡的函式就是你自己的類裡面的lpfnWndProc函式,這個函式需要在類的時候就把引數傳進去,訊息處理函式有自己的格式

LRESULT CALLBACK WindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);

第一個引數表示的是視窗的控制代碼,

第二個引數表示要處理的訊息的型別

第三和第四個引數表示附加訊息,這個取決於uMsg引數的值

返回值:型別:LRESULT

返回值是訊息處理的結果,並取決於傳送的訊息。

肯定不可能處理完所有的響應所以這裡需要用到另一個API函式DefWindowProc來用系統的預設處理來未處理的訊息

LRESULT CALLBACK WindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch (uMsg)
{
case WM_CREATE:
MessageBox(hwnd, L"視窗建立成功", L"建立視窗", MB_OK);
break;
default:
break;
}
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}

總結

Windows程式設計也就是在Windows下進行程式設計,程式設計分為GUI和CUI,GUI就是圖形化程式設計,CUI就是命令列下程式設計。這次是GUI程式設計也就是Windows下圖形化程式設計。Windows的GUI程式設計就是視窗化程式設計每一個可以看到的圖形程式設計都是看為視窗

首先建立一個視窗,建立視窗的流程為:建立視窗類,註冊視窗類,建立視窗,顯示視窗。然後這個視窗需要配合著別的東西來處理,也就是配合Windows下的訊息來處理。Windows系統有自己的訊息處理佇列,Windows系統會將屬於該視窗的訊息發給該視窗的訊息佇列,那麼該視窗只需要針對自己的訊息佇列來處理訊息。視窗對於訊息來進行響應。

當視窗有訊息時,訊息先發給Windows作業系統,然後作業系統將訊息分發給視窗,視窗再呼叫自己的響應函式去處理訊息。

建立視窗,建立視窗響應

//總程式碼
#include<Windows.h>
#include<iostream>

LRESULT CALLBACK WindowProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
)
{
switch (uMsg)
{
case WM_CREATE:
MessageBox(hwnd, L"視窗建立成功", L"建立視窗", MB_OK);
break;
default:
break;
}
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nShowCmd
)
{
//1 建立一個視窗類
WNDCLASS myclass = { 0 };
myclass.lpszClassName = L"sm7";
myclass.lpfnWndProc = WindowProc;

//2註冊視窗類
RegisterClass(&myclass);

//3建立視窗
HWND hMyWindow = CreateWindow(
myclass.lpszClassName,
L"sm7的視窗",
WS_BORDER,
CW_USEDEFAULT,
0,
CW_USEDEFAULT,
0,
NULL,
NULL,
hInstance,
NULL
);


//4顯示視窗
ShowWindow(hMyWindow, SW_SHOW);

//5獲取訊息
MSG message;
LPMSG MESSAGE = &message;
while (1)
{
GetMessage(MESSAGE,hMyWindow,0,0);
DispatchMessage(MESSAGE);
}
return 0;
}