rust windwos 两个edit框

 use winapi::shared::minwindef::LOWORD;
use windows::{core::*,Win32::{Foundation::*,Graphics::Gdi::{BeginPaint, EndPaint, PAINTSTRUCT},System::LibraryLoader::GetModuleHandleA,UI::WindowsAndMessaging::*,},
};// 两个全局静态变量,用于保存 Edit 控件的句柄
static mut EDIT_BOX1: HWND = HWND(std::ptr::null_mut());
static mut EDIT_BOX2: HWND = HWND(std::ptr::null_mut());// 按钮的唯一 ID(WM_COMMAND 中用来识别该按钮的点击事件)
const BTN_ID: u16 = 1001;fn main() -> Result<()> {unsafe {let instance = GetModuleHandleA(None)?;let window_class = s!("window");let wc = WNDCLASSA {hCursor: LoadCursorW(None, IDC_ARROW)?,hInstance: instance.into(),lpszClassName: window_class,style: CS_HREDRAW | CS_VREDRAW,lpfnWndProc: Some(wndproc),..Default::default()};let atom = RegisterClassA(&wc);debug_assert!(atom != 0, "Failed to register window class!");let hwnd = CreateWindowExA(WINDOW_EX_STYLE::default(),window_class,s!("Window with Two Edit Boxes"),WS_OVERLAPPEDWINDOW | WS_VISIBLE,CW_USEDEFAULT,CW_USEDEFAULT,600, // Window width500, // Window heightNone,None,instance,None,);if hwnd.is_err() {panic!("Failed to create main window");}let hwnd_c = hwnd.clone();let hwnd_c1 = hwnd_c.clone();// 创建第一个 Edit 控件let edit_box1 = CreateWindowExA(WINDOW_EX_STYLE::default(),s!("EDIT"),s!(""),                           // 初始文本为空WS_CHILD | WS_VISIBLE | WS_BORDER, // 样式:子控件、可见、带边框10,   // X 位置10,   // Y 位置260,  // 宽度30,   // 高度hwnd.unwrap(),None, // 不需要在 WM_COMMAND 里直接识别它,可填 Noneinstance,None,);if edit_box1.is_err() {panic!("Failed to create edit_box1");}EDIT_BOX1 = edit_box1.unwrap();// 创建第二个 Edit 控件let edit_box2 = CreateWindowExA(WINDOW_EX_STYLE::default(),s!("EDIT"),s!(""),                           WS_CHILD | WS_VISIBLE | WS_BORDER,10,50,260,30,hwnd_c.unwrap(),None,instance,None,);if edit_box2.is_err() {panic!("Failed to create edit_box2");}EDIT_BOX2 = edit_box2.unwrap();// 创建按钮let button1 = CreateWindowExA(WINDOW_EX_STYLE::default(),s!("BUTTON"),s!("Click Me!"),WS_VISIBLE | WS_CHILD,10,100,100,40,hwnd_c1.unwrap(),// 把按钮的 ID 传给 HMENU,这样在 WM_COMMAND 中就能通过 wm_id == BTN_ID 来判断HMENU(BTN_ID  as *mut std::ffi::c_void),instance,None,);if button1.is_err() {panic!("Failed to create button");}let mut message = MSG::default();while GetMessageA(&mut message, None, 0, 0).into() {TranslateMessage(&message);DispatchMessageA(&message);}Ok(())}
}extern "system" fn wndproc(window: HWND, message: u32, wparam: WPARAM, lparam: LPARAM) -> LRESULT {unsafe {match message {WM_COMMAND => {let wm_id = LOWORD(wparam.0 as u32);// 判断是否是我们定义的按钮被点击if wm_id == BTN_ID {// 按钮点击事件:读取两个 Edit 框的内容并显示let text1 = get_edit_text(EDIT_BOX1);let text2 = get_edit_text(EDIT_BOX2);let msg_for_box = format!("Edit Box 1 Content:\n{}\n\nEdit Box 2 Content:\n{}",text1, text2);MessageBoxA(window, PCSTR(msg_for_box.as_ptr()), s!("Two Edit Boxes"), MB_OK);}LRESULT(0)}WM_PAINT => {let mut ps = PAINTSTRUCT::default();let hdc = BeginPaint(window, &mut ps);EndPaint(window, &ps);LRESULT(0)}WM_DESTROY => {PostQuitMessage(0);LRESULT(0)}_ => DefWindowProcA(window, message, wparam, lparam),}}
}/// 读取指定 Edit 控件内的文本(ANSI)到 String
fn get_edit_text(hwnd_edit: HWND) -> String {unsafe {let mut buffer = [0u8; 256];let len = GetWindowTextA(hwnd_edit, &mut buffer);String::from_utf8_lossy(&buffer[..len as usize]).to_string()}
}fn esl_id11(s: &str) -> String {// 1) 取从第 8 个字符开始的子串(假设 s 至少有 9 个字符,否则会 panic,可自行做更多安全检查)let decimal_str = &s[8..];// 2) 将该子串解析为十进制整数let decimal_val = match decimal_str.parse::<u64>() {Ok(val) => val,Err(_) => {// 解析失败时可自定义返回值或处理逻辑eprintln!("Failed to parse '{}' as a decimal number", decimal_str);return "PARSE_ERROR\n".to_string();}};// 3) 转成 16 进制字符串(不做任何零填充)let hex_str = format!("{:x}", decimal_val); // 小写十六进制// 定义一个“安全切片”函数,超出范围时返回空串(Python 的切片不会报错,Rust 默认会 panic)fn safe_slice(st: &str, start: usize, end: usize) -> &str {st.get(start..end).unwrap_or("")}// 4) 按照“每 2 个字符”分段:_s[0:2], _s[2:4], _s[4:6], _s[6:8]let part1 = safe_slice(&hex_str, 0, 2);let part2 = safe_slice(&hex_str, 2, 4);let part3 = safe_slice(&hex_str, 4, 6);let part4 = safe_slice(&hex_str, 6, 8);// 5) 拼接为 "XX-XX-XX-XX\n" 并转大写let esl_id_11 = format!("{}-{}-{}-{}{}", part1, part2, part3, part4, "\n").to_uppercase();// 打印与返回println!("{}", esl_id_11);esl_id_11
}

[package]
name = "to18"
version = "0.1.0"
edition = "2021"# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html[dependencies]
windows-sys="0.59.0"
winapi = { version = "0.3.8", features = ["winuser","libloaderapi"] }
eframe = "0.24"
egui = "0.24"[dependencies.windows]
version = "0.58.0"
features = ["Win32_Foundation","Win32_UI_WindowsAndMessaging","Win32_Security","Win32_System_Threading","Win32_Graphics_Gdi","Win32_System_LibraryLoader","Win32_UI_WindowsAndMessaging",
]

效果图

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

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

相关文章

解锁成长密码:探寻刻意练习之道

刻意练习&#xff0c;真有那么神&#xff1f; 在生活中&#xff0c;你是否有过这样的困惑&#xff1a;每天苦练英语口语&#xff0c;可一到交流时还是支支吾吾&#xff1b;埋头苦学吉他&#xff0c;却总是卡在几个和弦转换上&#xff1b;工作多年&#xff0c;业务能力却似乎陷入…

WPS中如何为指定区域的表格添加行或者列,同时不影响其它表格?

大家好&#xff0c;我是小鱼。 日常工作中会遇到这种情况&#xff1a;在一个Excel工作表中有多个表格&#xff0c;因为后期数据量增加就需要为指定区域的表格添加行或者列&#xff0c;但是不能影响其它表格。这种情况下我们应该怎么操作呢&#xff1f; 为指定区域的表格添加行…

Gitlab17.7+Jenkins2.4.91实现Fastapi项目持续发布版本详细操作(亲测可用)

一、gitlab设置&#xff1a; 1、进入gitlab选择主页在左侧菜单的下面点击管理员按钮。 2、选择左侧菜单的设置&#xff0c;选择网络&#xff0c;在右侧选择出站请求后选择允许来自webhooks和集成对本地网络的请求 3、webhook设置 进入你自己的项目选择左侧菜单的设置&#xff…

模型工作流:自动化的模型内部三角面剔除

1. 关于自动减面 1.1 自动减面的重要性及现状 三维模型是游戏、三维家居设计、数字孪生、VR/AR等几乎所有三维软件的核心资产&#xff0c;模型的质量和性能从根本上决定了三维软件的画面效果和渲染性能。其中&#xff0c;模型减面工作是同时关乎质量和性能这两个要素的重要工…

Unity微信小游戏接入开放数据域

demo地址&#xff1a;https://github.com/wechat-miniprogram/minigame-unity-webgl-transform/tree/main/Demo/Ranking 官方说明&#xff1a; https://github.com/wechat-miniprogram/minigame-unity-webgl-transform/blob/main/Design/OpenData.md 准备一个Canvas&#xff0c…

如何实现 MySQL 的读写分离?

面试题 你们有没有做 MySQL 读写分离&#xff1f;如何实现 MySQL 的读写分离&#xff1f;MySQL 主从复制原理的是啥&#xff1f;如何解决 MySQL 主从同步的延时问题&#xff1f; 面试官心理分析 高并发这个阶段&#xff0c;肯定是需要做读写分离的&#xff0c;啥意思&#x…

go window安装protoc protoc生成protobuf文件

1. 下载&#xff1a; Releases protocolbuffers/protobuf GitHub 2. 解压缩&#xff1a; 3. 配置环境变量&#xff1a; 选择系统变量->Path -> 新增 解压缩后的bin路径 4. 打印版本&#xff1a; protoc --version 5. 安装protoc-gen-go cmd 下输入安装命令&#xff0…

学习C++:标识符命名规则

标识符命名规则&#xff1a; 作用&#xff1a;C规定给标识符&#xff08;变量、常量&#xff09;命名时&#xff0c;有一套自己的规则 标识符不能是关键字 标识符只能由字母、数字、下划线组成 第一个字符必须为字母或下划线 标识符中字母区分大小写 &#xff08;给标识符命…

Linux系统程序设计--6.线程

线程基本概念 刚创建的进程默认有一个线程&#xff0c;成为主控线程(主线程) Linux线程实现 线程标识 Linux线程的创建和终止 pthread_create 龟兔赛跑案例 #include<stdio.h> #include<stdlib.h> #include<pthread.h> #include<math.h>void * th_fn…

5G学习笔记之Non-Public Network

目录 0. NPN系列 1. 概述 2. SNPN 2.1 SNPN概述 2.2 SNPN架构 2.3 SNPN部署 2.3.1 完全独立 2.3.2 共享PLMN基站 2.3.3 共享PLMN基站和PLMN频谱 3. PNI-NPN 3.1 PNI-NPN概述 3.2 PNI-NPN部署 3.2.1 UPF独立 3.2.2 完全共享 0. NPN系列 1. NPN概述 2. NPN R18 3. 【SNPN系列】S…

DevOps实战:用Kubernetes和Argo打造自动化CI/CD流程(1)

DevOps实战&#xff1a;用Kubernetes和Argo打造自动化CI/CD流程&#xff08;1&#xff09; 架构 架构图 本设计方案的目标是在一台阿里云ECS服务器上搭建一个轻量级的Kubernetes服务k3s节点&#xff0c;并基于Argo搭建一套完整的DevOps CI/CD服务平台&#xff0c;包括Argo CD…

清空DNS 缓存

如果遇到修改了host文件&#xff0c;但是IP和域名的映射有问题的情况&#xff0c;可以尝试刷新DNS缓存。 ipconfig/flushdns win建加R建&#xff0c;然后输入cmd&#xff0c;然后回车 然后回车&#xff0c;或者点击确定按钮。 出现如下所示标识清空DNS 缓存成功。

计算机伦理与职业规范1:计算的社会背景

1 第一个阶段&#xff1a;为战争而发展的计算机器 1.1 问题描述 面对全球冲突&#xff0c;一帮数学家开始致力于尽可能快地解决复杂数学问题。冲突双方都会通过无线电发送命令和战略信息&#xff0c;而这些信号也可能被敌方截获。为了防止信息泄露&#xff0c;军方会对信号进…

笔记本通过HDMI转VGA线连接戴尔显示器,wifi不可用或网速变慢

早上开开心心的来使用我的分屏显示器&#xff0c;结果winP开拓展&#xff0c;我的wifi就断掉了&#xff0c;琢磨了好一阵我以为是wifi的问题&#xff0c;发现不进行拓展&#xff0c;网络又好了&#xff0c;一上午就研究这个了&#xff0c;说是hdmi信号干扰了wifi信号啥的额&…

48页PPT|2024智慧仓储解决方案解读

本文概述了智慧物流仓储建设方案的行业洞察、业务蓝图及建设方案。首先&#xff0c;从政策层面分析了2012年至2020年间国家发布的促进仓储业、物流业转型升级的政策&#xff0c;这些政策强调了自动化、标准化、信息化水平的提升&#xff0c;以及智能化立体仓库的建设&#xff0…

计算机网络:应用层 —— 网络应用模式

文章目录 客户—服务器方式和对等方式客户/服务器方式 (C/S方式)工作流程特点 对等方式 (P2P方式)工作流程P2P 应用特点 客户—服务器方式和对等方式 网络应用程序运行在处于网络边缘的不同的端系统上&#xff0c;通过彼此间的通信来共同完成某项任务。 开发一种新的网络应用…

MC服务器异常ip入侵过滤——使用GeoLite2-Country.mmdb离线数据库定位玩家IP归属国家

服务器插件 ipvalidate-for-mcpaper1.21.jar。 在搞一些东西时发现了GeoLite2这个数据库&#xff0c;本质上它应该算是一个离线的ip地理数据库&#xff0c;就是可以查询到IP对应的国家或地区&#xff0c;MAXMIND还提供了更具体的城市数据库&#xff0c;似乎也可以查到ip对应的城…

【计算机视觉基础CV-图像分类】05 - 深入解析ResNet与GoogLeNet:从基础理论到实际应用

引言 在上一篇文章中&#xff0c;我们详细介绍了ResNet与GoogLeNet的网络结构、设计理念及其在图像分类中的应用。本文将继续深入探讨如何在实际项目中应用这些模型&#xff0c;特别是如何保存训练好的模型、加载模型以及使用模型进行新图像的预测。通过这些步骤&#xff0c;读…

sentinel限流+其他

quick-start | Sentinel sentinel 作用 限流 熔断降级 1&#xff0c;限制什么 QPS 并发线程数 2&#xff0c;限制什么 资源&#xff0c;什么资源 服务&#xff0c;方法&#xff0c;接口&#xff0c;或者一段代码 3&#xff0c;实现方式 配置规则 注解 其他 Java常见5种限流…

运行Zr.Admin项目(后端)

1.下载Zr.Admin代码压缩包 https://codeload.github.com/izhaorui/Zr.Admin.NET/zip/refs/heads/main 2.打开项目 我这里装的是VS2022社区版 进入根目录&#xff0c;双击ZRAdmin.sln打开项目 3.安装.net7运行时 我当时下载的代码版本是.net7的 点击安装 点击安装&#xff0…