[易语言][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下载

原文地址:https://www.cnblogs.com/Clouder-Blog/p/ExDuiTuturial0.html

时间: 2024-11-29 01:49:23

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

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

咕咕咕 尝试自己写组件对象被易语言的对象劝退后,我又回来写教程了. 相信上一章对如何创建窗口讲得足够透彻了,这一章上项目实战:点名器. 点名器这种简单的东西实在是经常被拿出来开刀啊. 还有一点,发现之前Tutorial这个词给拼错了-- Design 在打代码之前,我们必须要清楚界面布局. 一个点名器是怎么样的? 显示名称的标签.(NameLabel) 开始点名的按钮.(StartButton) Easy enough,right? 画个界面图方便打代码,最好使用一些方便的工具.当时我选择的是P

易语言数字指令编程大全(发送信息代码数据集合)

控件选中并鼠标显示四向箭头: 控件.发送信息(274,61440,0) 控件.发送信息(274,61450,0) 控件最大化: 控件.发送信息(274,61488,0) 参数2在61488-61503都有效 移动控件: 控件.发送信息(274,61449,0) 2.调整控件尺寸 调整左边: 控件.发送信息(274,61441,0) 调整右边: 控件.发送信息(274,61442,0) 调整顶边: 控件.发送信息(274,61451,0) 控件.发送信息(274,61443,0) 左上角调整: 控

[转]易语言消息机制分析(消息拦截原理)

标 题: [原创]易语言消息机制分析(消息拦截原理)作 者: 红绡枫叶时 间: 2014-12-17,12:41:44链 接: http://bbs.pediy.com/showthread.php?t=195626 我自己做了个易语言的sig签名,方便分析的时候用.易语言例子是静态编译的.版本 5.11易语言其实是基于mfc的,它依然需要mfc的消息派发机制,只不过,自己当了系统与用户间的代理人.所有的消息都要经它转发而已.我在MFC的消息派发函数_AfxDispatchCmdMsg下断点,总

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

易语言调用csharp写的COM组件,除了要注册csharp写的dll之外(由于是.net代码,需要用.net自带的注册工具RegAsm.exe注册,具体注册方法为: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\RegAsm.exe dotnet_lib.dll /tlb 这种调用的方法,在大部分的机器下捣鼓之后能成功,但是也有不成功的案例,具体表现如下: 一开始我以为是少了哪些dll,后来上百度,一找关键字“StackHash_0a9e”,还真能

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

这两天在编程领域里,又发生了一件令人瞩目的事情:以易语言创始人吴涛的一篇檄文<让我们一起来对360误报说不!>为序幕,再次拉开了易语言跟360杀毒软件之间的基情争斗.数百万易语言用户群起响应,为自己的权利而斗争,--生存的权利.易语言和杀毒软件往年那些恩怨情仇,势必要在今后这些日子里,重新清算一遍. 生死对决!有我没你!! 也无怪乎吴涛愤怒.易语言自2004年成立公司开始商业运作以来,至今已超过十年,期间始终受到杀毒软件的强力压制和不公正对待,以致举步维艰.广大易语言用户也是深受其害.360等

比特币挂机网赚易语言源码日赚200已上+网站+视频全套

是于易语言开发而成 在线挂机获取收益 软件内设VIP系统 提款系统 推广系统 等多功能化 如而要易语言程序源码的可以联系我QQ 382913699 注册的话需要下载软件,软件大小不到2M,下载下来后注册下,一般一天可以挖200块钱左右!提现的不是VIP一天只能提现1次,一次0.3元! VIP没有这个限制!首先我不是VIP所以不敢断言一定 所以请大家帮个忙,复制下网址访问下就可以了! 等访问量达到500一定给大家反馈下!就算是假的 一天领0.3元也好啊

用易语言编写的小程序——电子表

在写软件测评的时候想到了易语言,这个我高中用来写小程序玩的编程软件,正好编了一个小程序分享一下,电子表. 如图所示,这就是一个exe文件,可以直接打开. 打开后如题,我设置分为中国时间和美国时间,可供选择. 如图分别为中国时间显示和美国时间显示. 其中时间是可以动态变化的,用到了时间周期.当中国时间显示时,屏蔽美国时间周期,当美国时间显示时,屏蔽中国周期,从而达到不会显示混乱的目的. 另附此小软件下载地址(个人网址,放心访问,还可以听音乐o(∩_∩)o ):http://hgcrown.amnu

易语言等软件自动获取管理员权限,在64位Windows7系统非管理员帐户中执行

昨天有易语言开发者向我求助,说他用易语言编译的32位程序软件,发布给64位操作系统Win 7用户使用,因为该用户确定没有管理员权限,而程序启动时又要求必须输入管理员密码,如此陷入困境. 目标企业用户管理严格,要求为普通用户分配管理员权限是不切实际的,只能开发人员从软件开发的角度在技术上解决. 我听到这个问题后,第一感觉是微软用户帐户控制(UAC)引发的,估计通过给 exe 添加特定的 manifest 资源应该可以解决.于是我给了他一段代码,让他用 ResHacker 之类的软件添加到软件里面去

易语言定时播放(一)

.版本 2 .程序集 窗口程序集1 .子程序 __启动窗口_创建完毕 时钟1.时钟周期 = 1000 时钟1.激活 () .子程序 _时钟1_周期事件 .局部变量 xs, 整数型 .局部变量 fz, 整数型 .局部变量 mz, 整数型 xs = 取小时 (取现行时间 ()) fz = 取分钟 (取现行时间 ()) mz = 取秒 (取现行时间 ()) .如果 (xs = 8 且 fz = 53 且 mz = 0) 播放MP3 (1, “e:\ssn.mp3”) .否则 .如果结束 网站没有提供易