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.rhkb.cn/news/496569.html

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

相关文章

代码随想录Day51 99. 岛屿数量,99. 岛屿数量,100. 岛屿的最大面积。

1.岛屿数量深搜 卡码网题目链接&#xff08;ACM模式&#xff09;(opens new window) 题目描述&#xff1a; 给定一个由 1&#xff08;陆地&#xff09;和 0&#xff08;水&#xff09;组成的矩阵&#xff0c;你需要计算岛屿的数量。岛屿由水平方向或垂直方向上相邻的陆地连接…

邮箱手机号脱敏

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 输入框的脱敏&#xff0c;当输入的时候显示正常&#xff0c;失去焦点部分显示**** 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; 脱敏可以封装 一下成为一个方法&#xff0c;挂…

C语言----变量与常量

目录 变量 变量的分类 常量 分类&#xff1a; 1. 字符型常量 2. 字符串常量 3. 整形常量 4. 浮点型常量 5. 指数常量 6. 标识常量 变量 概念&#xff1a;在程序运行中发生改变的量 定义格式&#xff1a; 存储类型(一般存储类型是可以省略的) 数据类型 变量名 aut…

SQLite本地数据库的简介和适用场景——集成SpringBoot的图文说明

前言&#xff1a;现在项目普遍使用的数据库都是MySQL&#xff0c;而有些项目实际上使用SQLite既足矣。在一些特定的项目中&#xff0c;要比MySQL更适用。 这一篇文章简单的介绍一下SQLite&#xff0c;对比MySQL的优缺点、以及适用的项目类型和集成SpringBoot。 1. SQLite 简介 …

线性代数行列式

目录 二阶与三阶行列式 二元线性方程组与二阶行列式 三阶行列式 全排列和对换 排列及其逆序数 对换 n阶行列式的定义 行列式的性质 二阶与三阶行列式 二元线性方程组与二阶行列式 若是采用消元法解x1、x2的话则得到以下式子 有二阶行列式的规律可得&#xff1a;分…

闲谭Scala(3)--使用IDEA开发Scala

1. 背景 广阔天地、大有作为的青年&#xff0c;怎么可能仅仅满足于命令行。 高端大气集成开发环境IDEA必须顶上&#xff0c;提高学习、工作效率。 开整。 2. 步骤 2.1 创建工程 打开IDEA&#xff0c;依次File-New-Project…&#xff0c;不好意思我的是中文版&#xff1a;…

http 请求总结get

关于get请求传递body的问题 错误代码 有400 , 415 等情况 <!doctype html><html lang"zh"><head><title>HTTP Status 400 – 错误的请求</title><style type"text/css">body {font-family:Tahoma,Arial,sans-seri…

CCF-GESP 等级考试 2023年12月认证C++五级真题解析

2023年12月真题 一、单选题&#xff08;每题2分&#xff0c;共30分&#xff09; 正确答案&#xff1a;C 考察知识点&#xff1a;算法 解析&#xff1a;fiboA 是很好理解的&#xff0c;但是执行效率不高&#xff0c;有的计算是重复的&#xff0c;导致效率低。 正确答案&#xf…

Vscode + gdbserver远程调试开发板指南:

本章目录 步骤环境准备网络配置vscode配置步骤 (全图示例)开发板配置开始调试注意: 每次断开之后&#xff0c;开发板都需要重新启动gdbserver才可调试。 参考链接: 步骤 环境准备 将交叉编译链路径加入$PATH变量&#xff1a;确保系统能够找到所需的工具。 export PATH$PATH:/p…

Docker【初识Docker】

目录 为什么会出现Docker这门技术喃&#xff1f; 应用开发和部署的困境 容器技术的先兆 Docker 的出现&#xff1a;简化容器化 Docker 技术的关键创新&#xff1a; Docker 的广泛应用和变革 什么是 Docker&#xff1f; Docker的历史 早期背景&#xff1a;容器化和虚拟化…

金融租赁系统的发展与全球化战略实施探讨

内容概要 金融租赁系统的演变并非一帆风顺&#xff0c;像一场跌宕起伏的电影。首先&#xff0c;咱们得看看它的起源及现状。随着经济的快速发展&#xff0c;金融租赁逐渐作为一种灵活的融资手段崭露头角。在中国市场中&#xff0c;企业对设备和技术更新换代的需求日益迫切&…

畅游 Linux 开发天地:yum 与 vim 详解

&#x1f31f; 快来参与讨论&#x1f4ac;&#xff0c;点赞&#x1f44d;、收藏⭐、分享&#x1f4e4;&#xff0c;共创活力社区。&#x1f31f; &#x1f6a9;用通俗易懂且不失专业性的文字&#xff0c;讲解计算机领域那些看似枯燥的知识点&#x1f6a9; 前言 在当今数字…

C++--------继承

一、继承的基本概念 继承是 C 中的一个重要特性&#xff0c;它允许一个类&#xff08;派生类或子类&#xff09;继承另一个类&#xff08;基类或父类&#xff09;的属性和方法。这样可以实现代码的重用和建立类之间的层次关系。 #include <iostream>// 基类 class Base…

Doris的SQL原理解析

今天来介绍下Doris的SQL原理解析&#xff0c;主要从语法、解析、分析、执行等几个方面来介绍&#xff0c;可以帮助大家对Doris底层有个清晰的理解~ 一、Doris简介 Apache Doris是一个基于MPP架构的高性能、实时的分析型数据库&#xff0c;能够较好的满足报表分析、即席查询、…

HarmonyOS NEXT 实战之元服务:静态多案例效果(一)

背景&#xff1a; 前几篇学习了元服务&#xff0c;后面几期就让我们开发简单的元服务吧&#xff0c;里面丰富的内容大家自己加&#xff0c;本期案例 仅供参考 先上本期效果图 &#xff0c;里面图片自行替换 效果图1代码案例如下&#xff1a; import { authentication } from…

Elasticsearch:normalizer

一、概述 ‌Elastic normalizer‌是Elasticsearch中用于处理keyword类型字段的一种工具&#xff0c;主要用于对字段进行规范化处理&#xff0c;确保在索引和查询时保持一致性。 Normalizer与analyzer类似&#xff0c;都是对字段进行处理&#xff0c;但normalizer不会对字段进…

零基础微信小程序开发——页面导航之编程式导航(保姆级教程+超详细)

&#x1f3a5; 作者简介&#xff1a; CSDN\阿里云\腾讯云\华为云开发社区优质创作者&#xff0c;专注分享大数据、Python、数据库、人工智能等领域的优质内容 &#x1f338;个人主页&#xff1a; 长风清留杨的博客 &#x1f343;形式准则&#xff1a; 无论成就大小&#xff0c;…

计算机网络 (10)网络层

前言 计算机网络中的网络层&#xff08;Network Layer&#xff09;是OSI&#xff08;开放系统互连&#xff09;模型中的第三层&#xff0c;也是TCP/IP模型中的第二层&#xff0c;它位于数据链路层和传输层之间。网络层的主要任务是负责数据包从源主机到目的主机的路径选择和数据…

云计算时代携程的网络架构变迁

大家觉得有意义和帮助记得及时关注和点赞!!! 前言关于我0 关于携程云 网络演进时间表1 个基于 VLAN 的 L2 网络 1.1 要求1.2 解决方案&#xff1a;OpenStack Provider Network Model1.3 硬件网络拓扑1.4 主机网络拓扑1.5 总结 优势劣势2 个基于 SDN 的大型 L2 网络 2.1 新挑战2…

C#控件开发3—文本显示、文本设值

目录 1.文本设置1&#xff09;定义属性2&#xff09;定义事件 2.本文显示1) 定义属性2&#xff09;定义事件 End 如何绘制一个便捷的文本显示组件、文本设值组件&#xff08;TextShow,TextSet&#xff09;&#xff1f; 绘制此控件的目的就是方便一键搞定标签显示&#xff08;可…