热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

开发笔记:[易语言][ExDui][Tuturial]0.Hello,world!

篇首语:本文由编程笔记#小编为大家整理,主要介绍了[易语言][ExDui][Tuturial]0.Hello,world!相关的知识,希望对你有一定的参考价值。

篇首语:本文由编程笔记#小编为大家整理,主要介绍了[易语言][ExDui][Tuturial]0.Hello,world!相关的知识,希望对你有一定的参考价值。



At the Beginning...

由于近期爱好摸鱼,并且对Gui开发萌生一丝兴趣。在尝试WPF被虐,使用Qt却不太喜欢整套庞大的框架后……

I choose E language!

重拾了小学用的工具……

据我所知,易语言的Gui除了native E之外,主要是Ex_Ui和ExDui两家,而Ex_Ui由于高度封装,相对效率低一些,而逼格可能不如ExDui。

并且ExDui似乎有多语言支持,通用性更好。

于是选择了EXDUI,开始学习……


Install

安装的话,去官方论坛下载即可,提供了2个模块,大概是封装了dll函数。

核心应该是Lib_ExDui_Helper。

推荐加入官方群,有一些资源以后或许会用到。


Coding

使用_启动子程序的方式进行启动,使用黑月3.6.6进行编译,运行易语言核心库。

在群内下载了窗口创建Demo,开始看源码学习……(官方包中也有带Demo)。

发现必须使用主题包,而官方文档显示ThemeMaker仍在开发中,对主题包如何制作实在是疑惑。后在群文件中发现了主题打包器。

这里直接使用Demo中自带的default主题。


LoadTheme

主题包可以作为独立外置文件,也可以作为res资源文件内嵌在程序中。这里使用外置的写法,将主题包default.ext放在同目录下,写代码:

Bin(即字节集) Theme = ReadFile("default.ext");

由于不了解主题变量调用机制,声明为全局变量。


InitEngine

初始化ExDui引擎,查官方文档查到:

bool __stdcall
Ex_Init (
HINSTANCE hInstance,
DWORD dwGlobalFlags,
HCURSOR hDefaultCursor,
LPCTSTR lpszDefaultClassName,
LPVOID lpDefaultTheme,
DWORD dwDefaultThemeLen,
LPVOID lpDefaultI18N,
DWORD dwDefaultI18NLen
);

hInstance
Type: HINSTANCE
动态库(DLL)的实例句柄 可为NULL
dwGlobalFlags
Type: DWORD
全局初始化标识 参见 EXGF?
hDefaultCursor
Type: HCURSOR
默认鼠标指针句柄 可为NULL
lpszDefaultClassName
Type: LPCTSTR
默认窗口类名 可为NULL
lpDefaultTheme
Type: LPVOID
默认主题包指针
dwDefaultThemeLen
Type: DWORD
默认主题包缓冲区长度
lpDefaultI18N
Type: LPVOID
默认语言包指针
dwDefaultI18NLen
Type: DWORD
默认语言包指针缓冲区长度
Return Value / 返回值
Type: BOOL
初始化引擎

令我比较迷茫的是第一个参数,动态库的实例句柄,发现Demo中使用了GetModuleHandleW的API,查了查MSDN,得知是以名称获取模块句柄的API。

Demo中如此使用:

GetModuleHandleW(0);

参数为0(其实应该是代表NULL)时返回调用者模块的句柄。

易语言Dll声明如下:

技术图片

第二个参数是初始化标识,查到官方文档:

Click

注意的是,如果有多个标识符,使用或运算来合并。

第三个第四个参数无特殊需要直接为0即可,默认主题包指针则传入theme变量的地址。

对易语言中取得地址的操作有些疑问,发现YHan.Helper已经封装了相关函数,使用了机器码……

主题包长度则直接取字节集长度即可。

不使用语言包,后两个参数也写NULL。

Init返回True的话,就是初始化成功了。


Make My Window


Set Properties

随后想想设置窗口的属性。

标题等设置似乎都要提供指针,因此YHanHelper的确是至关重要啊……

发现Demo中使用了A2W函数,Google查后发现是转宽字符的函数,大概是为了支持中文。

A2W, Ansi to w_char?仅个人猜测。

这个函数我也不熟悉。

声明字节集型的变量,作为Title和ClassName:

Bin Title = A2W("Hello,ExDui!"),ClassName = A2W("Demo");

Register ClassName

随后需要注册窗口类名,这个原因同样令我疑惑,上网查到了一位网友的回答:


关于窗口类

每一个窗口对应一个窗口过程,而该窗口过程是被所有使用这个窗口类的窗口所共享的。每一个进程在要创建窗口之前,必须要先注册改窗口所属的窗口类。注册窗口类就是将窗口过程,窗口风格以及其他窗口属性用一个类名相关连起来。当进程在CreateWindow, CreateWindowEx中使用窗口类名时,所创建的窗口属性就和窗口类中的各属性相联系了。

大概可以理解为注册窗口类模板,而显示的窗口是实例。感性理解一下,具体我也并不明白,或有理解错误。

使用此API:Click

如果图标、鼠标等不打算特殊设置大概都可以写NULL?



Create Window

注册好窗口类名之后,可以用该类名来创建一个窗口实例。

应该调用的是Windows API,封装在ExDui的lib中了,返回Windows窗口句柄。

ExDui的文档:Click

用整数型保存下来。

随后使用ExDui引擎托管窗口,使用API:

int Ex_DuiBindWindowEx(int hWnd,int hTheme,int dwStyle,int lParam,int lpfnMsgProc);
//Ex_DuiBindWindow(int hWnd,int hTheme,int dwStyle);

这个API在官方的文档中查不到,应该是文档还不完善,看起来dwStyle的参数跟上面的windows API重复了,Demo中是直接使用这个函数设置的dwStyle,猜测应该是ExDui会自行实现dwStyle。

lParam用途为止,写NULL。

lpfnMsgProc是绑定消息循环的函数地址用的,先声明一个空子程序,到整数转成整数型绑上去。

常量是一样的。

返回引擎句柄,也用整数型保存。

用这个句柄可以访问引擎,比如Ex_DuiGetLong之类的看起来像是访问成员变量的API等。

我们给窗口设置一个背景颜色:

Ex_DUISetLong (m_hExDui, #EWL_CRBKG, RGB2ARGB (rgb (42, 41, 49), 250))

MsgProc

消息循环类似于这样:

while(true)
MsgProc();

也就是说,会一直占用线程直到窗口被关闭。

消息循环应该也是Windows API中的,ExDui要求的函数如下:

技术图片

其实返回值的用处我还没查清楚,以后再测测吧。


Final

写完之后,按下F5,一个窗口就出现了!

技术图片

程序体积方面,用了黑月汇编模式编译仅14kb,而ExDui的dll 700kb,体积还是比较小巧的。


Src

Lanzous下载


推荐阅读
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • 如何用JNI技术调用Java接口以及提高Java性能的详解
    本文介绍了如何使用JNI技术调用Java接口,并详细解析了如何通过JNI技术提高Java的性能。同时还讨论了JNI调用Java的private方法、Java开发中使用JNI技术的情况以及使用Java的JNI技术调用C++时的运行效率问题。文章还介绍了JNIEnv类型的使用方法,包括创建Java对象、调用Java对象的方法、获取Java对象的属性等操作。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 如何自行分析定位SAP BSP错误
    The“BSPtag”Imentionedintheblogtitlemeansforexamplethetagchtmlb:configCelleratorbelowwhichi ... [详细]
  • SpringBoot uri统一权限管理的实现方法及步骤详解
    本文详细介绍了SpringBoot中实现uri统一权限管理的方法,包括表结构定义、自动统计URI并自动删除脏数据、程序启动加载等步骤。通过该方法可以提高系统的安全性,实现对系统任意接口的权限拦截验证。 ... [详细]
  • JVM 学习总结(三)——对象存活判定算法的两种实现
    本文介绍了垃圾收集器在回收堆内存前确定对象存活的两种算法:引用计数算法和可达性分析算法。引用计数算法通过计数器判定对象是否存活,虽然简单高效,但无法解决循环引用的问题;可达性分析算法通过判断对象是否可达来确定存活对象,是主流的Java虚拟机内存管理算法。 ... [详细]
  • 本文讨论了在VMWARE5.1的虚拟服务器Windows Server 2008R2上安装oracle 10g客户端时出现的问题,并提供了解决方法。错误日志显示了异常访问违例,通过分析日志中的问题帧,找到了解决问题的线索。文章详细介绍了解决方法,帮助读者顺利安装oracle 10g客户端。 ... [详细]
  • 本文分析了Wince程序内存和存储内存的分布及作用。Wince内存包括系统内存、对象存储和程序内存,其中系统内存占用了一部分SDRAM,而剩下的30M为程序内存和存储内存。对象存储是嵌入式wince操作系统中的一个新概念,常用于消费电子设备中。此外,文章还介绍了主电源和后备电池在操作系统中的作用。 ... [详细]
  • Netty源代码分析服务器端启动ServerBootstrap初始化
    本文主要分析了Netty源代码中服务器端启动的过程,包括ServerBootstrap的初始化和相关参数的设置。通过分析NioEventLoopGroup、NioServerSocketChannel、ChannelOption.SO_BACKLOG等关键组件和选项的作用,深入理解Netty服务器端的启动过程。同时,还介绍了LoggingHandler的作用和使用方法,帮助读者更好地理解Netty源代码。 ... [详细]
  • 本文整理了315道Python基础题目及答案,帮助读者检验学习成果。文章介绍了学习Python的途径、Python与其他编程语言的对比、解释型和编译型编程语言的简述、Python解释器的种类和特点、位和字节的关系、以及至少5个PEP8规范。对于想要检验自己学习成果的读者,这些题目将是一个不错的选择。请注意,答案在视频中,本文不提供答案。 ... [详细]
  • 本文详细介绍了Android中的坐标系以及与View相关的方法。首先介绍了Android坐标系和视图坐标系的概念,并通过图示进行了解释。接着提到了View的大小可以超过手机屏幕,并且只有在手机屏幕内才能看到。最后,作者表示将在后续文章中继续探讨与View相关的内容。 ... [详细]
  • ShiftLeft:将静态防护与运行时防护结合的持续性安全防护解决方案
    ShiftLeft公司是一家致力于将应用的静态防护和运行时防护与应用开发自动化工作流相结合以提升软件开发生命周期中的安全性的公司。传统的安全防护方式存在误报率高、人工成本高、耗时长等问题,而ShiftLeft提供的持续性安全防护解决方案能够解决这些问题。通过将下一代静态代码分析与应用开发自动化工作流中涉及的安全工具相结合,ShiftLeft帮助企业实现DevSecOps的安全部分,提供高效、准确的安全能力。 ... [详细]
  • PHP反射API的功能和用途详解
    本文详细介绍了PHP反射API的功能和用途,包括动态获取信息和调用对象方法的功能,以及自动加载插件、生成文档、扩充PHP语言等用途。通过反射API,可以获取类的元数据,创建类的实例,调用方法,传递参数,动态调用类的静态方法等。PHP反射API是一种内建的OOP技术扩展,通过使用Reflection、ReflectionClass和ReflectionMethod等类,可以帮助我们分析其他类、接口、方法、属性和扩展。 ... [详细]
  • 深入理解Java虚拟机的并发编程与性能优化
    本文主要介绍了Java内存模型与线程的相关概念,探讨了并发编程在服务端应用中的重要性。同时,介绍了Java语言和虚拟机提供的工具,帮助开发人员处理并发方面的问题,提高程序的并发能力和性能优化。文章指出,充分利用计算机处理器的能力和协调线程之间的并发操作是提高服务端程序性能的关键。 ... [详细]
author-avatar
xkxk22
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有