原创博客,请勿在未经授权的情况下转载。

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下载

[易语言][ExDui][Tutorial]0.Hello,world!的更多相关文章

  1. [易语言][ExDui][Tutorial]1.NameSelector

    咕咕咕 尝试自己写组件对象被易语言的对象劝退后,我又回来写教程了. 相信上一章对如何创建窗口讲得足够透彻了,这一章上项目实战:点名器. 点名器这种简单的东西实在是经常被拿出来开刀啊. 还有一点,发现之 ...

  2. 易语言软件加VMProtect壳的正确方法

    VMP是一款很强大的加密壳,代码虚拟化技术可以很好的保护程序不被恶意修改破J但是很多人不知道怎么给自己的程序加壳,今天给大家晋级下加壳的正确方法 相信很多新手都以为只要把软件直接拖到VMP里重新编译一 ...

  3. python3+django2 开发易语言网络验证(上)

    创作背景: 在某论坛中下载到一套php开发易语言网络验证的教程,照着看下来,花了两天的时间,结果发现教程里开发的网络验证,以及随着教程一起给学员的源码,都存在着根本用不了的bug!我想要看看能不能在原 ...

  4. python3+django2 开发易语言网络验证(中)

    第四步:网络验证的逻辑开发 1.将model注册到adminx.py中 1.在apps/yanzheng目录下新建admin.py 文件,添加代码: import xadmin from xadmin ...

  5. 执行效率做比较,Go、python、java、c#、delphi、易语言等

    比较环境,在win7   64位,比较各种语言的整数型运算,下面的比较只作为单项比较.具体方式,40000*40000遍历相加.为了防止编译器优化,生成一个随机数. 1:c#,在NET2.0框架下作为 ...

  6. 易语言调用csharp写的COM组件的程序在Win2008上奔溃的解决办法

    易语言调用csharp写的COM组件,除了要注册csharp写的dll之外(由于是.net代码,需要用.net自带的注册工具RegAsm.exe注册,具体注册方法为: C:\WINDOWS\Micro ...

  7. 易语言VS杀毒软件:基情复燃,转受为攻!

    这两天在编程领域里,又发生了一件令人瞩目的事情:以易语言创始人吴涛的一篇檄文<tid=370327">让我们一起来对360误报说不!>为序幕.再次拉开了易语言跟360杀毒软 ...

  8. (大模拟紫题) Luogu P1953 易语言

    原题链接:P1953 易语言 (我最近怎么总在做大模拟大搜索题) 分别处理两种情况. 如果只有一个1或0 直接设一个cnt为这个值,每次输入一个新名字之后把数字替换成cnt,最后cnt++即可. 注意 ...

  9. 易语言 史诗级Json处理 烁_Json模块!!!!

    大家好,我是键盘上的魔手 * “************************”* “** 欢迎使用烁Json模块 **”* “** 作者:键盘上的魔手 **”* “**  微信号:codervip ...

随机推荐

  1. vmware虚拟机linux添加硬盘后先分区再格式化操作方法

    先在虚拟机里填加硬盘,如图. 进入linux后台,df-l ,没有显示sdc盘,更切换的是,在fdisk中,却有sdc 看fdisk -l,确实有sdc. 说明sdc还没有分区,也没有格式化,也没有挂 ...

  2. Mybatis中mapper.xml的使用

    详解多对多,mybatis多对多查询(xml方式和注解方式) 链接:https://blog.csdn.net/qq_42524262/article/details/98383977 链接:http ...

  3. vue调试工具vue-devtools安装及使用方法

    vue调试工具vue-devtools安装及使用方法 https://www.jb51.net/article/150335.htm 本文主要介绍 vue的调试工具 vue-devtools 的安装和 ...

  4. zigbee学习基础

    应用场合:功耗(休眠)以及自组网(动态路由,梯度法寻径)是其特点.距离短.功耗低且传输速率不高的各种电子设备之间进行有周期性数据.间歇性数据和低反应时间数据传输的应用(智能家居/仓储中转/伞兵落地协同 ...

  5. 【转】python中的闭包详细解析

    一.什么是闭包? 如果一个内嵌函数访问外部嵌套函数作用域的变量,并返回这个函数,则这个函数就是闭包 闭包必须满足三个条件: 1. 必须有一个内嵌函数    2. 内嵌函数必须引用外部嵌套函数中的变量  ...

  6. hdfs dfs ls /列出了本地根目录下文件夹和文件Warning: fs.defaultFS is not set when running "ls" command

    [root@node01 customShells]# hdfs dfs -ls /Warning: fs.defaultFS is not set when running "ls&quo ...

  7. 使用 C++ 处理 JSON 数据交换格式

    一.摘要 JSON 的全称为:JavaScript Object Notation,顾名思义,JSON 是用于标记 Javascript 对象的,JSON 官方的解释为:JSON 是一种轻量级的数据传 ...

  8. Codeforces 1304E. 1-Trees and Queries

    简述题意,给你一课最小支撑树,对每个询问,在原有的路径上增加x-y,问a-b是否有路径长度为k的路,每条路每个点可以重复使用 由于是最小支撑树,我们可以用LCA来快速判断每个点之间的距离,那么现在就要 ...

  9. 刷题19. Remove Nth Node From End of List

    一.题目说明 这个题目是19. Remove Nth Node From End of List,不言自明.删除链表倒数第n个元素.难度是Medium! 二.我的解答 链表很熟悉了,直接写代码. 性能 ...

  10. 132、Java面向对象之static关键字四(定义一个数学的加法操作)

    01.代码如下: package TIANPAN; class MyMath { // 数学操作类,类中没有属性 public static int add(int x, int y) { // 只是 ...