//================================== //Windows應用程序框架結構(例子) //參考:《Visual C++寶典》陳國建等編著 //================================== #include<Windows.h> LRESULT CALLBACK WindowFunc(HWND, UINT, WPARAM, LPARAM); //聲明回調函數 char szWinName[] = "MyWindow"; //程序的類名稱 //入口函數 int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd) { HWND hWnd; //窗口句柄 MSG msg; //消息 WNDCLASS WndClass; //窗口類 WndClass.style = CS_HREDRAW | CS_VREDRAW; //定義窗口類型 WndClass.lpfnWndProc = WindowFunc; //消息處理函數 WndClass.cbClsExtra = 0; //預留空間,0為不預留 WndClass.cbWndExtra = 0; //預留空間,0為不預留 WndClass.hInstance = hInstance; //程序的實例句柄 WndClass.hIcon = LoadIcon(NULL, IDI_APPLICATION); //設置窗口的圖標 WndClass.hCursor = LoadCursor(NULL, IDC_ARROW); //設置鼠標光標形狀 WndClass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); //窗口背景為白色 WndClass.lpszMenuName = NULL; //設置窗口菜單 WndClass.lpszClassName = szWinName; //定義窗口類的名稱 if(!RegisterClass(&WndClass)) //注冊窗口 return 1; hWnd = CreateWindow(szWinName, //窗口類的名稱 "MyWindow", //窗口的標題 WS_OVERLAPPEDWINDOW, //窗口的風格 CW_USEDEFAULT, //窗口的坐標 x CW_USEDEFAULT, //窗口的坐標 y CW_USEDEFAULT, //窗口的寬度 CW_USEDEFAULT, //窗口的高度 NULL, //父窗口的句柄 NULL, //窗口的目錄 hInstance, //窗口的句柄 NULL); //參數指針 ShowWindow(hWnd, nShowCmd); //顯示窗口 UpdateWindow(hWnd); //更新窗口 //處理窗口消息 while(GetMessage(&msg, NULL, 0, 0)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } //定義回調處理函數 LRESULT CALLBACK WindowFunc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hDC; //設備句柄 PAINTSTRUCT PaintStruct; //聲明繪制窗口的客戶區 RECT Rect; //矩形區域 switch(message) { case WM_PAINT: //重畫消息 hDC = BeginPaint(hWnd, &PaintStruct); //准備窗口繪圖 GetClientRect(hWnd, &Rect); //得到客戶區矩形區域 //在窗口顯示字符串"Hello" DrawText(hDC, "Hello, Windows", -1, &Rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER); //繪制字符串 EndPaint(hWnd, &PaintStruct); //結束窗口繪圖 return 0; case WM_DESTROY: //銷毀窗口消息 PostQuitMessage(0); //發送退出消息 return 0; } return DefWindowProc(hWnd, message, wParam, lParam); } //附加說明:主要API介紹 /* //1.入口函數 int WINAPI WinMain(HINSTANCE hInstance, //應用程序的實例句柄,這個實例句柄是程序的唯一標識 HINSTANCE hPrevInstance, //檢查是否有多個程序實例運行 LPSTR lpCmdLine, //一個指向字符串的指針,用來保存運行程序時的命令行參數 int nShowCmd); //指定程序開始的時候如何顯示 //2.定義並注冊窗口類 typedef struct _WNDCLASS{ UINT style; //指定窗口風格:CS_VREDRAW 垂直重畫,CS_HREDRAW 水平重畫等 WNDPROC lpfnWndProc; //指向窗口過程的指針,必須使用CallWindowProc函數調用窗口過程 int cbClsExtra; //窗口類結構體之后分配的額外的字節數,系統將該值初始化為0 int cbWndExtra; //窗口實例之后分配的額外的字節數,系統將該值初始化為0 HANDLE hInstance; //包含該窗口類實例的句柄 HICON hIcon; //標識窗口類圖標的句柄,必須為一個圖標資源的句柄,如果為NULL,系統將提供默認圖標 HCURSOR hCursor; //標識窗口類光標的句柄,必須為一個圖標資源的句柄,如果為NULL,系統將提供默認圖標 HBRUSH hbrBackground; //窗口背景畫刷的句柄 LPCTSTR lpszMenuName; //指向以NULL結尾的字符串,該字符串描述菜單的資源名 LPCTSTR lpszClassName; //指向一個以NULL結尾的字符串,該字符串定義了窗口類的名字 }WNDCLASSA, *PWNDCLASSA, NEAR *NPWNDCLASSA, FAR *LPWNDCLASSA; ATON RegisterClass(CONST WNDCLASS *lpWndClass); //注冊窗口 //3.創建並顯示窗口 HWND CreateWindow(LPCTSTR lpClassName, //指向NULL結尾的字符串或整型數atom LPCTSTR lpWindowName, //指向一個指定窗口名的以NULL結尾的字符串指針 DWORD dwStyle, //指定創建窗口的風格:WS_BORDER 帶邊框的窗口,WS_CAPTION 帶標題欄的窗口等 int x, //指定窗口的初始水平位置 int y, //指定窗口的初始垂直位置 int nWidth, //指定窗口寬度 int nHeight, //指定窗口高度 HWND hWndParent, //指向被創建窗口的父窗口或所有者窗口的句柄 HMENU hMenu, //菜單句柄,或依據窗口風格的一個子窗口標識 HANDLE hInstance, //包含窗口類實例的句柄 LPVOID lpParam); //指向一個值的指針,該值傳遞給窗口WM_CREATE消息 //返回值:成功返回新窗口的句柄,否則返回NULL //顯示窗口 BOOL ShowWindow(HWND hWnd, //指定窗口句柄 int nCmdShow); //指定窗口如何顯示,SW_SHOW 在窗口原來位置顯示,SW_HIDE 隱藏窗口並激活其他窗口 //返回值:如果窗口以前可見則返回一個非零值,如果以前被隱藏則返回0 //4.窗口消息循環 //Windows會為當前每一個運行的程序建立一個消息隊列,用來完成用戶與程序的交互。 while(GetMessage(&msg,NULL,0,0)) { TranslateMessage(&msg); DispatcherMessage(&msg); } //消息循環從GetMessage函數開始,首先從消息隊列中取出一個消息,然后通過TranslateMessage(&msg)函數將msg傳遞給 //Windows進行轉換,最后使用DispatchMessage(&msg)將msg結構體回傳給Windows,再由Windows將此消息發送到相應的 //窗口過程中進行處理 //5.窗口過程函數 LRESULT CALLBACK WndProc(HWND hwnd, //接收消息的窗口句柄,它由CreateWindow函數創建 UINT message, //標識消息類型 WPARAM wParam, //32位的消息參數,用來提供消息的更多信息 LPARAM lParam); //32位的消息參數,用來提供消息的更多信息 //6.窗口處理消息 switch(message) { case WM_CREATE: //... break; case WM_PAINT: //... break; } return DefWindowProc(hwnd,message,wParam,lParam); */
Visual Studio 2017 創建 Visual C++ Windows 桌面應用程序時(注意:不是添加 MFC 程序),默認生成的代碼如下:
// WindowsProject.cpp: 定義應用程序的入口點。 // #include "stdafx.h" #include "WindowsProject.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); int APIENTRY wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { UNREFERENCED_PARAMETER(hPrevInstance); UNREFERENCED_PARAMETER(lpCmdLine); // TODO: 在此放置代碼。 // 初始化全局字符串 LoadStringW(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING); LoadStringW(hInstance, IDC_WINDOWSPROJECT, szWindowClass, MAX_LOADSTRING); MyRegisterClass(hInstance); // 執行應用程序初始化: if (!InitInstance (hInstance, nCmdShow)) { return FALSE; } //加載窗體熱鍵 HACCEL hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_WINDOWSPROJECT)); MSG msg; // 主消息循環: 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_WINDOWSPROJECT)); wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); wcex.lpszMenuName = MAKEINTRESOURCEW(IDC_WINDOWSPROJECT); 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, 0, CW_USEDEFAULT, 0, nullptr, nullptr, hInstance, nullptr); 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) { 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; }
網上資料:
http://www.jellythink.com/archives/111 添加DLL引用
http://www.jizhuomi.com/school/c/193.html 定時器
http://www.cnblogs.com/wxfasdic/archive/2010/09/23/1833522.html 多線程