一、控制台程序 vs 窗口程序平时写的程序#includeiostreamintmain(){std::coutHello Worldstd::endl;return0;}运行结果一个黑乎乎的框框输出一行字。今天要写的程序运行结果一个真正的Windows窗口可以拖动、缩放、点击就像平时用的记事本、计算器那样二、窗口程序的核心思想等消息、处理消息用奶茶店理解窗口程序奶茶店Windows程序店铺装修创建窗口店员窗口处理函数顾客点单消息鼠标点击、按键店员处理订单处理消息打烊关门关闭窗口窗口程序就是一直在等顾客消息顾客来了就处理处理完继续等。三、5步写出第一个窗口第1步包含头文件#includewindows.hWindows编程的万能头文件所有API都在这里。第2步写窗口处理函数店员// 这个函数就是店员顾客消息来了她来处理LRESULT CALLBACKWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam){switch(msg){caseWM_DESTROY:// 顾客说我要关门了PostQuitMessage(0);// 店员通知老板准备打烊return0;}// 其他事情比如顾客点单交给总店处理returnDefWindowProc(hwnd,msg,wParam,lParam);}第3步写程序入口老板开店intWINAPIWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,intnCmdShow){// 1. 注册窗口类装修店铺WNDCLASS wc{};wc.lpfnWndProcWndProc;// 招聘店员wc.hInstancehInstance;// 店铺营业执照wc.lpszClassNameMyWindow;// 给店铺起名RegisterClass(wc);// 去工商局注册// 2. 创建窗口正式开业HWND hwndCreateWindow(MyWindow,// 用哪个店名我的第一个窗口,// 招牌文字WS_OVERLAPPEDWINDOW,// 标准装修风格CW_USEDEFAULT,CW_USEDEFAULT,// 位置自动500,400,// 店铺大小宽500高400NULL,NULL,hInstance,NULL);// 3. 显示窗口开门营业ShowWindow(hwnd,nCmdShow);UpdateWindow(hwnd);// 4. 消息循环等顾客MSG msg{};while(GetMessage(msg,NULL,0,0)){// 一直等顾客TranslateMessage(msg);// 翻译订单比如把按A翻译成输入ADispatchMessage(msg);// 叫店员来处理}return0;// 打烊回家}第4步把所有代码拼起来#includewindows.h// 窗口处理函数LRESULT CALLBACKWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam){switch(msg){caseWM_DESTROY:PostQuitMessage(0);return0;}returnDefWindowProc(hwnd,msg,wParam,lParam);}// 程序入口intWINAPIWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,intnCmdShow){// 1. 注册窗口类WNDCLASS wc{};wc.lpfnWndProcWndProc;wc.hInstancehInstance;wc.lpszClassNameMyWindow;RegisterClass(wc);// 2. 创建窗口HWND hwndCreateWindow(MyWindow,我的第一个窗口,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,500,400,NULL,NULL,hInstance,NULL);// 3. 显示窗口ShowWindow(hwnd,nCmdShow);UpdateWindow(hwnd);// 4. 消息循环MSG msg{};while(GetMessage(msg,NULL,0,0)){TranslateMessage(msg);DispatchMessage(msg);}return0;}第5步编译运行Visual Studio新建Windows桌面向导项目替换代码MinGWg window.cpp -o window.exe -mwindows运行双击exe看到窗口了吗四、给窗口加点功能4.1 鼠标点击弹窗在WndProc的switch里添加caseWM_LBUTTONDOWN:// 鼠标左键按下MessageBox(hwnd,你点我了,提示,MB_OK);return0;4.2 键盘按键弹窗caseWM_KEYDOWN:// 键盘按键charstr[100];sprintf(str,你按了键: %d,wParam);MessageBox(hwnd,str,按键提示,MB_OK);return0;4.3 窗口上写字caseWM_PAINT:// 需要画窗口内容PAINTSTRUCT ps;HDC hdcBeginPaint(hwnd,ps);// 在位置(50,50)写一行字TextOut(hdc,50,50,这是我的第一个窗口,strlen(这是我的第一个窗口));EndPaint(hwnd,ps);return0;4.4 关闭时确认caseWM_CLOSE:// 点击关闭按钮intretMessageBox(hwnd,真的要关闭吗,确认,MB_YESNO);if(retIDYES){DestroyWindow(hwnd);// 用户说是才关闭}return0;五、完整功能版#includewindows.h#includestdio.hLRESULT CALLBACKWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam){switch(msg){caseWM_LBUTTONDOWN:MessageBox(hwnd,你点鼠标了,提示,MB_OK);return0;caseWM_RBUTTONDOWN:MessageBox(hwnd,你点右键了,提示,MB_OK);return0;caseWM_KEYDOWN:charstr[100];sprintf(str,你按了键: %d,wParam);MessageBox(hwnd,str,按键提示,MB_OK);return0;caseWM_PAINT:PAINTSTRUCT ps;HDC hdcBeginPaint(hwnd,ps);TextOut(hdc,50,50,欢迎学习Windows编程,strlen(欢迎学习Windows编程));TextOut(hdc,50,80,点鼠标试试,strlen(点鼠标试试));TextOut(hdc,50,110,按键盘试试,strlen(按键盘试试));EndPaint(hwnd,ps);return0;caseWM_CLOSE:intretMessageBox(hwnd,真的要关闭吗,确认,MB_YESNO);if(retIDYES){DestroyWindow(hwnd);}return0;caseWM_DESTROY:PostQuitMessage(0);return0;}returnDefWindowProc(hwnd,msg,wParam,lParam);}intWINAPIWinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,intnCmdShow){// 注册窗口类WNDCLASS wc{};wc.lpfnWndProcWndProc;wc.hInstancehInstance;wc.lpszClassNameMyWindow;wc.hbrBackground(HBRUSH)(COLOR_WINDOW1);// 背景色RegisterClass(wc);// 创建窗口HWND hwndCreateWindow(MyWindow,我的第一个程序,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,CW_USEDEFAULT,500,400,NULL,NULL,hInstance,NULL);// 显示窗口ShowWindow(hwnd,nCmdShow);UpdateWindow(hwnd);// 消息循环MSG msg{};while(GetMessage(msg,NULL,0,0)){TranslateMessage(msg);DispatchMessage(msg);}return0;}六、记住核心流程1. 注册图纸 (RegisterClass) ↓ 2. 盖房子 (CreateWindow) ↓ 3. 开门营业 (ShowWindow) ↓ 4. 等顾客 → 处理 → 继续等 (消息循环)七、常见问题Q: 为什么我的窗口一闪就没了A: 忘记消息循环了检查有没有while (GetMessage(...))。Q: 为什么点击没反应A: 忘记在switch里添加对应的case了。Q: 为什么窗口是白板A: 忘记写WM_PAINT处理了或者没调用BeginPaint/EndPaint。Q: 编译报错找不到windows.hA: 确认安装了Windows SDK或者在Visual Studio里创建Windows项目。