MFC (微軟基礎類別庫),Windows系統平臺做GUI尚且OK,但不支持跨平臺,
//Windows訊息機制:
//1.SDK與API
Software Development Kit,為特定軟體框架,硬體平臺,作業系統等建立應用軟體的開發工具的集合;
Application Programming Interface,作業系統提供給應用程式編程的介面;
//2.視窗和句柄
視窗,一個Windows程式至少有一個主視窗;
句柄,在Windows應用程式中,視窗是通過視窗句柄(HWND)來標識的,我們要對某個視窗進行操作,首先要得到這個視窗的句柄;
//ps:系統在創建各種資源(視窗,圖示...)會為他們分配記憶體,并回傳標識這些資源的標識號,即句柄,eg:圖示句柄(HICON),游標句柄(HCURSOR),畫刷句柄(HBRUSH)
//3.訊息與訊息佇列
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; }
我參考的視頻鏈接:
https://www.bilibili.com/video/av20005978/?p=8&t=328
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/10401.html
標籤:其他
上一篇:大屏可視化之番外篇圖示/圖表制作
