【WIN开发】手写第一个 Win32 窗口程序
一、控制台程序 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项目。

相关新闻

电脑之间怎么传输5G大文件?大文件传输的3种高效方案

电脑之间怎么传输5G大文件?大文件传输的3种高效方案

在日常工作或学习里,是不是常碰到要传 5G 大小文件的情况?用微信、QQ 传吧,要么直接提示超出上限,要么传得慢到让人着急;拿 U 盘拷贝吧,5G 的文件不仅占满存储,来回拷贝还特别费时间。难道就没有…

2026/7/3 11:49:09 阅读更多 →
专业WMS系统哪家强 2026年10款优质WMS系统推荐榜

专业WMS系统哪家强 2026年10款优质WMS系统推荐榜

在仓储物流数字化转型加速的2026年,WMS(仓库管理系统)已成为企业优化库存管理、提升作业效率、降低运营成本的核心工具。无论是制造业的物料管控、电商行业的爆单履约,还是医药行业的合规追溯,一款适配的WMS系统都能精…

2026/7/3 11:51:33 阅读更多 →
unity天空球,天空之城资源

unity天空球,天空之城资源

【免费】unity天空球,天空之城资源资源-CSDN下载

2026/5/17 11:06:31 阅读更多 →

最新新闻

IDEA中JDK编译版本不匹配?97%开发者忽略的4个隐蔽配置层级(含IntelliJ 2023.3+最新验证)

IDEA中JDK编译版本不匹配?97%开发者忽略的4个隐蔽配置层级(含IntelliJ 2023.3+最新验证)

更多请点击: https://codechina.net 第一章:JDK编译版本不匹配的典型现象与危害 当Java源代码使用高版本JDK编译(如JDK 17),却在低版本JRE(如JRE 8)上运行时,会触发典型的版本兼容性…

2026/7/3 11:47:54 阅读更多 →
Java智能地址解析:3分钟从混乱文本到结构化数据的终极方案

Java智能地址解析:3分钟从混乱文本到结构化数据的终极方案

Java智能地址解析:3分钟从混乱文本到结构化数据的终极方案 【免费下载链接】address-parse Java 版智能解析收货地址 项目地址: https://gitcode.com/gh_mirrors/addr/address-parse 在电商、物流、CRM等系统中,处理用户输入的地址信息一直是个令…

2026/7/3 11:47:54 阅读更多 →
大模型编程入门:小白也能轻松掌握的AI Coding实战指南(收藏版)

大模型编程入门:小白也能轻松掌握的AI Coding实战指南(收藏版)

本文详细介绍了AI Coding的四种不同形态,重点讲解了L3本地AI Coding工具的Agent模式。作者以自身经历分享如何从抗拒到熟练运用AI Coding Agent,并提供了实用的使用方法和质量守卫策略。文章强调AI Coding是软件工程师的生存技能,鼓励大家积极…

2026/7/3 11:47:54 阅读更多 →
界面控件DevExpress WinForms v26.1新版亮点 - 皮肤更新、面板功能增强

界面控件DevExpress WinForms v26.1新版亮点 - 皮肤更新、面板功能增强

DevExpress WinForms控件包含了190多个Windows Forms控件和UI库,能帮助开发者提供为Windows Forms平台创建具有强大影响力的软件解决方案所需的组件,最新版本支持.NET 10。 在接下来的系列文章中,我将为大家一一介绍DevExpress WinForms v26…

2026/7/3 11:43:52 阅读更多 →
Kimi-K2.5本地部署全指南:MoE大模型在24GB显存上的硬核落地

Kimi-K2.5本地部署全指南:MoE大模型在24GB显存上的硬核落地

1. 项目概述:当SOTA级大模型真正“落进”你的硬盘里Kimi-K2.5本地部署这件事,我从去年底第一次在Hugging Face上看到unsloth/Kimi-K2.5-GGUF仓库时就盯上了。不是因为标题里写的“24G显存可跑”有多吸睛,而是因为它背后那个被反复验证却极少落…

2026/7/3 11:43:52 阅读更多 →
Sunshine游戏串流完整指南:从零开始搭建你的私人云游戏平台

Sunshine游戏串流完整指南:从零开始搭建你的私人云游戏平台

Sunshine游戏串流完整指南:从零开始搭建你的私人云游戏平台 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine Sunshine是一款开源免费的自托管游戏串流服务器&#xff0c…

2026/7/3 11:41:52 阅读更多 →

日新闻

Nginx防御TLS重协商攻击实战:从原理到配置与监控

Nginx防御TLS重协商攻击实战:从原理到配置与监控

1. 项目概述:为什么TLS重协商攻击至今仍需警惕十多年前的CVE-2011-1473,一个关于TLS/SSL协议重协商机制的漏洞,现在提起来还有必要吗?很多运维和开发朋友可能会觉得,这都老掉牙了,现代服务器和客户端不都默…

2026/7/3 0:03:59 阅读更多 →
华为防火墙双通道远程管理实战:Web与SSH配置详解

华为防火墙双通道远程管理实战:Web与SSH配置详解

1. 项目概述:为什么需要双通道远程管理防火墙?在任何一个稍具规模的企业网络里,防火墙都是那个默默守护在边界的关键角色。作为网络工程师,我们不可能每次都跑到机房,插上console线去配置它。远程管理能力,…

2026/7/3 0:03:59 阅读更多 →
AD74413R与PIC18F65K40的高精度工业数据采集方案

AD74413R与PIC18F65K40的高精度工业数据采集方案

1. 项目概述:AD74413R与PIC18F65K40的协同工作在工业自动化和精密测量领域,同时实现高精度模数转换(ADC)和数模转换(DAC)功能是许多复杂系统的核心需求。AD74413R作为一款四通道可配置模拟输入/输出器件,与PIC18F65K40微控制器的组合&#xf…

2026/7/3 0:05:59 阅读更多 →

周新闻

月新闻