MFC (微軟基礎類庫),Windows系統平臺作GUI尚且OK,但不支持跨平臺。編程
//Windows消息機制:windows
//1.SDK與API設計模式
Software Development Kit,爲特定軟件框架,硬件平臺,操做系統等創建應用軟件的開發工具的集合;框架
Application Programming Interface,操做系統提供給應用程序編程的接口;ide
//2.窗口和句柄函數
窗口,一個Windows程序至少有一個主窗口;工具
句柄,在Windows應用程序中,窗口是經過窗口句柄(HWND)來標識的。咱們要對某個窗口進行操做,首先要獲得這個窗口的句柄;開發工具
//ps:系統在建立各類資源(窗口,圖標...)會爲他們分配內存,並返回標識這些資源的標識號,即句柄。eg:圖標句柄(HICON),光標句柄(HCURSOR),畫刷句柄(HBRUSH)ui
//3.消息與消息隊列spa
Windows是一種事件驅動方式的程序設計模式,主要是基於消息。
//4.WinMain 函數——Windows程序的入口函數,至關於DOS程序的main
一個完整的Win32程序實現步驟:
·WinMain函數的定義
·建立一個窗口
·進行消息循環
·編寫窗口過程
//環境:VS2013,實測:VS2017,TranslateMessage函數未找到。
#include <windows.h>//底層實現窗口的頭文件 //回調函數 //CALLBACK 表明參數_stdcall參數的傳遞順序:從右到左入棧,函數返回前清空棧 LRESULT CALLBACK WindowProc( HWND hwnd,//消息所屬窗口句柄 UINT uNsg,//具體消息名稱 WM_XXX格式 WPARAM wParam,//鍵盤附加消息 LPARAM lParam) {//鼠標附加消息 switch (uNsg) { //全部以xxxWindow結尾的方法,不進入消息隊列,直接執行 case WM_CLOSE: DestroyWindow(hwnd);//DestroyWindow 發送另外一個消息WM_DESTROY break; case WM_DESTROY: PostQuitMessage(0);//調用while循環中的break 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; } } return DefWindowProc(hwnd, uNsg, wParam, lParam); } //程序入口函數 //WINAPI 表明參數_stdcall參數的傳遞順序:從右到左入棧,函數返回前清空棧 int WINAPI WinMain( _In_ HINSTANCE hInstance, //應用程序實例句柄 _In_opt_ HINSTANCE hPrevInstance,//上一個應用程序句柄,通常爲NULL _In_ LPSTR lpCmdLine, //char* argv[] _In_ int nShowCmd) { //顯示命令,最大/小化 //1.設計窗口 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);//設置圖標,null同上 wc.hInstance = hInstance;//傳入WinMain中的形參 wc.lpfnWndProc = WindowProc;//回調函數,窗口過程 wc.lpszClassName = TEXT("WIN");//指定窗口類名稱 wc.lpszMenuName = NULL;//菜單名稱 wc.style = 0;//默認風格 //2.註冊窗口 RegisterClass(&wc); //3.建立窗口 HWND hwnd = CreateWindow( wc.lpszClassName,//lpClassName 類名 TEXT("Windows"),//lpWindowName 標題名 WS_OVERLAPPEDWINDOW,//dwStyle 默認風格 混合模式 CW_USEDEFAULT,// x座標 CW_USEDEFAULT,// y CW_USEDEFAULT,//nWidth寬高 CW_USEDEFAULT,//nHeight NULL,// hWndParent 父窗口 NULL,//hMenu 菜單 hInstance,// hInstance 實例句柄 NULL);//lpParam 附加值 鼠標左右鍵 //4.顯示和更新 ShowWindow(hwnd, SW_SHOWNORMAL);//正常大小 UpdateWindow(hwnd); //5.經過循環取消息 /* *typedef struct tagMSG { * HWND hwnd; //主窗口句柄 * UINT message; //具體消息名稱 * WPARAM wParam; //鍵盤消息 附加消息 * LPARAM lParam; //鼠標消息 附加消息 * DWORD time; //消息產生時間,系統自算 * POINT pt; //鼠標位置 *} **/ MSG msg; while (1) { /* GetMessageW( _Out_ LPMSG lpMsg, 消息 _In_opt_ HWND hWnd, 捕獲窗口,NULL表明捕獲全部窗口 _In_ UINT wMsgFilterMin, _In_ UINT wMsgFilterMax);(0,0)表明捕獲全部消息 */ if (GetMessage(&msg, NULL, 0, 0) == FALSE) { break; } //翻譯消息 eg:鍵入Ctrl+C不可直接打印,需譯後再次進入消息隊列 TranslateMessage(&msg); DispatchMessage(&msg);//分發消息 } //6.處理窗口過程 up return 0; }
我參考的視頻連接: