簡要說明
MFC是微軟的一個基礎類別庫,如果在Windows平臺上做GUI的開發,這是一個不錯的選擇,簡單的記錄MFC學習程序中的需要掌味訓者后期需要查看的知識點,
Windows訊息機制
- 作業系統首先捕獲到來自鍵盤或滑鼠等輸入系統的訊息,并將獲取到的訊息存放到訊息佇列中,
- 應用程式一直通過GetMessage()從訊息佇列中獲取訊息,
- 應用程式再將獲取到的訊息通過DispatchMessage()分派到作業系統
- 作業系統再執行“視窗程序”

Windows編程模型
- WinMain函式的定義(WinMain函式是Windows程式的入口)
- 創建一個視窗
- 進行訊息回圈
- 撰寫視窗程序函式
整體框架結構

實作步驟
創建win32專案
- 新建win32專案,選擇“空專案”并完成創建,
- 添加源檔案,檔案名以“.c”結尾,
- 添加頭檔案“windows.h”
- 添加程式入口函式“WindowMain”
//WINAPI 代表__stdcall 引數的傳遞順序:從右到左 以此入堆疊,并且在函式回傳前 清空堆疊
int WINAPI WinMain(
HINSTANCE hInstance, // 應用程式實體句柄
HINSTANCE hPrevInstance, // 上一個應用程式句柄,在win32環境下,引數一般為NULL,不起作用了
LPSTR lpCmdLine, // char * argv[]
int nShowCmd) // 顯示命令 最大化、最小化 正常
{
...
return 0;
}
應用程式程序
- 設計視窗
- 首先實體化一個視窗類,再依次設定其引數
WNDCLASS wc;
wc.cbClsExtra = 0; //類的額外的記憶體
wc.cbWndExtra = 0; //視窗額外的記憶體
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); // 設定背景
wc.hCursor = LoadCursor(NULL, IDC_HAND); //設定游標 如果第一個引數為NULL,代表使用體統提供的游標
wc.hIcon = LoadIcon(NULL, IDI_ERROR);
wc.hInstance = hInstance; //應用程式實體句柄 傳入WinMain中的形參即可
wc.lpfnWndProc = WindowProc;// 回呼函式 視窗程序
wc.lpszClassName = TEXT("WIN");//指定視窗類名稱
wc.lpszMenuName = NULL; //NULL代表不使用選單
wc.style = 0; //顯示風格 0為默認
- 注冊視窗
- 將上述實體化的視窗類進行注冊
RegisterClass(&wc);
- 創建視窗
/*
lpClassName, 類名
lpWindowName, 標題名
dwStyle, 風格 WS_OVERLAPPEDWINDOW
x, 顯示坐標 CW_USEDEFAULT
y,
nWidth, 寬
nHeight, 高
hWndParent, 父視窗
hMenu, 選單
hInstance, 實體句柄
lpParam 附加值 lp一般為滑鼠附加值 NULL
*/
HWND hwnd = CreateWindow(wc.lpszClassName, TEXT("WINDOWS"), WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, wc.hInstance, NULL);
- 顯示和更新
ShowWindow(hwnd, SW_SHOWNORMAL);
UpdateWindow(hwnd);
- 通過回圈取訊息
/*
HWND hwnd; 主視窗句柄
UINT message; 具體訊息名稱
WPARAM wParam; 附加訊息 鍵盤訊息
LPARAM lParam; 附加訊息 滑鼠訊息
DWORD time; 訊息產生時間
POINT pt; 附加訊息 滑鼠訊息 x y
*/
MSG msg;
while (1)
{
/*
LPMSG lpMsg, 訊息
HWND hWnd, 捕獲視窗 填NULL代表捕獲所有的視窗
UINT wMsgFilterMin, 最小和最大的過濾的訊息 一般填入0
UINT wMsgFilterMax 填0代表捕獲所有訊息
*/
if (GetMessage(&msg, NULL, 0, 0) == FALSE)
{
break;
}
// 翻譯訊息
TranslateMessage(&msg);
// 分發訊息
DispatchMessage(&msg);
}
- 訊息處理(視窗程序)
//CALLBACK 代表__stdcall 引數的傳遞順序:從右到左 以此入堆疊,并且在函式回傳前 清空堆疊
LRESULT CALLBACK WindowProc(
HWND hwnd, // 訊息所屬的視窗句柄
UINT uMsg, // 具體訊息名稱 WM_XXXXXXXX 訊息名
WPARAM wParam, // 鍵盤附加訊息
LPARAM lParam // 滑鼠附加訊息
)
{
switch (uMsg)
{
case WM_CLOSE:
//所有xxxWindow為結尾的方法,都不會進入到訊息佇列中,而是直接執行
DestroyWindow(hwnd); //DestroyWindow 發送另一個訊息 WM_DESTROY
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
case WM_LBUTTONDOWN:
{
int xPos = LOWORD(lParam);
int yPos = HIWORD(lParam);
char buf[1024];
wsprintf(buf, TEXT("x = %d, y = %d"), xPos, yPos);
MessageBox(hwnd, buf, TEXT("滑鼠左鍵按下"), MB_OK);
break;
}
case WM_KEYDOWN:
MessageBox(hwnd, TEXT("鍵盤按下"), TEXT("鍵盤按下"), MB_OK);
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
HDC hdc = BeginPaint(hwnd, &ps);
TextOut(hdc, 100, 100, TEXT("HELLO"), strlen("HELLO"));
EndPaint(hwnd, &ps);
break;
}
default:
break;
}
大概流程如下

小結
- 首先要對整個創建流程有個整體的把握
- 學會查看msdn檔案,不知道的引數及方法都可以從中獲取
- 學習很重要,要好好學習
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/95046.html
標籤:C++
上一篇:C++ Clock函式呼叫及用途
