你的第一個Windows程序
在這個模塊,我們編寫一個最小的Windows程序。它的作用是創建並顯示一個空白窗口。這第一個程序包含大約50行代碼,不計算空白行和註釋。這將是我們的起點;以後還會添加圖形,文本,用戶輸入和其它功能。
示例程序屏幕截圖
下面是完整的程序代碼:
#ifndef UNICODE
#define UNICODE
#endif
#include <windows.h>
LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg, WPARAM wParam,LPARAM lParam);
int wWinMain(HINSTANCE hInstance,HINSTANCE,PWSTR pCmdLine,int nCmdShow)
{
//註冊窗口類
const wchar_t CLASS_NAME[]=L"Sample Window Class";
WNDCLASS wc = {};
wc.lpfnWndProc =WindowProc;
wc.hInstance =hInstance;
wc.lpszClassName =CLASS_NAME;
RegisterClass(&wc);
//創建窗口
HWND hwnd = CreateWindowEx(
0, //可選窗口樣式
CLASS_NAME, //窗口類
L"Learn to Program Windows", //窗口文本
WS_OVERLAPPEDWINDOW, //窗口樣式
//窗口大小和定位
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL, //父窗口
NULL, //菜單
hInstance, //實例句柄
NULL //其它應用程序的數據
);
if(hwnd == NULL)
{
return 0;
}
ShowWindow(hwnd,nCmdShow);
//運行消息循環
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);
}
你可以從Windows Hello World Sample下載完整的Visual Studio項目。
它會給出一個有幫助的簡要概述,說明這段代碼是做什麼的。隨後的主題將詳細的分析代碼。
- wWinMain是程序的入口點,當程序啓動,他註冊應用程序窗口某些行爲的信息。其中最重要的信息是一個函數的地址,在這個例子中是WindowProc,這個函數定義窗口的行爲——它的外觀,如何與用戶交互等等。
- 下一步,程序創建窗口和接收這個窗口唯一標識的句柄。
- 如果這個窗口順利地創建,程序進入while循環,程序保持循環,直到程序關閉窗口並退出應用程序。
請注意程序沒有顯式地調用WindowProc函數,儘管我們說這是大多數應用程序邏輯的定義。Windows通過一系列的消息與程序通信,While循環內的代碼驅動過程。每次程序調用 DispatchMessage 函數,每個消息間接的使Windows調用WindowProc函數。
詳細的代碼分析後續......