純乾貨,代碼如下:
#include <windows.h>
#include <stdio.h>
LRESULT CALLBACK WinFirstProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
int WINAPI WinMain(
HINSTANCE hInstance, //應用程序實例的句柄 當前實例
HINSTANCE hPrevInstance, // 應用程序實例的句柄 先前實例 一般爲NULL
LPSTR lpCmdLine, // 長指針 字符串類型 命令行參數
int nCmdShow // 顯示窗口的狀態 (最大化等)
)
{
WNDCLASS wndcls;
wndcls.cbClsExtra=0;
wndcls.cbWndExtra=0;
wndcls.hbrBackground = (HBRUSH)GetStockObject(GRAY_BRUSH); //背景顏色
wndcls.hCursor = LoadCursor(NULL, IDC_SIZENS); //鼠標的形狀
wndcls.hIcon = LoadIcon(NULL, IDI_INFORMATION); //窗口的圖標 icon
wndcls.hInstance=hInstance;
wndcls.lpfnWndProc = WinFirstProc;
wndcls.lpszClassName="first";
wndcls.lpszMenuName=NULL;
wndcls.style=CS_HREDRAW | CS_VREDRAW; //水平重畫或者垂直重畫
RegisterClass(&wndcls); //註冊窗口類
HWND hwnd;
//創建窗口類
hwnd=CreateWindow("first","第一個程序",WS_OVERLAPPEDWINDOW,
0,0,600,400,NULL,NULL,hInstance,NULL);
//顯示窗口
ShowWindow(hwnd,SW_SHOWNORMAL);
//更新窗口
UpdateWindow(hwnd);
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg); //轉換消息
DispatchMessage(&msg); //將收到的消息傳到回調函數 進行處理
}
return 0;
}
LRESULT CALLBACK WinFirstProc(
HWND hwnd, // handle to window
UINT uMsg, // message identifier
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
)
{
switch(uMsg)
{
//鍵盤輸入
case WM_CHAR:
char szChar[20];
//格式化文本到內存區中
sprintf(szChar,"char is %d",wParam);
//彈出消息框
MessageBox(hwnd,szChar,"提示",0);
break;
//鼠標按下
case WM_LBUTTONDOWN:
MessageBox(hwnd,"mouse clicked","提示",0);
HDC hdc;
hdc=GetDC(hwnd);
TextOut(hdc,0,100,"helloworld",strlen("helloworld"));
ReleaseDC(hwnd, hdc); /* 注意釋放資源*/
break;
//繪寫窗口
case WM_PAINT:
HDC hDC;
PAINTSTRUCT ps;
hDC=BeginPaint(hwnd,&ps);
TextOut(hDC,0,0,"hello",strlen("hello"));
EndPaint(hwnd,&ps);
break;
//退出
case WM_CLOSE:
if (IDYES == MessageBox(hwnd, "是否真的結束?", "windows", MB_YESNOCANCEL))
{
DestroyWindow(hwnd); //銷燬窗口
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}
創建一個完整的窗口需要經過下面四個操作步驟:
1、設計一個窗口類;
2、註冊窗口類;
3、創建窗口;
4、顯示及更新窗口
隊列消息會被送到系統消息隊列,然後到線程消息隊列。Windows維護一個系統消息
隊列,每個GUI線程也有一個線程消息隊列。其中包括鍵盤鼠標消息,WM_PAINT、
WM_TIMER、WM_CLOSE、WM_QUIT、WM_LBUTTONDOWN 等。Windows應用程序的輸入由Windows
系統以消息的形式發送給應用程序的窗口,這些窗口通過窗口過程來接收和處理消息,然後
把控制返還給Windows.
消息循環從消息隊列中得到消息,如果不是快捷鍵消息或對話框消息,就進行消息轉換和派發,
讓目的窗口的窗口過程來處理。當得到消息WM_QUIT,退出消息循環。
**WM_DESTROY 銷燬窗口,並釋放資源。
WM_CLOSE 只是關閉窗口,並不釋放資源,可以在後臺運行。**
運行結果如下: