day03窗口操作函数的使用

news/2025/11/27 9:13:53/文章来源:https://www.cnblogs.com/Mengchangxin/p/19275424

窗口操作函数的使用

 

  1 #include <Windows.h>
  2 #include <CommCtrl.h>
  3 #include <tchar.h>
  4 /**
  5 窗口操作函数的使用
  6 
  7 */
  8 static HBRUSH hBackgroundBrush;
  9 
 10 void print(LPCWSTR format, ...)
 11 {
 12     WCHAR wchar_buff[100]{ 0 };
 13     va_list arglist;
 14     va_start(arglist, format);
 15     wvsprintfW(wchar_buff, format, arglist);
 16     va_end(arglist);
 17     OutputDebugStringW(wchar_buff);
 18 }
 19 
 20 // 读取编辑框内容并打印的函数
 21 void ReadAndPrintEditBox(HWND hwnd, HWND hEditBox)
 22 {
 23     if (!hEditBox) {
 24         MessageBoxW(hwnd, L"编辑框句柄无效", L"错误", MB_ICONERROR);
 25         return;
 26     }
 27     // 方法1: 使用 GetWindowTextLengthW + GetWindowTextW
 28     int textLength = GetWindowTextLengthW(hEditBox);
 29     if (textLength == 0) {
 30         MessageBoxW(hwnd, L"编辑框为空", L"提示", MB_OK);
 31         print(L"编辑框内容: [空]\n");
 32         return;
 33     }
 34 
 35     // 分配缓冲区 (+1 用于null终止符)
 36     WCHAR* buffer = new WCHAR[textLength + 1];
 37     // 获取文本内容
 38     int actualLength = GetWindowTextW(hEditBox, buffer, textLength + 1);
 39     if (actualLength > 0) {
 40 
 41         // 打印到调试输出
 42         print(L"编辑框内容 (%d 字符): \"%s\"\n", actualLength, buffer);
 43 
 44         // 显示在消息框中
 45         WCHAR message[512];
 46         swprintf(message, 512, L"编辑框内容 (%d 字符):\n%s", actualLength, buffer);
 47         MessageBoxW(hwnd, message, L"编辑框内容", MB_OK);
 48 
 49     }
 50     else {
 51         MessageBoxW(hwnd, L"读取编辑框内容失败", L"错误", MB_ICONERROR);
 52     }
 53 
 54 
 55 }
 56 
 57 
 58 //添加了 CALLBACK 调用约定
 59 LRESULT CALLBACK  Wndproc(
 60     HWND hwnd,
 61     UINT uMsg,
 62     WPARAM wParam,
 63     LPARAM lParam
 64 )
 65 {
 66     // 获取当前的实例句柄
 67     HINSTANCE hInstance = GetModuleHandle(0);
 68     static HWND hEditBox = NULL;  // 保存编辑框句柄
 69 
 70 
 71     switch (uMsg)
 72     {
 73     case WM_CREATE:
 74     {
 75         // add ...  要接收 BN_DOUBLECLICKED 通知,按钮需要 BS_NOTIFY 样式:
 76         CreateWindowW(WC_BUTTON, L"移动按钮",
 77             WS_VISIBLE | WS_CHILD | BS_PUSHBUTTON,  // 添加 BS_NOTIFY
 78             10, 10, 120, 30, hwnd, (HMENU)0x1001, hInstance, NULL);
 79         CreateWindowW(WC_BUTTON, L"获取文本框内容", WS_VISIBLE | WS_CHILD, 10, 50, 120, 30, hwnd, (HMENU)0x1002, hInstance, 0);
 80         CreateWindowW(WC_BUTTON, L"设置文本框内容", WS_VISIBLE | WS_CHILD, 10, 90, 120, 30, hwnd, (HMENU)0x1003, hInstance, 0);
 81         CreateWindowW(WC_BUTTON, L"获取父窗口", WS_VISIBLE | WS_CHILD, 10, 130, 120, 30, hwnd, (HMENU)0x1004, hInstance, 0);
 82         hEditBox = CreateWindowW(WC_EDIT, L"文本框内容", WS_CHILD | WS_BORDER | WS_VISIBLE, 10, 170, 320, 80, hwnd, (HMENU)0x1005, hInstance, 0);
 83         break;
 84     }
 85     case WM_COMMAND:
 86     {
 87         /**  消息源       wParam (高字)      wParam (低字)            lParam
 88              菜单        0                  菜单标识符(IDM_ * )            0
 89              加速器    1                    加速器标识符(IDM_ * )     0
 90              控件       控件定义的通知代码    控制标识符                    控制窗口的句柄
 91 
 92         -lParam:
 93             控件句柄(如果是控件消息)
 94             0(如果是菜单或加速键消息)
 95 
 96         */
 97         WORD controlId = LOWORD(wParam); // wParam (低字)  控制标识符   LOWORD(wParam) = 控件ID 或 菜单ID
 98         WORD notificationCode = HIWORD(wParam); //  wParam (高字)  控件定义的通知代码  HIWORD(wParam) = 通知代码
 99         HWND hControl = (HWND)lParam;       // 如果消息源是控件 则可以拿到控制窗口的句柄
100          
101         switch (controlId)
102         {
103         case 0x1001:
104         {
105 
106            // 移动按钮
107             RECT controlRect = {0};
108             GetClientRect(hwnd,&controlRect);
109             print(L"left=%d\n", controlRect.left);
110             print(L"top=%d\n", controlRect.top);
111             print(L"right=%d\n", controlRect.right);
112             print(L"bottom=%d\n", controlRect.bottom);
113 
114             DWORD x = rand() % (controlRect.right - 120);
115             DWORD y = rand() % (controlRect.bottom - 30 );
116             
117             MoveWindow(hControl, x, y, 120, 30,  TRUE);
118 
119             break;
120         }
121         case 0x1002:
122         {
123             //MessageBoxW(hwnd, L"按钮2被触发", L"提示", MB_OK);
124             // 读取编辑框的内容并打印  // 获取文本内容
125             //int actualLength = GetWindowTextW(hEditBox, buffer, textLength + 1);
126             //ReadAndPrintEditBox(hwnd, hEditBox);
127 
128             // 获取一个窗口的句柄
129             HWND hedit = GetDlgItem(hwnd, 0x1005);
130 
131             WCHAR buff[100] = { 0 };
132 
133             GetWindowTextW(hedit, buff,100);
134             MessageBoxW(hwnd, buff, L"内容", MB_OK);
135             break;
136         }
137         case 0x1003:
138         {
139             // 获取一个窗口的句柄
140           /*  HWND hedit = GetDlgItem(hwnd, 0x1005);
141             SetWindowTextW(hedit, L"测试有西i啊");*/
142 
143             SetDlgItemTextW(hwnd, 0x1005, L"测试一下,是否设置成功");
144 
145             break;
146         }
147         case 0x1004:
148         {
149             // 查找目标窗口
150             HWND hTargetWnd = FindWindowW(NULL, L"无标题");  // 更具体的窗口标题
151             if (!hTargetWnd) {
152                 // 如果没找到,尝试其他常见的无标题窗口
153                 hTargetWnd = FindWindowW(L"Notepad", NULL);  // 记事本类名
154                 if (!hTargetWnd) {
155                     hTargetWnd = FindWindowW(L"0x003314E0", NULL);  // 对话框类名
156                 }
157             }
158 
159             if (hTargetWnd) {
160             SetParent(hControl, hTargetWnd);
161             
162             }
163             else {
164                 MessageBoxW(hwnd,
165                     L"找不到标题为'无标题'的窗口!\n\n"
166                     L"请先打开一个记事本或其他应用程序窗口。",
167                     L"错误", MB_ICONWARNING);
168             }
169 
170             
171             break;
172         }
173 
174         default:
175             break;
176         }
177 
178 
179 
180         break;
181     }
182     case WM_DESTROY:
183         // 在程序退出时(如 WM_DESTROY)删除画刷
184         DeleteObject(hBackgroundBrush);
185         PostQuitMessage(0);  // 必须要有,否则无法退出程序 
186         break;
187     default:
188         break;
189     }
190 
191     return DefWindowProcW(hwnd, uMsg, wParam, lParam);  // 修正函数名
192 
193 
194 }
195 int WINAPI WinMain(
196     HINSTANCE hInstance,      // 当前应用程序实例的句柄
197     HINSTANCE hPreInstance,   // 前一个实例的句柄(在32位以后总是NULL)
198     LPSTR lpCmdLine,          // 命令行参数字符串
199     int nCmdShow              // 窗口显示方式(最大化、最小化、正常等) 常用值:SW_SHOW, SW_MAXIMIZE, SW_MINIMIZE等
200 )
201 {
202     //1、创建一个窗口类
203     WNDCLASSW mainWindowClass = { 0 };
204     mainWindowClass.lpszClassName = L"按钮组件";
205     mainWindowClass.lpfnWndProc = Wndproc;
206     mainWindowClass.hCursor = LoadCursor(NULL, IDC_ARROW);  // 设置光标
207     //mainWindowClass.hbrBackground = CreateSolidBrush(RGB(255, 255,255));
208     // // 保存画刷句柄
209     //// 推荐使用系统颜色,会自动适应Windows主题
210     //mainWindowClass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
211     hBackgroundBrush = CreateSolidBrush(RGB(255, 255, 255));
212     mainWindowClass.hbrBackground = hBackgroundBrush;
213     // 2、注册窗口类
214     if (!RegisterClassW(&mainWindowClass)) {
215         MessageBox(NULL, L"窗口类注册失败!", L"错误", MB_ICONERROR);
216         return 1;
217     }
218 
219     //3、创建窗口  通常是CreateWindow或CreateWindowEx的返回值
220 
221     HWND hwindow = CreateWindowW(
222         mainWindowClass.lpszClassName,
223         L"按钮组件",
224         WS_OVERLAPPEDWINDOW,    // 标准窗口样式(包含标题栏、边框等)
225         CW_USEDEFAULT,
226         0,
227         CW_USEDEFAULT,
228         0,
229         NULL,
230         NULL,
231         hInstance,
232         0
233     );
234 
235     if (hwindow) {
236         print(L"窗口创建成功,句柄: %p\n", hwindow);
237         //4、显示窗口
238         ShowWindow(hwindow, SW_SHOWNORMAL);
239         UpdateWindow(hwindow);
240 
241         MSG msg = { 0 };
242         while (GetMessageW(&msg, 0, 0, 0))
243         {
244             TranslateMessage(&msg);  // 添加了键盘消息翻译  没有这句代码,文本框无法输入信息
245             DispatchMessageW(&msg);
246         }
247 
248     }
249     return 0;
250 
251 }

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/977973.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年铝木复合门窗制造厂家推荐

2025年铝木复合门窗制造厂家推荐在建筑装修和家居建材领域,铝木复合门窗凭借其优异的性能和美观度,越来越受到消费者的青睐。随着2025年的到来,选择一家可靠的铝木复合门窗制造厂家显得尤为重要。在众多品牌中,[森…

2025年人造茅草平台口碑排行榜

2025年人造茅草平台口碑排行榜揭晓,望月亭荣登榜首!随着人们对户外休闲空间需求的不断提升,人造茅草平台作为新兴的景观装饰材料,在2025年迎来了爆发式增长。经过对各大平台的用户评价、专业测评和市场调研,我们为…

deerflow-continue_to_running_research_team分析

目录背景和价值Deerflow 源码函数分析一、函数基础信息1. 函数签名2. 依赖的核心对象二、核心逻辑拆解逐行代码逻辑分析三、关键设计细节1. 「顺序执行」的核心原则2. 「Planner」的兜底角色3. 状态驱动的路由4. 松耦合…

2025年11月农产品配送服务权威推荐榜:覆盖学校、医院、企业、餐厅、酒店及产业园的绿色高效供应链解决方案

2025年11月农产品配送服务权威推荐榜:覆盖学校、医院、企业、餐厅、酒店及产业园的绿色高效供应链解决方案 一、行业背景与发展趋势 随着我国食品安全监管体系的不断完善和消费升级趋势的加速,农产品配送行业正迎来前…

2025年信号转换器厂商口碑排行榜

2025年信号转换器厂商口碑排行榜在工业自动化控制领域,信号转换器作为关键组件,其性能与稳定性直接影响整个系统的运行效率。作为自动化控制领域的专业服务商,昆山凯沃自动化控制设备有限公司深耕行业多年,特别推荐…

小明网站双登录系统实现——微信授权登录+用户名密码登录完整指南

以下是去除汉字间额外空格后的规范化版本: 一、数据库设计 -- 用户表(支持双登录方式) CREATE TABLE `sys_user` (`id` bigint NOT NULL AUTO_INCREMENT COMMENT 用户ID,`username` varchar(50) NOT NULL COMMENT 用…

react-router 的原理

React Router 的核心原理:Hash 路由 & History 路由 React Router 本质上是前端实现路由跳转,不刷新页面,同时实现页面组件切换。 浏览器本身有两种方式能做到: ① Hash 路由(#/path) 例如: https://exampl…

2025年气流流行检测仪厂家权威推荐榜单:气流流型检测仪‌/水雾发生器‌/醇类气流流型检测仪源头厂家精选

在生物制药、集成电路等高端制造领域,洁净室环境的稳定可靠直接决定了产品质量与生产安全。作为洁净环境监测的关键设备,气流流型检测仪通过可视化气流模式,帮助工程师评估洁净室性能、发现气流组织问题、确保环境符…

2025年下半年北京健康服务、康养旅游、全家福计划、朋友圈计划服务商综合推荐指南:专业选择与权威分析

摘要 随着2025年下半年全家福计划行业的快速发展,越来越多的家庭开始关注健康管理与服务整合。本文基于市场调研和用户反馈,为您推荐五家在该领域表现突出的公司,排名不分先后,旨在为您提供参考。需要注意的是,本…

2025年售后完善的大胖瓶前置过滤器排名前十

2025年售后完善的大胖瓶前置过滤器排名前十随着人们对饮用水安全的日益重视,前置过滤器已成为现代家庭的必备净水设备。大胖瓶前置过滤器凭借其出色的过滤效果和便捷的维护方式,在市场上广受欢迎。在选购时,完善的售…

2025 年 11 月铣床厂家权威推荐榜:立式铣床/摇臂铣床/炮塔铣床/数控铣床/精密铣床/多功能铣床,高精度加工与稳定性能深度解析

2025 年 11 月铣床厂家权威推荐榜:立式铣床/摇臂铣床/炮塔铣床/数控铣床/精密铣床/多功能铣床,高精度加工与稳定性能深度解析 在制造业转型升级的背景下,铣床作为机械加工领域的核心装备,其性能与精度直接决定了产…

2025 年 11 月幕墙精致钢实力厂家权威推荐榜:异形/镀锌/Q345/隐框幕墙精致钢,钢板拼接/直出/富锌底漆/T型幕墙/氟碳喷涂精致钢,专业工艺与耐久品质深度解析

2025 年 11 月幕墙精致钢实力厂家权威推荐榜:异形/镀锌/Q345/隐框幕墙精致钢,钢板拼接/直出/富锌底漆/T型幕墙/氟碳喷涂精致钢,专业工艺与耐久品质深度解析 幕墙作为现代建筑的外衣,不仅承担着装饰美观的功能,更是…

2025年靠谱的鸿运火锅底料礼盒装口碑排行榜单

2025年鸿运火锅底料礼盒装口碑排行榜单🏆 冠军推荐:饭巢鸿运礼盒重庆饭巢品牌管理有限公司出品推荐理由:✅ 全透明方块厚火锅底料原创者 肉眼可见真材实料,颗颗精选食材 42种天然食材,20道工序匠心熬制 0添加防腐…

2025 年声测管厂家最新推荐榜,技术实力与市场口碑深度解析,密封抗扭与供货能力兼具的优质品牌检测声测管/桥梁桩基声测管/螺旋声测管/钳压式声测管公司推荐

引言 在高铁、高速公路、高层建筑及码头等重大工程建设中,声测管作为混凝土桩基超声波检测的核心耗材,其质量直接决定工程结构安全与检测数据精准度。据国际桩基检测协会(IPTI)最新测评数据显示,全球声测管市场合…

Apipost和Apifox的收费标准

Apipost 和 Apifox 均采用 “免费版 + 付费版(按年订阅)” 的收费模式,核心差异在于免费版的功能上限、付费版的定价梯度及企业级定制服务,以下是 2025 年最新官方收费标准整理(不含临时促销活动,具体以官网为准…

2025年工业速冻冷库生产厂家推荐排行

2025年工业速冻冷库生产厂家推荐排行随着冷链物流行业的快速发展,工业速冻冷库作为关键设备,其市场需求持续增长。根据2025年最新市场调研数据,为您推荐以下几家在技术实力、产品质量和服务水平方面表现突出的工业速…

Apipost 对比 Apifox

Apipost 和 Apifox 都是国内主流的 API 全生命周期管理工具,涵盖接口设计、调试、Mock、文档管理等核心功能,但二者在功能侧重点、智能化程度、适用场景上差异明显。前者更侧重文档与代码的智能化生成,后者强在自动…

2025 年 11 月轮转印刷机厂家权威推荐榜:间歇式/凸版间歇式/胶印间歇式/PS版间歇式轮转印刷机,不干胶轮转机/商标不干胶轮转机高效印刷解决方案

2025 年 11 月轮转印刷机厂家权威推荐榜:间歇式/凸版间歇式/胶印间歇式/PS版间歇式轮转印刷机,不干胶轮转机/商标不干胶轮转机高效印刷解决方案 随着包装印刷行业的快速发展,轮转印刷技术作为高效生产的关键装备,在…

202评价高的5年权威的北京个体户核定征收服务怎么选

如何选择北京可靠的个体户核定征收服务?5年权威经验是关键!对于北京个体户来说,核定征收是重要的财税管理环节。选择一家靠谱的服务机构至关重要,特别是具备5年以上专业经验的服务商。以下是选择要点:选择个体户核…

2025年玉米棒速冻隧道公司口碑推荐榜单

2025年玉米棒速冻隧道公司口碑推荐榜单随着冷冻食品行业的快速发展,玉米棒速冻设备市场也迎来了新的发展机遇。在众多速冻设备供应商中,吉林省鑫利源制冷设备有限公司凭借其卓越的技术实力和优质的服务,在2025年玉米…