本帖最后由 ockdieso 于 2016-11-26 01:15 编辑
易语言 Windows开发从入门到死亡 我们先从一个小程序 . 来进入 windows 编程的大门
先用易语言创建一个 windows 窗口程序
然后我们添加一条 DLL 命令 .
DLL 命令 . 我们填写 CG_ 消息框 (CG_ 前缀是为了区别或者美观 . 可以自行修改 )
库文件名 . 填写 User32
在库中对应名 . 填写 Messagebox
然后添加 4 个参数
分别为整数型 . 文本型 . 文本型 . 整数型
然后 . 我们调用他
此处截图错误
OK. 我们已经打开了 windows 编程的大门 .
下面我们开始讲解
首先 . 是易语言的 DLL 命令
其实 . 他就是一个 LoadLibrary. 他将显式 ( 或隐式 ) 载入一个 DLL. 然后获取其函数地址 , 最后调用 . 这里不做过多解析
DLL 命令名 : 这个很好理解 . 也就是你给这个函数起一个名字 ~ 你想起什么起什么 . 比如*大战变形金刚 . 都可以 , 不过我还是推荐代码规范化 .
库文件名 : 这个地方需要注意一下 . 一开始 . 我填 User32.dll 居然报错了 . 我去掉 .dll 就可以了 . 目测是以下 3 个 DLL 不需要添加后缀 . Kernel32.dll,User32.dll 和 GDI32.dll. 未验证 . 因为这点不是很重要 .
在库中对应函数名 : 这个地方就是真正填我们的 win32API 函数名的地方了 . 这个地方千万不要填错 . 填错那就胡扯了 . 还有一些函数 . 有 A 和 W 之分 . 这个我们以后再说 , 不太重要 .
接下来是参数
我定义了 4 个参数 . 类型分别为整数型 . 文本型 . 文本型 . 和整数型 . 这个我们暂时忽略 , 不用去管他 . 我们重点不是研究这个函数都有哪些参数 . 填什么数据类型 . 我要教的是一种方法 . 授人以鱼不如授人以渔 . 咱们先把易语言 IDE 提供的这张 ” 表 ” 研究清楚 ~
这个备注和数组不用我讲了吧 ? 哦 , 你就是需要我讲 . 我也不会讲的 . 听不懂拉倒吧
公开 . 这个东西我还真没研究过 . 在 DLL 命令中我从未公开过任何函数 , 个人推测是编写模块的时候 . 给模块使用者用的吧
传址 : 这个讲起来就比较麻烦了 . 易语言本身并没有提供什么对于指针的操作 . 虽然很多模块 . 支持库 , 都多多少少提供了指针 . 个人认为 , 易语言在设计之初就应该开放指针 . 虽然易语言设计之初就是一个易字 . 但是你这边不让用 . 这边又来个传址 . 初学者一会就懵逼了 . 好吧 , 扯回正题 . 一段简单易懂不带语言的段落
“ 这里可以把指针、引用和值的关系类比为信封、邮箱地址和房子。一个指针就好像是一个信封,我们可以在上面填写邮寄地址。一个引用(地址)就像是一个邮件地址,它是实际的地址。取值就像是地址对应的房子。我们可以把信封上的地址擦掉,写上另外一个我们想要的地址,但这个行为对房子没有任何影响。 ”
如果不懂 . 可以自行百度一下指针 , 还不懂 . 没事 , 大概懂了就行了 . 要求不能太高 … 不然观众该不高兴了 .
你只需要记住 . 勾选之后 . 不传递该变量的值 . 而是传递该变量的指针出去即可 . 在调用 WIN32API 的时候 . 需要你传址 . 你勾选一下即可 . 不懂问题好像也不大
好了 . 易语言的 DLL 命令解释完了 . 咱们不急着开始讲这个函数 . 因为大头还没说呢 !win32api 还没给你们解释呢 ! 什么 ? 开头为啥不说 ?
卧槽 . 你给我一篇教程 , 开头给老子讲一大堆听不懂的东西 . 老子也不愿意听啊 . 不给你们先实现一下的机会 , 你们哪来的兴趣继续学习呢 ?
很多人不愿意学 C/C++ 不就是因为学了半天还在那个小黑框框里面连个窗口都看不见么 ? 当年 C 不就是因为 3 行代码输出 helloworld 风靡全球开始了大航海 . 不 , 大编程时代么 ?
好了不扯了 . 开始正式介绍大佬登场 :
使用 Win32 API ,应用程序可以充分挖掘 Windows 的 32 位操作系统的潜力。 Mircrosoft 的所有 32 位平台都支持统一的 API ,包括函数、结构、消息、宏及接口。使用 Win32 API 不但可以开发出在各种平台上都能成功运行的应用程序,而且也可以充分利用每个平台特有的功能和属性。
在具体编程时,程序实现方式的差异依赖于相应平台的底层功能的不同。最显著的差异是某些函数只能在更强大的平台上实现其功能。例如,安全函数只能在 WindowsNT 操作系统下使用。另外一些主要差别就是系统限制,比如值的范围约束,或函数可管理的项目个数等等。
就这么多 . 至于细节 . 自行百度 . 我管你那么多历史和发展历程 . 我不听 !
顺便补充一句 . 你们都叫他 win32api 甚至更加不严谨的直接统称 API. 这是错误的 .API 的全称为 API ( ApplicationProgramming Interface, 应用程序编程接口) . 而目前大部分机器已经是 64 了 . 为什么还叫 WIN32API? 不是 WIN64 了 ? 实际上 .win16api 是存在的 . 他就叫 win16. 但是 win64 还是 win32api. 因为其 64 位系统和 32 为系统在功能方面并没有差别 .
然后是函数 (function) 和方法 (method). 其实他们是一个东西 . 只不过是叫法不同 . 如果真的要说有区别 . 我认为是面向过程为函数 . 面向对象为方法 . 如果真的要深入这个问题的话 . 那我只能说 : 老子就愿意叫他函数 . 你不服咬死我啊 !
说了这么多 . 咱们得开始介绍我们刚刚所写的函数了
我只吹两点 .
1. XX 百科 . 足够权威性
2. MSDN. 官方文档如果不够准确 . 还咱还是别开公司了 . 盖子你还是回去上大学吧 . 开啥公司啊 ?
XX 百科中 . 一般常用函数都有其翻译和使用方法 . 部分函数还会有易语言例子 . 如果不常用 …. 那么就搜索函数名吧 . 搜索不到 . 上 MSDN.MSDN 都没有的话 … 可能未文档化 . 也可能是这个函数不存在
我本想第一课 . 咱们就百科算了 . 但是回头一想 . 还是不行 . 必须 MSDN
先看看百科的介绍
MessageBox 显示一个模态对话框,其中包含一个系统图标、 一组按钮和一个简短的特定于应用程序消息,如状态或错误的信息。消息框中返回一个整数值,该值指示用户单击了哪个按钮。
再看看参数列表 . 先看第一个参数
hWnd :
此参数代表消息框拥有的窗口。如果为 NULL ,则消息框没有拥有窗口。
这个地方我一般都直接填 0. 至于为什么 . 待会细说
lpText :
消息框的内容。如果使用了 Unicode 库,则把文本变成:
TEXT(/*sometext*/)
Unicode 待会再扯 . 说白了 . 就是消息框的内容别 ~
lpCaption :
消息框的标题。如果使用了 Unicode 库,则把文本变成:
TEXT(/*sometext*/)
这不就是标题么 ?
uType :
指定一个决定对话框的内容和行为的位标志集。此参数可以为下列标志组中标志的组合。指定下列标志中的一个来显示消息框中的按钮以及图标。
这个参数 . 咱们就得先回到一下易语言系统支持库的消息框函数了
在对话框中显示信息,等待用户单击按钮,并返回一个整数告诉用户单击哪一个按钮。该整数为以下常量值之一: 0 、 # 确认钮; 1 、 # 取消钮; 2 、 # 放弃钮; 3 、 # 重试钮; 4 、 # 忽略钮; 5 、 # 是钮; 6 、 # 否钮。如果对话框有“取消”按钮,则按下 ESC 键与单击“取消”按钮的效果相同。本命令为初级命令。
然后我们再看看这个参数所提供的参数
对照一下看看 . 是不是一样的 ?
那么问题又来了 . 这些个 MB_OK,YESNO 这些懵逼类型又是个啥 ?
这 … 其实是 C 种的宏定义 …
#define MB_OK 0x00000000L
#define MB_OKCANCEL 0x00000001L
#define MB_ABORTRETRYIGNORE 0x00000002L
#define MB_YESNOCANCEL 0x00000003L
#define MB_YESNO 0x00000004L
#define MB_RETRYCANCEL 0x00000005L
这里必须扯一点题外话 . 那就是你最好下载一个 VS2010~2015.
你只需要引入 windows.h 头文件 . 然后在你不知道宏定义到底是什么的时候 . 你右键单击一下 . 之后查看定义即可 . 其次是 Spy++ 和错误查询这些小工具 . 虽然在 MSDN 你也能查到这些宏定义 . 但是我认为直接查看头文件更加方便 . 随你便了 .
补充 : 千万不要用 VC++6.0 我懂 . 小甲鱼的 C/C++ 视频用 VC++6.0. 可是 VC++6.0 已经严重过时 . 你们都觉得 VC++6.0 是微软的产物吧 ? 我告诉你们真相 ! 真正的历史 !
VC++6.0 和 MFC 并不是微软所创作的 . 而是出自十六世纪文艺复兴时期的画家 ( 暂且称为画家 ) 列昂纳多 . 达芬奇只手 .MFC 和 VC++6.0 经历了文艺复兴 , 工业革命 . 甚至第一次 , 第二次世界大战 . 如今 ,MFC 和 VC++6.0 却被微软翻了出来 . 占为己有 ! 这种东西已经严重过时 . 应该随着德意志永远的消失在历史的长河之中 !!!