標籤:dial 繪圖 raw fas while 接收參數 bsp show round
#windows訊息機制
建立第一個Win32應用程式
VS2015 建立項目 Win32應用程式
// Win32WindowDemo.cpp : 定義應用程式的進入點。//#include "stdafx.h"#include "Win32WindowDemo.h"#define MAX_LOADSTRING 100// 全域變數: HINSTANCE hInst; // 當前執行個體WCHAR szTitle[MAX_LOADSTRING]; // 標題列文本WCHAR szWindowClass[MAX_LOADSTRING]; // 主視窗類名// 此代碼模組中包含的函數的前向聲明: ATOM MyRegisterClass(HINSTANCE hInstance);BOOL InitInstance(HINSTANCE, int);LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);INT_PTR CALLBACK About(HWND, UINT, WPARAM, LPARAM);
//程式進入點
//#define CALLBACK __stdcall VS預設用的是 __stdcall
//#define WINAPI __stdcall VS預設用的是 __stdcall
//#define WINAPIV __cdecl 其他版本用編譯器用的是 __cdecl
//#define APIENTRY WINAPI
//棧 -》 傳遞參數
//棧幀 -》 平棧
//__stdcall 是函數調用預定的一種,函數呼叫慣例主要約束了兩件事。
//1.參數行程順序
//2.呼叫堆疊由誰(調用函數或被調用函數)清理
常用的函數呼叫慣例:stdcall cdecl fastcall thiscall naked call
int APIENTRY wWinMain(_In_ HINSTANCE hInstance, //int型 wWinMain tWinMain WinMain 不同的編碼模式 ASCII UNCIODE _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow)
//HINSTANCE hInstance 核心對象 執行個體對象 作業系統告訴我們
//HINSTANCE hPrevInstance 啟動我的這個進程是誰 作業系統告訴我們
//lpCmdLine 接收參數運行成 使用者告訴我們的
//nCmdShow 啟動的方式 使用者高速我們的{ UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine);
//兩個宏定義
// TODO: 在此放置代碼。 // 初始化全域字串 LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadStringW(hInstance, IDC_WIN32WINDOWDEMO, szWindowClass, MAX_LOADSTRING);
//LoadStringW 進行字串的載入
//IDS 資源表裡面定義的字串 一個是程式的標題 一個是 視窗類別名
// 國際化 多元化 的一種方式
MyRegisterClass(hInstance); //向系統註冊視窗類別 // 執行應用程式初始化: if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WIN32WINDOWDEMO)); MSG msg; // 主訊息迴圈:
//擷取訊息
//&msg 結構體
typedef struct tagMSG{
HWND hwnd 視窗執行個體
UINT message; 視窗訊息
WPARAM wParam 附加值
LPARAM lParam; 附加值
DWORD time; 訊息時間
POINT ps; 滑鼠位置
}
while (GetMessage(&msg, nullptr, 0, 0)) { if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg)) { TranslateMessage(&msg); DispatchMessage(&msg); } } return (int) msg.wParam;}//// 函數: MyRegisterClass()//// 目的: 註冊視窗類別。//ATOM MyRegisterClass(HINSTANCE hInstance){ WNDCLASSEXW wcex; wcex.cbSize = sizeof(WNDCLASSEX); wcex.style = CS_HREDRAW | CS_VREDRAW; //視窗風格 wcex.lpfnWndProc = WndProc; //視窗類別 wcex.cbClsExtra = 0; //預留空間的附加值,此程式沒用到這個域! wcex.cbWndExtra = 0; //預留空間的附加值,此程式沒用到這個域! wcex.hInstance = hInstance; //執行個體控制代碼,主函數的參數之一! wcex.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WIN32WINDOWDEMO)); //裝載表徵圖函數,在這可以裝載自己的表徵圖! wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); //裝載游標函數,在這可以裝載自己的游標! wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); //初始化視窗的畫刷 wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WIN32WINDOWDEMO); //視窗菜單 wcex.lpszClassName = szWindowClass; //程式名字! wcex.hIconSm = LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL)); return RegisterClassExW(&wcex);//// 函數: InitInstance(HINSTANCE, int)//// 目的: 儲存執行個體控制代碼並建立主視窗
//// 注釋: //// 在此函數中,我們在全域變數中儲存執行個體控制代碼並// 建立和顯示主程式視窗。//BOOL InitInstance(HINSTANCE hInstance, int nCmdShow){ hInst = hInstance; // 將執行個體控制代碼儲存在全域變數中 HWND hWnd = CreateWindowW(szWindowClass, //應用程式在作業系統註冊表中的名稱
szTitle, //應用程式標題欄名稱
WS_OVERLAPPEDWINDOW, //視窗風格 CW_USEDEFAULT, //視窗顯示時左上方x座標
0, //視窗顯示時左上方y座標
CW_USEDEFAULT, //視窗顯示時右下角x座標
0, //視窗顯示時右下角y座標
nullptr, //父視窗控制代碼,此程式沒有
nullptr, //菜單控制代碼
hInstance, //handle程式執行個體控制代碼if (!hWnd) { return FALSE; } ShowWindow(hWnd, nCmdShow); //顯示視窗 UpdateWindow(hWnd); return TRUE;}
//// 函數: WndProc(HWND, UINT, WPARAM, LPARAM)//// 目的: 處理主視窗的訊息。//// WM_COMMAND - 處理應用程式菜單// WM_PAINT - 繪製主視窗// WM_DESTROY - 發送退出訊息並返回////
#訊息是已整數形式傳送的LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
//HWND 執行個體
//message 訊息佇列
//附加值
//附加值
{ switch (message) { case WM_COMMAND: { int wmId = LOWORD(wParam); // 分析菜單選擇: switch (wmId) { case IDM_ABOUT: DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About); break; case IDM_EXIT: DestroyWindow(hWnd); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } } break; case WM_PAINT: { PAINTSTRUCT ps; HDC hdc = BeginPaint(hWnd, &ps); // TODO: 在此處添加使用 hdc 的任何繪圖代碼... EndPaint(hWnd, &ps); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0;}// “關於”框的訊息處理常式。INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){ UNREFERENCED_PARAMETER(lParam); switch (message) { case WM_INITDIALOG: return (INT_PTR)TRUE; case WM_COMMAND: if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL) { EndDialog(hDlg, LOWORD(wParam)); return (INT_PTR)TRUE; } break; } return (INT_PTR)FALSE;}
#MFC Win32
由於win32 開發程式比較繁瑣複雜
訊息體系
MFC其實就是將 訊息和方法 封裝成了 類
MFC中 函數 跟win32 api 函數的參數是不一樣的..
MSDN MFC是中文的 win32 api 是英文的
005 windows訊息機制