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 width
            500, // Window height
            None,
            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 里直接识别它,可填 None
            instance,
            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",
]

效果图

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

PostgreSQL 数据库连接

title: PostgreSQL 数据库连接 date: 2024/12/29 updated: 2024/12/29 author: cmdragon excerpt: PostgreSQL是一款功能强大的开源关系数据库管理系统,在现代应用中广泛应用于数据存储和管理。连接到数据库是与PostgreSQL进行交互的第一步,这一过程涉及到多个方面,包括连…

【服务器项目部署】⭐️将本地项目部署到服务器!

目录 &#x1f378;前言 &#x1f37b;一、服务器选择 &#x1f379; 二、服务器环境部署 2.1 java 环境部署 2.2 mysql 环境部署 &#x1f378;三、项目部署 3.1 静态页面调整 3.2 服务器端口开放 3.3 项目部署 ​ &#x1f379;四、测试 &#x1f378;前言 小伙伴们大家好…

网络层知识点梳理

网络层的作用 实现点到点服务的数据透明传送&#xff0c;具体功能包括寻址和路由选择、连接的建立、保持和终止点等。它提供的服务使传输层不需要了解网络中的数据传输和交换技术 网络层单位是分组网际层协议IP ARP地址解析协议 根据IP地址获取物理地址 RARP反地址解析协议 根据…

Spring Boot教程之四十:使用 Jasypt 加密 Spring Boot 项目中的密码

如何使用 Jasypt 加密 Spring Boot 项目中的密码 在本文中&#xff0c;我们将学习如何加密 Spring Boot 应用程序配置文件&#xff08;如 application.properties 或 application.yml&#xff09;中的数据。在这些文件中&#xff0c;我们可以加密用户名、密码等。 您经常会遇到…

windows 上安装nginx , 启停脚本

windows 上安装nginx , 启停脚本 cmd win 查看进程 tasklist /fi "imagename eq nginx.exe" 杀死进程 taskkill -pid 16212 -f 访问 http://127.0.0.1:8081/# 用脚本管理&#xff0c; 创建文件 kill.txt echo off chcp 65001 setlocal enabledel…

【Rust自学】7.5. use关键字 Pt.2 :重导入与换国内镜像源教程

喜欢的话别忘了点赞、收藏加关注哦&#xff0c;对接下来的教程有兴趣的可以关注专栏。谢谢喵&#xff01;(&#xff65;ω&#xff65;) 7.5.1. 使用pub use重新导入名称 使用use将路径导入作用域内后。该名称在词作用域内是私有的。 以上一篇文章的代码为例&#xff1a; m…

vulnhub jangow靶机

1.扫描靶机IP arp-scan -l如果扫不到靶机的话根据以下配置 启动时点击第二个 按回车 继续选择第二个 按e进入编辑 删除"recovery nomodeset" 在末尾添加"quiet splash rw init/bin/bash" Ctrlx 启动进入如下界面 passwd修改root密码 重启电脑登录root修…

Redis Java 集成到 Spring Boot

Hi~&#xff01;这里是奋斗的明志&#xff0c;很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~~ &#x1f331;&#x1f331;个人主页&#xff1a;奋斗的明志 &#x1f331;&#x1f331;所属专栏&#xff1a;Redis &#x1f4da;本系列文章为个人学习笔…

FPGA实现HDMI输出

FPGA实现HDMI输出 对应的视频讲解 FPGA实现HDMI输出 FPGA实现HDMI输出有两种方式 采用专门的HDMI芯片使用RTL完成TMDS编码 受限于FPGA本身时钟频率的限制&#xff0c;使用RTL完成TMDS编码的方式是很难完成高帧率的HDMI输出的&#xff0c;比如1080P60Hz的像素时钟为148.5MHz&…

uniapp——微信小程序,从客户端会话选择文件

微信小程序选择文件 文章目录 微信小程序选择文件效果图选择文件返回数据格式 API文档&#xff1a; chooseMessageFile 微信小程序读取文件&#xff0c;请查看 效果图 选择文件 /*** description 从客户端会话选择文件* returns {String} 文件路径*/ const chooseFile () &g…

SpringCloudAlibaba实战入门之路由网关Gateway初体验(十一)

Spring Cloud 原先整合 Zuul 作为网关组件,Zuul 由 Netflix 公司提供的,现在已经不维护了。后面 Netflix 公司又出来了一个 Zuul2.0 网关,但由于一直没有发布稳定版本,所以 Spring Cloud 等不及了就自己推出一个网关,已经不打算整合 zuul2.0 了。 一、什么是网关 1、顾明…

C#WPF基础介绍/第一个WPF程序

什么是WPF WPF&#xff08;Windows Presentation Foundation&#xff09;是微软公司推出的一种用于创建窗口应用程序的界面框架。它是.NET Framework的一部分&#xff0c;提供了一套先进的用户界面设计工具和功能&#xff0c;可以实现丰富的图形、动画和多媒体效果。 WPF 使用…

【GUI-PyQt5】简介

1. 简介 GUI&#xff1a;带图形的用户接口程序&#xff0c;也就是桌面应用。 2. 分类 2.1 基本窗口控件 QMainWindowQwidgetQlabelQLineEdit菜单工具栏 2.2 高级组件 QTableViewQListView容器多线程 2.3 布局管理 QBoxLayoutQGridLayoutQFormLayout嵌套布局 2.4 信号与…

音视频入门基础:MPEG2-TS专题(22)——FFmpeg源码中,获取TS流的音频信息的实现

音视频入门基础&#xff1a;MPEG2-TS专题系列文章&#xff1a; 音视频入门基础&#xff1a;MPEG2-TS专题&#xff08;1&#xff09;——MPEG2-TS官方文档下载 音视频入门基础&#xff1a;MPEG2-TS专题&#xff08;2&#xff09;——使用FFmpeg命令生成ts文件 音视频入门基础…

点击锁定按钮,锁定按钮要变成解锁按钮,然后状态要从待绑定变成 已锁定

点击锁定按钮&#xff0c;锁定按钮要变成解锁按钮&#xff0c;然后状态要从待绑定变成 已锁定点击解锁按钮&#xff0c;解锁按钮要变成锁定按钮&#xff0c;然后状态要从已锁定变成 待绑定 {"code": 0,"msg": "状态更新成功","data":…

LabVIEW化工实验室设备故障实时监测

化工实验室中&#xff0c;各类设备的运行状态直接影响实验的精度与安全性。特别是重要分析仪器的突发故障&#xff0c;可能导致实验中断或数据失效。为了实现设备运行状态的实时监控与故障快速响应&#xff0c;本文提出了一套基于LabVIEW的解决方案&#xff0c;通过多参数采集、…

常见的CMS漏洞

WordPress 搭建网站 一.上传文件模板 1.从网上随便下载一个模板 2.把我们的模板托出来并改名 写好我们的木马命名为eval;然后进行压缩 3.上传我们的木马模板 上传压缩包即可;网站会帮我们解压 上传成功 找到我们的模板准备连接他 这套网站是开源的;想知道页面模板的路径在哪…

FloatingActionBar组件的用法

文章目录 1 概念介绍2 使用方法3 示例代码我们在上一章回中介绍了如何使用BottomNavigationBar切换页面,本章回中将介绍浮动按钮:FloatingActionBar。闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 浮动按钮就是悬浮在屏幕上的按钮,通常们于屏幕右下角或者底部中央位置,…

计算机网络习题( 第3章 物理层 第4章 数据链路层 )

第3章 物理层 一、单选题 1、下列选项中&#xff0c;不属于物理层接口规范定义范畴的是&#xff08; &#xff09;。 A、 接口形状 B、 引脚功能 C、 传输媒体 D、 信号电平 正确答案&#xff1a; C 2、在物理层接口特性中&#xff0c;用于描述完成每种功能的事件发…

SemiDrive E3 MCAL 开发系列(6)– Icu 模块的使用

一、 概述 本文将会介绍 SemiDrive E3 MCAL Icu 模块的简介以及基本配置&#xff0c;其中还会涉及到 Xtrg 模块的配置。此外会结合实际操作的介绍&#xff0c;帮助新手快速了解并掌握这个模块的使用&#xff0c;文中的 MCAL 是基于 PTG3.0 的版本&#xff0c;开发板是官方的 …