Windows API 程式設計之建立一個windows視窗
阿新 • • 發佈:2019-01-21
直接上程式碼。
/**************************************************************************************
* 問題:使用windows API函式建立一個windows視窗
* 作者:李文順
* 步驟:
* 1、註冊視窗類 (RegisterClassEx)
* 2、建立視窗 (CreateWindowsEx)
* 3、在桌面顯示視窗 (ShowWindows)
* 4、更新視窗客戶區 (UpdataWindows)
* 5、進入無限迴圈的訊息獲取和處理的迴圈。
* GetMessage ,獲取訊息
* TranslateMessage ,轉換鍵盤訊息
* DispatchMessage ,將訊息傳送到相應的視窗函式
**************************************************************************************/
* 修改:修改一些註釋,更準確。
* 時間:2016、12、29
**************************************************************************************/
#include <windows.h>
//函式申明
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam);
//全域性變數
char titleName[]="你隨意"; //視窗標題
//圖形介面程式的入口
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
//定義視窗類(擴充套件)
WNDCLASSEX wcex;
//設定視窗的屬性
wcex.cbSize = sizeof(WNDCLASSEX);
wcex.style = CS_HREDRAW | CS_VREDRAW; //從這個視窗派生出的視窗具有的風格
wcex.lpfnWndProc = (WNDPROC)WndProc; //視窗訊息處理函式指標
wcex.cbClsExtra = 0;
wcex.cbWndExtra = 0 ;
wcex.hInstance = hInstance;
wcex.hIcon = NULL; //視窗最小化圖示
wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wcex.lpszMenuName = NULL;
wcex.lpszClassName = titleName; //該視窗類的名稱
wcex.hIconSm = NULL; //左上角圖示
//註冊視窗
::RegisterClassEx(&wcex);
HWND hWnd;
//建立視窗
hWnd = ::CreateWindow(titleName, titleName, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);
if (!hWnd)return FALSE; //建立視窗失敗,返回
//顯示視窗
::ShowWindow(hWnd, nCmdShow);
//重新整理視窗客戶區
::UpdateWindow(hWnd);
//迴圈獲取\處理訊息
MSG msg;
while(::GetMessage(&msg,0,0,0))
{
::TranslateMessage(&msg); //轉換鍵盤訊息
::DispatchMessage(&msg); //將訊息傳送到相應的視窗函式
}
return (int)msg.wParam;
}
//視窗訊息處理函式
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hDC;
RECT rect;
PAINTSTRUCT ps;
switch(message)
{
case WM_PAINT:
hDC = ::BeginPaint(hWnd,&ps); //使無效的客戶區變得有效,並取得環境裝置
//自定義
{
::GetClientRect(hWnd,&rect); //獲取視窗客戶區的大小
::DrawText(hDC,TEXT("HELLO WORLD"),-1,&rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); //在指定的矩形裡寫入格式化的正文
}
::EndPaint(hWnd,&ps); //釋放環境變數控制代碼,和::BeginPaint 配套使用
break;
case WM_DESTROY:
::PostQuitMessage(0); //該函式向訊息佇列中插入一條 WM_QUIT 訊息,由 GetMessage 函式捕獲返回 0 而退出程式
break;
}
return ::DefWindowProc(hWnd,message,wParam,lParam);
}