第一個 Win32 視窗程式
阿新 • • 發佈:2021-07-10
第一個 Win32 視窗程式
程式骨架 int WinMain(){ // 設計視窗外觀及互動響應,註冊,申請專利 RegisterClass(...) ; // 生產視窗 CreateWindow(...); // 展示視窗 ShowWindow(...); // 粉刷視窗 UpdateWindow(...); // 進入訊息迴圈 while (GetMessage(...)); { // 訊息轉換 TranslateMessage(...); // 訊息分發 DispatchMessage(...); }
可以直接執行
#include <stdio.h> #include <windows.h> //設計一個視窗類,填入引數 //註冊視窗類 //建立視窗 //顯示以及更新視窗 //迴圈等待訊息 LPCTSTR clsName = "My"; LPCTSTR msgName = "歡迎學習"; //回撥函式 LRESULT CALLBACK MyWinProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam); INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR lpCmdLine, INT nCmdShow) { // typedef struct tagWNDCLASSA { // UINT style; // WNDPROC lpfnWndProc; // int cbClsExtra; // int cbWndExtra; // HINSTANCE hInstance; // HICON hIcon; // HCURSOR hCursor; // HBRUSH hbrBackground; // LPCSTR lpszMenuName; // LPCSTR lpszClassName; // } WNDCLASSA, * PWNDCLASSA, * NPWNDCLASSA, * LPWNDCLASSA; //定義一個視窗物件 WNDCLASS wndcls{}; wndcls.cbClsExtra = NULL; wndcls.cbWndExtra = NULL; wndcls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); wndcls.hCursor = LoadCursor(NULL, IDC_ARROW); wndcls.hIcon = LoadIcon(NULL, IDI_APPLICATION); wndcls.hInstance = hInstance; //定義互動響應 wndcls.lpfnWndProc = MyWinProc; //定義視窗代號 wndcls.lpszClassName = clsName; wndcls.lpszMenuName = NULL; wndcls.style = CS_HREDRAW | CS_VREDRAW; //註冊視窗類 RegisterClass(&wndcls); //建立視窗 HWND hwnd; hwnd = CreateWindow(clsName, msgName, WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL); //顯示和重新整理視窗 ShowWindow(hwnd, SW_SHOWNORMAL); UpdateWindow(hwnd); //訊息迴圈 MSG msg; while (GetMessage(&msg,NULL,NULL,NULL)) { TranslateMessage(&msg); DispatchMessage(&msg); } return msg.wParam; } LRESULT __stdcall MyWinProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { //uMsg訊息型別 int ret; HDC hdc; switch (uMsg) { case WM_CHAR: char szChar[20]; sprintf_s(szChar, "您剛才按下了:%c", wParam); MessageBox(hwnd, szChar, "char", NULL); break; case WM_LBUTTONDOWN: MessageBox(hwnd,"檢測滑鼠左鍵按下","msg",NULL); break; case WM_PAINT: PAINTSTRUCT ps; hdc = BeginPaint(hwnd, &ps); TextOut(hdc, 0, 0, "www.baidu.com", strlen("www.baidu.com")); EndPaint(hwnd, &ps); MessageBox(hwnd, "重新繪製", "msg", NULL); break; case WM_CLOSE: ret = MessageBox(hwnd, "是否真要退出!", "msg", MB_YESNO); if(ret == IDYES) { DestroyWindow(hwnd); } break; case WM_DESTROY: PostQuitMessage(0); break; default: return DefWindowProc(hwnd,uMsg,wParam,lParam); } return 0; }