开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 494|回复: 33
打印 上一主题 下一主题
收起左侧

[易语言纯源码] 自绘窗口支持Unicode源码

[复制链接]
结帖率:100% (23/23)
跳转到指定楼层
楼主
发表于 昨天 19:26 | 只看该作者 |只看大图 回帖奖励 |正序浏览 |阅读模式   湖北省武汉市
分享源码
界面截图: -
是否带模块: 纯源码
备注说明: -
注意:此源码是需要使用dll的,dll是用C++编写,C++源码也一起开源
如果你需要原生易语言API命令的可查看我分享的这个帖子:https://bbs.ijingyi.com/forum.php?mod=viewthread&tid=14873035&extra=









Emoji Window DLL - C++ 版本

使用 C++ 和 Direct2D 实现彩色 Emoji 显示的 DLL。

项目结构

emoji_window_cpp/
├── emoji_window.sln          # Visual Studio 解决方案
├── emoji_window/
│   ├── emoji_window.vcxproj  # 项目文件
│   ├── dllmain.cpp           # DLL 入口
│   ├── emoji_window.h        # 头文件
│   ├── emoji_window.cpp      # 主实现
│   ├── renderer.h            # 渲染器头文件
│   ├── renderer.cpp          # 渲染器实现
│   └── exports.def           # 导出定义
└── output/
    └── emoji_window.dll      # 编译输出

编译步骤

1. 使用 Visual Studio(推荐)

  1. 安装 Visual Studio 2019 或更高版本
  2. 打开 emoji_window.sln
  3. 选择 Release | x64 配置
  4. 生成解决方案(Ctrl+Shift+B)
  5. DLL 输出到 x64\Release\emoji_window.dll

2. 使用命令行(MSBuild)

"C:\Program Files\Microsoft Visual Studio\2022\Community\MSBuild\Current\Bin\MSBuild.exe" emoji_window.sln /p:Configuration=Release /p:Platform=x64

API 文档

创建窗口

```c++
HWND create_window(const char* title, int width, int height);


### 创建 Emoji 按钮(字节集)

```c++
int create_emoji_button_bytes(
    HWND parent,
    const unsigned char* emoji_bytes,
    int emoji_len,
    const unsigned char* text_bytes,
    int text_len,
    int x, int y, int width, int height,
    unsigned int bg_color
);

设置按钮点击回调

```c++
typedef void (__stdcall *ButtonClickCallback)(int button_id);
void __stdcall set_button_click_callback(ButtonClickCallback callback);


### 设置窗口大小改变回调

当自绘窗口大小被用户或代码改变时触发。

```c++
typedef void (__stdcall *WindowResizeCallback)(HWND hwnd, int width, int height);
void __stdcall SetWindowResizeCallback(WindowResizeCallback callback);
参数 说明
hwnd 发生大小改变的窗口句柄
width 窗口新的客户区宽度(像素)
height 窗口新的客户区高度(像素)

易语言声明:

.DLL命令 设置窗口大小改变回调, , "emoji_window.dll", "SetWindowResizeCallback"
    .参数 回调函数指针, 子程序指针

易语言使用示例:

.子程序 窗口大小改变回调, , 公开
.参数 窗口句柄_, 整数型
.参数 新宽度, 整数型
.参数 新高度, 整数型

' 窗口大小改变时更新布局
调试输出 ("窗口大小改变: " + 到文本 (新宽度) + " x " + 到文本 (新高度))

' 注册(程序初始化时调用一次)
设置窗口大小改变回调 (&窗口大小改变回调)

注意:回调必须在创建窗口后、运行消息循环前完成注册。


设置窗口被关闭回调

当自绘窗口被关闭时触发(用户点击关闭按钮 ×,或代码调用 destroy_window,均会触发 WM_DESTROY)。

```c++
typedef void (stdcall *WindowCloseCallback)(HWND hwnd);
void
stdcall SetWindowCloseCallback(WindowCloseCallback callback);


| 参数 | 说明 |
|------|------|
| `hwnd` | 被关闭的窗口句柄(触发时 HWND 已失效,仅用于识别是哪个窗口) |

**易语言声明:**

.DLL命令 设置窗口关闭回调, , "emoji_window.dll", "SetWindowCloseCallback"
.参数 回调函数指针, 子程序指针


**易语言使用示例:**

.子程序 自绘窗口关闭回调, , 公开
.参数 已关闭的窗口句柄, 整数型

' 重置句柄变量,防止后续误用失效的 HWND
调试输出 ("自绘窗口已关闭, HWND=" + 到文本 (已关闭的窗口句柄))
.如果真 (窗口句柄 = 已关闭的窗口句柄)
窗口句柄 = 0
.如果真结束
TabControl句柄 = 0

' 注册(程序初始化时调用一次)
设置窗口关闭回调 (&自绘窗口关闭回调)


> **注意**:
> - 回调触发时窗口已销毁,不要在回调内对该 `hwnd` 执行任何窗口操作。
> - 只有顶层窗口(非子窗口)关闭时才会触发此回调。
> - 若程序同时运行了 `run_message_loop`,关闭窗口后消息循环会自动退出;若由易语言消息循环驱动,则不会影响易语言进程。

---

### 运行消息循环

```c++
int run_message_loop();

易语言调用示例

参见 examples/test.txt

技术细节

  • 渲染引擎: Direct2D
  • 文字渲染: DirectWrite
  • 彩色 Emoji: D2D1_DRAW_TEXT_OPTIONS_ENABLE_COLOR_FONT
  • 字体: Segoe UI Emoji
  • 编译器: MSVC 2019+
  • 平台: Windows 10+

依赖项

  • Windows SDK 10.0 或更高
  • Direct2D
  • DirectWrite
  • 无需额外运行时(静态链接)

许可证

MIT License



源码回复可见
游客,如果您要查看本帖隐藏内容请回复

点评

新增编辑框文本垂直居中与按键回调,已更新到github仓库   美国  发表于 2 小时前
来点个赞,进账2精币   广东省惠州市  发表于 昨天 19:56

评分

参与人数 1好评 +1 精币 +3 收起 理由
呵呵仙 + 1 + 3 奉上小小红包希望笑纳

查看全部评分


结帖率:100% (23/23)

签到天数: 7 天

来自 2楼
 楼主| 发表于 昨天 19:27 | 只看该作者   湖北省武汉市
应该是不会再写自绘窗口的源码了,之前分享的一个API源码,加上这个C++的dll源码,自此告一段落,基本上满足了大部分需求
都是自己写单子需要用到的自绘
回复 支持 反对

使用道具 举报

结帖率:44% (4/9)

签到天数: 2 天

32
发表于 半小时前 | 只看该作者   北京市北京市
牛逼了这个源码
回复 支持 反对

使用道具 举报

结帖率:0% (0/1)

签到天数: 6 天

31
发表于 半小时前 | 只看该作者   阿根廷
666666666666666
回复 支持 反对

使用道具 举报

签到天数: 2 天

30
发表于 半小时前 | 只看该作者   广东省东莞市
论坛有你更精彩
回复 支持 反对

使用道具 举报

签到天数: 2 天

29
发表于 半小时前 | 只看该作者   广东省东莞市
论坛有你更精彩
回复 支持 反对

使用道具 举报

签到天数: 7 天

28
发表于 1 小时前 | 只看该作者   湖北省鄂州市
感谢分享
回复 支持 反对

使用道具 举报

27
发表于 1 小时前 | 只看该作者   辽宁省沈阳市
感谢分享
回复 支持 反对

使用道具 举报

结帖率:50% (7/14)

签到天数: 6 天

26
发表于 2 小时前 | 只看该作者   安徽省淮北市
感谢分享
回复 支持 反对

使用道具 举报

结帖率:0% (0/2)

签到天数: 5 天

25
发表于 2 小时前 | 只看该作者   广西壮族自治区玉林市
感谢分享,很给力!~
回复 支持 反对

使用道具 举报

签到天数: 6 天

24
发表于 3 小时前 | 只看该作者   内蒙古自治区呼和浩特市

论坛有你更精彩
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备2025452707号) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表