Windows API程式設計(二)Hello World程式
阿新 • • 發佈:2018-12-26
程式碼如下:
#include "Windows.h"
//處理WM_PAINT訊息
void OnPaint(HWND hWnd)
{
//獲取裝置上下文控制代碼
PAINTSTRUCT ps;
HDC hDC = BeginPaint(hWnd, &ps);
//獲取視窗客戶去矩形
RECT rcClient;
GetClientRect(hWnd, &rcClient);
//在視窗客戶區內顯示文字
DrawText(hDC, "Hello , World!", -1, &rcClient, DT_SINGLELINE | DT_CENTER | DT_VCENTER);
//釋放裝置上下文
EndPaint(hWnd, &ps);
}
//主視窗過程函式
LRESULT CALLBACK MainWndProc(HWND hWnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
switch(uMsg)
{
case WM_PAINT: //視窗繪製訊息
{
OnPaint(hWnd);
}break ;
case WM_DESTROY: //視窗銷燬訊息
{
PostQuitMessage(0); //投遞WM_QUIT訊息
return 0;
}break;
}
//對任何訊息都不感興趣,預設方式處理,直接交給核心
return DefWindowProc(hWnd, uMsg, wParam, lParam);
}
//註冊視窗類
ATOM InitApplication(HINSTANCE hInstance)
{
WNDCLASS wc = {0 };
//視窗類的風格, 描述一些共性的資訊
wc.style = CS_HREDRAW | CS_VREDRAW;
//主視窗過程函式指標
wc.lpfnWndProc/*是一個函式指標,專門用來處理物件訊息的函式*/ = MainWndProc;
//視窗類附加資料位元組數 自己定義的資料,指定位元組長度
wc.cbClsExtra = 0;
//視窗附加資料位元組數,類附加資料全員共享,視窗附加資料是一個視窗一套
wc.cbWndExtra = 0;
//應用程式的例項控制代碼
wc.hInstance = hInstance;//此處使用了函式引數
//指定視窗圖示控制代碼
wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
//視窗游標控制代碼
wc.hCursor = LoadCursor(NULL, IDC_ARROW);
//背景
wc.hbrBackground = GetSysColorBrush(COLOR_WINDOW);
//指定選單名字
wc.lpszMenuName = NULL;//沒有選單
//類名
wc.lpszClassName = "MAIN";
//註冊結構,將結構複製進核心
return RegisterClass(&wc);
}
//建立、顯示並重新整理視窗
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
//建立視窗
HWND hWnd = CreateWindow(
"MAIN", //視窗類的類名
"WinHello", //視窗的標題
WS_OVERLAPPEDWINDOW, //視窗的風格 描述個性化的特徵
//視窗的位置和大小
CW_USEDEFAULT, //視窗左上角水平座標
CW_USEDEFAULT, //視窗左上角垂直座標
CW_USEDEFAULT, //視窗寬度
CW_USEDEFAULT, //視窗高度 右下角,單位:畫素
NULL, //父視窗控制代碼
NULL, //選單控制代碼
hInstance, //應用程式實力控制代碼
NULL //擴充套件資料
);
if(! hWnd)
{
return FALSE;
}
//顯示視窗
ShowWindow(hWnd, nCmdShow);
//重新整理視窗
UpdateWindow(hWnd);
return TRUE;
}
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
//註冊視窗類
if(! InitApplication(hInstance))
{
return 0;
}
//建立、顯示並重新整理視窗
if(! InitInstance(hInstance, nCmdShow))
{
return 0;
}
//訊息泵,即:訊息迴圈
MSG msg = {0};
while(GetMessage(&msg, NULL, 0, 0))
{
TranslateMessage(&msg);
DispatchMessage(&msg); //間接呼叫視窗過程函式
}
return 0;
}
在Windows XP系統Visual C++6.0IDE環境下執行結果如下:
Windows的API編寫窗體程式非常繁雜。以上帶面可以預見。