第一节 入门
1.启动软件
打开软件默认是“新建”选项,点击初级程序。进入主界面。
我们知道,编写一个程序是需要很多代码的,这些代码往往要完成很多重复性工作, 所以我们就要把代码分成若干个小程序段,称之为“小程序”。
每一段“小程序”我们都可以在不同地方调用执行它,具体是怎么实现呢?比如我们要计算a+b=c,请看下面简单的示例:
小程序 加法();
整数 a,b,c;
c=a+b;
结束;
首先写“小程序”这三个字,就表示我们要写一段代码,然后空格,再写上这段程序的名字“加法”,后面的小括号里面是传递参数用的。
括号之后是分号,代表这一句代码完了,开始下一句。相当于平常书写文章的逗号、句号、分号、问号等,书写代码就规定只用分号这一种代表语句结束。
如果不传递参数,小括号可以不写,但后面要写个分号或者空格或者换行,作用是把你后面的语句分开。
其它符号当然有别的用途,而且要注意编程用的符号都是英文字符,中文的标号符号很多输入法打不出来,所以统一使用英文。
当这段代码写完,一定要写上“结束”,计算机才会知道这个代码片段至此结束。
然后我们接着看看参数是如何传递的:
小程序 加法(整数 a,整数 b);
整数 c;
c=a+b;
结束;
括号里面传递两个参数a和b,它们是变量的名字,整数代表这个变量是数字,a和b可以是-21亿到21之间的任意数字。
有了这段小程序,我们就可以在其它地方调用它,写法是:加法(100,5);
那么它就会计算出c=105。可是我们需要把c这结果取出来,那么小程序也可以把结果返回给调用者。
小程序 加法(整数 a,整数 b);
整数 c;
c=a+b;
返回(c);
结束;
这样书写之后,我们调用时,就可以写:
整数 d;
d=加法(100,5);
那么我们把计算结果给到d这个变量,此时d的值就是105。由此我们可以看出,申请变量就是要存放一个数据,我们可以去读写这个变量的数据。
比如:文本 s;
s="你好";
就是申请一个文本型变量s,然后给s赋值为“你好”,注意文本也就是字符,它要加双引号。
上面的代码都是申请变量c,计算出c的结果,再返回c,当然我们可以这样写:
小程序 加法(整数 a, 整数 b);
返回(a+b);
结束;
总线来说,编程只是一种思路,代码只是一种逻辑,虽然代码有诸多规范,其目的还是为了满足需要。
下面我们先来写一个“你好”程序吧,几乎所有编程都是先学“hello world”开始的。
例题一:弹出提示
我们在窗体的代码里(窗体.bac),找到窗体启动这里,分号后面加一行代码:信息框(0,"我是中文编程","朋友你好",0);
点击运行(菜单栏下方有个绿色的三角符号)
提示文件没有保存,需要给程序起一个名字。我们点“是”
随便起一个名字,就叫“测试”好了。
程序已经编译完成,我们点击“执行”按钮
运行的程序会弹出提示,这样一个程序就写好了,默认是在code目录下。
2.窗体设计
刚才我们学习的是代码的编写,那么设计带窗体的程序,最重要的是先学会如何设计窗体。
我们可以关闭代码编辑窗口,以后可以双击右侧列表里的窗体.bac,来重新打开代码编辑。
先选择一个控件,在窗体上点击鼠标左键不松-移动鼠标-松开鼠标。相当于“画”一个控件。
然后点击此控件,修改它的属性和风格样式等。
3.编写一个程序
例题二:显示网页
然后点击编译按钮。如果没有保存工程,会提示你保存工程文件。输入要保存的文件名。
程序会自动编译你设计的软件,并自动运行,运行后效果如下。
例题三:使用按钮
我们在窗体上画一个按钮,刚才的网页框很大,先拖动它向下挪,上面留点地方好画按钮。
然后点击网页框,注意看右边的外观样式,不勾选“是否可见”
然后再到窗体代码的窗体消息这里,插入 为 单击左键{ShowWindow(网页,SW_SHOW);}
看到英文代码先不要觉得头大,这代码哪里来的?我刚刚上网查的呀。
为什么编程一定要用英文呢?不是一定要用,而是学习的需要。网上的代码几乎都是英文的,只管复制过来用就行。
ShowWindow可直接翻译为显示窗口,SW_SHOW这个参数就是显示,网页这个参数,其实是对应刚才画的网页框,名字就叫“网页”
那好,我们先编译一下看看效果吧!过程不演示了,运行之后,网页不显示,点击按钮,网页就会显示。
然后我们再画一个按钮,刚才的按钮名字叫按钮1,新加的叫按钮2,第二行是标题内容,分别写“显示”、“隐藏”
把刚才“单击左键”里的代码,改成:左键点击(数据);
然后再增加一段小程序,代码如下:
小程序 左键点击(整数 数据);
判断(数据)
为 按钮1{ShowWindow(网页,SW_SHOW);}
为 按钮2{ShowWindow(网页,SW_HIDE);}
结束;
这样写的作用就是在点击按钮时,判断是哪个按钮点击了。数据就是按钮吗?现在算是,也可能是你画的其它控件。
判断是按钮1,就执行让网页显示,是按钮2,就执行让网页隐藏。SW_HIDE是隐藏的意思,网上有相关说明。
再次编译一下,运行效果如图:
我们分别点击两个按钮,网页是会显示和隐藏。只是这网页太小,能自动全屏吗?
也不难,上网一查,可以把下面两句代码,插入到“窗体启动”的下面。
SendMessage(窗体, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
MoveWindow(网页,0, 0, dskRt.right, dskRt.bottom);
窗体启动完之后,第一行代码就是让窗体全屏,为什么我写的是单击窗口?
是因为编程器里对部分常数做了翻译,单击窗口=WM_SYSCOMMAND,后面会有说明,这里先解释下第二行。
百科里解释是:MoveWindow(窗口句柄, 左边, 顶部, 宽度, 高度);作用:移动一个窗口到指定位置和大小。
窗口句柄就是网页了,我们要移动它。全屏时,距左边是0。顶部为什么是50?
注意看网页框的属性,顶确实是50.而左边是10怎么不写?画的时候没贴边,代码让它贴边就对了。
那么宽度和高度这两个英文是哪里来的?我们到窗体设计器界面,点击菜单下方的“切换设计”按钮。
出来一堆代码呢?没错,你在设计界面上设计的结果,就是生成了这些代码而已。
至于你怎么理解这个意思不重要。你在这里看到的dskRt.right就是桌面的宽度,dskRt.bottom是桌面高度。
反正这个能拿来用就行了。切换到这个界面,还是有其它用途的,后面我还会再讲到。
3.菜单设计
例题四:使用菜单
菜单怎么用呢?像刚才的测试代码,用按钮控制网页显示,弄了全屏,两个按钮占据那么宽一行。
感觉太不美观,那我们用菜单代替按钮,看看效果如何。在窗体设计界面点击鼠标右键,选择“菜单设计”
依次添加:主菜单、显示、隐藏这三个项目。然后再选中显示,点击一下“右移”按钮,“隐藏”也同上操作。
为什么要加三个?你应该见过,菜单都是先点一级菜单,再点二级菜单。
“主菜单”就是一级菜单,显示和隐藏是它的二级菜单。(多一个点就低了一级)
然后我们再点一次切换设计,看看又多了什么?别问看这干吗,反正有用。
看到代码里多了几行,也看不懂啊。也别急,刚才有两个按钮,是可以删除掉了。
你现在找到按钮1=…和按钮2=…这两行代码,直接删除掉。先别切换,点保存,然后把这个窗口关了。
然后再从右边的工程文件列表,双击“窗体.frm”,看到两个按钮都没了吧。
切换设计看“原始”代码,可以直接改代码。具体稍候再讲,先来看菜单功能如何写代码。
那么是不是把刚才的按钮1和按钮2改成显示和隐藏就行了?并不行。
因为添加菜单只有标题名,并没有定义每个菜单的名称,那怎么办?
所以我们继续学习另一种判断按钮或者其它控件的办法:
除了判断定义的名称外,我们还可以判断控件的编号,有时候我们可以使用循环,按序号来操作控件。
好,我们再点一下切换设计,看到显示和隐藏这两个标题前面,分别是1001和1002,先记住。
然后到窗体代码这里,“单击左键”这里的(数据)改成(参数)。然后再把按钮1和按钮2改成1001和1002
你是不是发现我没有把“数据”改成“参数”,我改的是上面“窗体消息”那里
那下边为什么不改?确实可以不改。那边是“参数”,这边怎么就变“数据”了?原因是传递参数,并不是参数这两个字。
而是它的数据,那这个名称代表什么,它只是定义了一个局部变量。局部变量只在本段小程序里有效。名字只要不重复,叫什么都行
上面的话,如果你实在理解不了,那就不要管了,或者你把下面的“数据”,都改成“参数”,也是对的。看上去顺眼而且更好理解
还注意看一下,窗体启动那里,移动窗口后面的数字50给去掉了。也就是说它不用再留出50来显示按钮了,就是全屏。
上面几个例题,说难也不算难。只是深刻理解起来,有点困难。感觉SEC编程一点都不智能,学起来费劲。
那么我告诉你为什么我要这么教你。我教的其实是一种“底层”编程的方法,当你理解学会了这些方法,等于你就可以创造一切了。
而你学习其它“高级语言”,真正实现的功能都是“别人”提前写好的。并不是说这不好,而是高级语言需要学的太多,学了几十年
却发现只能在这一种语言体系下用,你也无法和其它体系的程序员探讨或使用你的代码。而底层编程是通用的,高级语言也都是通过底层实现的。
高级语言可能编程更效率,但是要不断的学习。先学会底层编程,也仍然可以使用高级编程,这样你就能更容易的理解所有编程语言了。
看完上面的话,是不是对底层编程更有兴趣了。底层编程学的是技能,高级编程学的是技术。技能学会之后,永远不会过时,技术就不一定了。
那就继续把刚才没讲完的再补充一下。看一下窗体设计切换到代码,去如何理解:
网页=CreateWindowEx($200,"AtlAxWin","www.z5x.cn",$40000000,10,10,420,310,窗体,1,5,0);
这句代码有点长,等号前面的“网页”,就是定义的控件名称。增加二级菜单的代码前面并没有等号,也就是没定义名称。
关键看“窗体”这两个字,前面有四个数字,分别对应左、顶、宽、高。
它后面的数字就是控件的编号,或者叫序号吧。刚才菜单可以用序号来判断是哪个控件在点击,按钮或其它控件也是可以的。
4.查看示例
点击新建工程,并点击选项卡的范例,选择右侧列表里的示例文件,点击打开
打开时默认只显示第一个窗口。查看代码窗口,要双击右侧列表里的bac文件。
后缀为bac的是代码文件,后缀为frm的为窗体设计。当然两者是可以相互切换的。
为了设计和书写方便,我们可以最大化当前窗口,需要切换可以双击右侧列表。
5.工程引用
6.版本设置
7.服务设置
8.添加资源
第二节 数据类型
之前我们在代码里,看到有“整数 窗口,整数 消息,整数 参数,整数 数据”,这些都是变量,数据类型指的是变量的类型。
使用最多的就是整数,当你不知道使用什么类型的变量时,就用整数好了。在小程序片段之内的变量是局部变量,之外的是全局变量
变量的作用主要是用来存取数据,传递参数,算法运算等等。比如:整数 a=3,b=5; 先申请两个变量分别是3和5。
再写:a+b;也就是让a 加上 b,然后a的结果就等于8了。
英文名称 |
中文名称 |
数值范围 |
Bool |
逻辑 |
真(True),假(False) |
char,sbyte |
字符 |
-128~127 |
short |
整形 |
-32768到32767 |
int,dword |
整数 |
-2147483648到2147483647 |
uint |
正整数 |
0 到 4,294,967,295 |
single |
小数 |
负数-3.402823E38到-1.401298E-45;正数1.401298E-45到3.402823E38 |
string |
文本 |
未指定时长度为文本的实际长度;文本 消息[16]="系统提示";英文1字节,汉字2字节 |
byte,uchar |
字节 |
0到256 |
ushort,word |
正整形 |
0到65535 |
Double |
浮点 |
负数时-1.79769313486232E308到-4.94065645841247E-324;正数4.94065645841247E-324到1.79769313486232E308 |
long,ulong |
大数 |
64位整数,32位编程下多用于存储或时间计算。 |
支持unsigned 和 signed写法。十六进制数字是用$表示,$0到$FFFFFFFF
日期和其它类型均可以用整数来表示,如整数a=2018-8-15 12:00;不要带引号。
带引号是文本,如整数a; a="提示消息";文本s="中文内容";文本dat[16]="$374727774367008C7A";前面加$时把十六进制字符转换成二进制数据块
第三节 转义符号
C语言默认把\进行转义。在需要使用\字符时要再加\
如D:\rxjh,就会把\r转成换行符。需要写成d:\\rxjh
感觉这样不太方便,于是仅保留\r\n同时出现时,则转换成换行符加回车符。
其它符号需要加单引号''如:'\r'为换行符,例:s="您好'\r'人类";
'\n'为回车符;'\t'为水平制表符;'\f'为分页符;'\v'为垂直制表符;
''为双引号;'\0'为0字符;'\1'为缩进符号;'\2'为两个换行和回车符组合
另外,在需要表示ASII码时,如strchr函数搜索字符,可以用\转换文字,如strchr(str,\s);ASII码只能用单个字符;
第四节 运算符号
符号 |
类型 |
中文释义 |
+ |
算术 |
加 |
- |
算术 |
减 |
* |
算术 |
乘 |
/ |
算术 |
除 |
| |
逻辑 位运算 |
或 |
^ |
逻辑 位运算 |
异或 |
& |
逻辑 位运算 |
与 |
% |
算术 |
求余 |
++ |
算术 |
自加 |
— |
算术 |
自减 |
! |
逻辑 位运算 |
非 |
~ |
位运算 |
取反 |
= |
赋值 |
等于 |
!= <> |
关系比较 |
不等于 |
< |
关系比较 |
小于 |
> |
关系比较 |
大于 |
>= |
关系比较 |
大于等于 |
<= |
关系比较 |
小于等于 |
=> |
关系比较 |
等大于 |
=< |
关系比较 |
等小于 |
>> |
位运算 |
右移 |
>> |
位运算 |
左移 |
|| |
多条件判断 |
或者 |
&& |
多条件判断 |
而且 |
@ |
取内存地址 |
@变量名或小程序名 |
~ |
取内存处的数据 |
~a+100 取a地址的值再加100 |
( ) |
参数传递 数组成员 |
加(整数 a, 文本 b); 整数 ab(10); |
[ ] |
定长文本 |
文本 st[15];加末尾0占16字节 |
{ } |
代码片段 |
用于条件判断或循环 |
SEC编程使用的符号,除“或者”和“而且”外,全部采用英文半角符号,不可以使用中文全角符号。
原因是中文的加减乘除等符号,在很多输入法里打不出来。如果使用汉字的加、减、乘、除等,前后就要带空格。
为了输入简便,所以运算符号统一采用英文半角符号,输入法在中文状态时,切换为半角符号,方便书写编程代码。
@和~的使用:默认情况下,提交参数是按值传递的。比如a变量的值是100,提交的是100这个数值。
有时候传递的变量是把想要的结果,反馈输出到这个变量,就需要在变量前加@符号,就变成传递变量的地址。
有时候变量的值就是一个内存地址,我们要读取该段内存的某个位置处的数值,就要使用~这个符号。
假设变量a的值是4001234h,b=~a;就是取4001234h内存处的整数值到变量b
关于赋值运算的写法:
常见的自身增加或相乘等,可以用+=、-=、*=、/=、|=、&=、%=、^=这样的写法。
也可以用更简单的a+2;(a=a+2) a-3;(a=a-3) a*b+3;(a=a*b+3) a/10;(a=a/10)
也就是运算符号后面的等于可以不写,但需要注意一点。自加++自减–和加数字减数字。
是有不同的汇编写法,所以加减后面不写等号,就只能是数字。变量和表达式要用+=、-=
例如a+=b; b-=c*5; 而其它运算则不论是数字、变量和表达式,等号写不写都一样计算。
第五节 编程语法
英文语法 |
中文语法 |
简单用法 |
sub |
小程序 |
小程序(整数 a,文本b,字节 c); |
end |
结束 |
程序片断代码的末尾,加上此语句表示此段程序结束。 |
scls |
子类 |
子类{整数 变量1,变量2;小程序 登陆(账号)…结束;} |
datab |
数据表 |
数据表{整数 a,文本 b[16],字节 c;}自定义表头结构 |
query |
读取表 |
读取表(数据库名,数据表头);按指定结构把数据表读取到内存中。 |
indexof |
索引 |
索引(数组名,查询值);快速从数组中检索数值,返回序号,未找到返回-1 |
addin |
加索引 |
加索引(数组名,表名,字段名);把表的字段值加入数组,用来索引 |
new |
新建 |
角色=新建 玩家类(等级=1,性别=0);用于新建子类,可选括号内设定初始值。 |
import |
导入 |
导入 StrStrI 支持库 "SHELL32.DLL",2; 导入dll的函数,有2个参数 |
include |
引入 |
引入 "Windows.inc"; 用于引用库文件 |
const |
常量 |
常量 内容=”SEC”; const IDYES = 6; |
type |
类型 |
类型 Form{整数 hwnd;整数 WndProc;} |
export |
导出 |
写法与小程序类似,用于写dll时,此函数功能可被其它程序调用 |
return |
返回 |
返回结果给调用者,例如返回(N1* N2);可不加括号直接返回 |
if |
如果 |
如果(消息=窗口关闭){停止(0);} |
iif |
如果是 |
a =如果是(消息=0,10,500);相当于三态语句 |
else |
否则 |
必须放在如果语句后面,否则{返回(1);} |
switch |
判断 |
判断(消息)为 窗口关闭{停止(0);} |
while |
循环到 |
判断条件成立则循环,直到条件不成立. 循环到(a<1000){a++;} |
for |
循环于 |
For(i=0;i<100;i++){i从0到99,每次加1,循环一百次} |
foreach |
循环数组 |
循环数组(ab){}可循环读或者写数组或特定数据段的值 |
do |
循环 |
循环(10){…}10次停止;循环{…i–;}i=0停止;循环{…i+2;}(i=100) |
Goto,jump |
跳到 |
ABC: ….. goto ABC; 开头: …. 跳到 开头; |
lib |
支持库 |
import abort lib "MSVCRT.DLL",0; |
local |
局部 |
局部 整数 图片; local word pic; |
preserve |
保留 |
整数 数组();重置 数组[20]; 保留 数组[200];会保留原来的20个 |
reserve |
重置 |
整数 数组(); 重置 数组[200];把数组重新分配200个,且数据清空 |
destroy |
销毁 |
销毁 数组; 把数组销毁,释放内存。 |
direct |
置入 |
置入[字节 $68]; 置入[整数 $20];相当于写机器语言 |
order |
指令 |
指令[6820088800];连续的十六进制机器码 |
movads |
传址 |
传址[$4001200,a];可以把变量值或数值写入指定内存位置 |
bytes |
字节组 |
字节组 tmp[15,$20,60,128]; |
with |
列举 |
列举 form{.s=1;.l=5;}等效于form.s=1;form.l=5; |
ubound |
上标 |
上标(数组);取一个数组的上标 |
lbound |
下标 |
下标(数组);取一个数组的下标 |
len |
长 |
长(str);文本变量取文字长度,否则是结构长度 |
clng |
转整数 |
clng(str);把字符转换成整数 |
csng |
转小数 |
sg=转小数(str);把字符转换成小数 |
alias |
别名 |
导入 信息框 别名 MessageBoxA lib "USER32.DLL",4; |
ascii |
英文码 |
import AppendMenu ascii lib "USER32.DLL",4;等效于 AppendMenuA |
unicode |
统一码 |
等效于调用的函数名后面加“W”,同一名称函数只能选ascii和unicode一种 |
picon |
程序图标 |
程序图标“sec.ico”; |
读取数据表是最近才更新的功能,可以自定义数据结构,然后把数据读取到相应结构内存中。通常我们使用ADO对象来读写数据,
由于记录集对象结构过于复杂,每行每列的类型、名称、序号、长度、缓冲区指针和长度,以及各种属性、方法等。
可是实际应用中,仍然需要把记录集中的数据,再全部读取到自己定义的结构内存中,所以我增加了直接读取数据到指定结构的功能。
只要需要的字段数据读取出来,还可以直接改变数据类型。例如数据库中字段类型为整数,程序需要把整数类型数据全部转换成小数类型。
同样的数值15,整数和单精度小数都占四字节,但是它们的数据却大不相同。程序定义数据表结构时为小数,数据库里是整数,就可以全部提取为小数数据
读取后的数据表读写方法为:表名(行号).字段名。如:lv=玩家表(0).等级;玩家表(3).职业=5; 表名.rows为行数 表名.cols为列数
读取数据是按查询的sql语句里的表名和字段顺序,并不是按照程序里的表名和字段名,所以程序代码里的表名和字段名是完全自定义的。
数据表结构类型,跟自定义类型(type)的性质类似,类型是不支持数组的,所以可以用数据表代替类型,当自定义数组类型使用。
长(表名)获取的是类型结构或者说每一行的数据长度,表名.len是申请的数组长度,使用前需要 重置 表名(数量)。
申请的长度数量要大于或等于查询表的记录数,读取完数据之后,得到 表名.rows 数据表的实际读取记录数。
数据表的序号是从0开始的,100行记录就是按序号0-99获取。读取的数据存放是一段连续的内存,行列是连续整齐排列的。
第六节 文本、数组和内存指针
文本是一段文字数据,数组是按数据类型连续排列的数据,内存指针是内存中某个位置的数据。
它们都是用一个整数地址来表示所在位置,操作是比较近似的。
可以使用API函数进行读写,程序还提供一些便捷的指针操作。 如 文本 s="sdkfskd";
s(0)=\b;就把文本的第一个字符替换成字符b;
非定义的数组,通常是读写是按一字节
如 整数 m是一个内存地址
m(13)=128;就是把128这个数字写入第14个字节处
a=m(10);是从第11字节处读取1字节。
在括号后面加%就可以读写两字节,加&读写四字节。
如m(13)%=32128;a=m(2)%;
m(13)&=$AF32C128;如果(m(2)&=889654){};
也可以把变量对内存地址进行读写
变量只能是字节 整形 整数 小数等4字节以内的数字类型
如 文本 a="$32A4B8C6428B";字节 b;正整形 i;
bb>a+2;就把a的第三位置0xB8,换成了50
i读写数据的长度是按定义的变量类型长度,只有1、2、4字节这三种。
第七节 全局变量和局部变量
在小程序段内申请的变量包括提交的参数都是局部变量。
在子类或者数据表头内申请的变量属性子类变量。
在其它地方(小程序和子类外)申请的变量是全局变量。
全局变量包括字符、字节、整形、正整形、整数、正整数、小数、浮点、大数和自定义类型。
局部变量目前只有整数、小数和文本这三种。任何变量在作为参数传递的时候,均为4字节数字。
所以大于4字节的类型比如文本、浮点和自定义类型,提交的是变量的地址,而不是值。否则是按值传递。
因此小程序的参数通常只有整数和小数这两种,文本提交过来也是一个整数地址。
小数是提交参数要直接进行小数运算时,才需要特别指定。除此之外、任何提交的参数都可以写成整数类型。
子类本身并没有特别定义,它可以是全局的整数变量,也可以是局部整数,也可以是整数数组。
全局变量是编译程序时,提前在数据区段申请的。局部变量仅在小程序段内有效,属于临时存储空间。
子类和数据表的变量,是在程序运行之后,去动态申请的内存区块。子类使用前需要使用 新建 子类名称
数据表相当于自定义二维数组,使用前需要先“重置”数组的长度,该长度不能小于所读取数据的行数。
数据表可以使用数组的重置、保留和销毁方法,而子类只可以使用新建和销毁这两个方法。
子类和数据表的区别:
子类申请的内存区域并不是清零的,所以在新建的时候,可以用:玩家=新建 角色类(等级=1,职业=2,性别=1);
去设置子类变量的数值,未清零的内存数据是随机的,也就是说子类变量在新建子类时数值是不确定的。)
而数据表在重置长度后,内存区域是清零的,所有变量此时值都是0,数据表也可以用作自定义数组。
成员变量使用方法是:玩家表(0).性别,括号内是行号也就是数组的标号,是从0开始计数的。
子类变量的使用方法是:玩家.性别。如果申请的子类变量是数组形式,如:角色类 玩家()
也可以像数组一样,先 重置 玩家(1000),玩家(0)=新建 角色类; 玩家(0).性别=1;
但是销毁只能是先销毁一个成员,销毁 玩家(0)。或者 N=玩家(0);销毁 N;
子类变量在子类内部可以不加前缀直接访问,如:等级=100;职业=3;xb=性别等等。
全局变量、子类变量的名称是绝对不能重复的,重名就会优先判定为全局变量。
局部变量的申请和使用:
局部变量除文本外都是4字节,文本可以大于4字节,必须是4的整数倍。
局部变量最多可以申请空间1-2M,不使用局部变量则不申请,少量使用时(限120字节)
局部整数和小数变量30个以内,文本按申请的长度算。需要更多变量时,变量前加局部或local
并且放在小程序开头第一行,编译时候才好预计此小程序段需要申请多大的堆栈空间。如:局部 文本 ss[32];
局部变量与全局变量区别是很大的,编程语法上尽量做到能兼容使用,方便程序灵活处理。
局部文本和全局文本都可以像操作数组一样,读写其中每一字节。如:文本 s[16]="abc";s(2)=\d;
也可以像其它变量一样,写入数字。如:s=0;文本就被清空,s=$31323334;文本开头就等于4321
因为十六进制是反转的,最后的34写入字符的第一字节,对应文字是4,用s(1)读取出来就是52
第八节 常数的申请和使用
编程所用到的常数非常多,我们往往能很容易查到这个常数,却很难查到其对应的数值。
SEC简易编程收录了大约几万个通用常数,由于常数都是英文的,我只将最常用的一些进行汉化。
用中文起名的时候,还要考虑尽量不跟编程使用的关键字和变量名冲突,那么可以采用实用组合方案。
例如网络通讯必用的常数选项,FD_READ=数据可读 FD_WRITE=数据可写 FD_CONNECT=连接成功
FD_CLOSE=断开连接 FD_ACCEPT=接受连接 这些选项在实际运用中往往是组合在一起使用。
所以我们可以一到两个字来代表一个常数,读=FD_READ 写=FD_WRITE 连=FD_CONNECT 断=FD_CLOSE 监=FD_ACCEPT
用这些字组合之后起名,就不容易重名了,例如:常量 读写断开=[FD_READ | FD_WRITE | FD_CLOSE];
常量 读写连断=[FD_READ | FD_WRITE | FD_CONNECT | FD_CLOSE],监听断开=[FD_ACCEPT | FD_CLOSE];
|是或运算,通俗地说,就是数值里不包含该值就加上,如果包含就不加。而加号则无论是否包含都会相加。
多个常数组合时前后要加中括号,编译时就会计算成一个数值进行使用,而直接在代码里写FD_READ | FD_WRITE
是不会提前计算的,而是编译成相关运算的机器语言。因为编写代码时实际情况极其复杂,是很难判断出是常数组合
还是要与其它变量或者小程序的运算结果,或者是与外部函数返回的结果进行实际运算。所以尽量用汉字给组合命名
也只有中文才能做到如此方便简单。常数组合可以使用的符号有:+加、-减、|或、&与、^异或、!非。
其中!非运算是对当前常数进行非运算,如:!1=-2,它前面需要加其它符号和之前的常数进行运算。
部分常量中英文对照表:
中文名字 |
常量数值 |
英文名称 |
释义 |
初次调用 |
1 |
DLL_PROCESS_ATTACH |
当这个DLL被映射到了进程的地址空间时 |
创建线程 |
2 |
DLL_THREAD_ATTACH |
一个线程正在被创建 |
结束线程 |
3 |
DLL_THREAD_DETACH |
线程终结 |
结束调用 |
0 |
DLL_PROCESS_DETACH |
这个DLL从进程的地址空间中解除映射 |
窗口创建 |
1 |
WM_CREATE |
新建一个窗口 |
程序关闭 |
2 |
WM_DESTROY |
销毁一个窗口 |
窗口移动 |
3 |
WM_MOVE |
移动一个窗口 |
窗口缩放 |
5 |
WM_SIZE |
改变一个窗口的大小 |
窗口激活 |
6 |
WM_ACTIVATE |
一个窗口被激活或失去激活状态 |
获得焦点 |
7 |
WM_SETFOCUS |
将焦点转向一个窗口 |
失去焦点 |
8 |
WM_KILLFOCUS |
使一个窗口失去焦点 |
可用状态 |
10 |
WM_ENABLE |
使一个窗口处于可用状态 |
是否重绘 |
11 |
WM_SETREDRAW |
设置窗口是否能重绘 |
设置文本 |
12 |
WM_SETTEXT |
设置一个窗口的文本 |
获取文本 |
13 |
WM_GETTEXT |
复制窗口的文本到缓冲区 |
文本长度 |
14 |
WM_GETTEXTLENGTH |
得到窗口的文本长度(不含结束符) |
窗口重绘 |
15 |
WM_PAINT |
当需要绘制一部分应用窗口的时候,发送本消息给所有者程序 |
窗口关闭 |
$0010 |
WM_CLOSE |
用户关闭窗口时会发送本消息,紧接着会发送WM_DESTROY消息 |
系统关机 |
$0011 |
WM_QUERYENDSESSION |
关机或注销时系统会按优先级给各进程发送WM_QUERYENDSESSION,告诉应用程序要关机或注销了 |
消息结束 |
$0012 |
WM_QUIT |
关闭消息循环结束程序的运行 |
窗口恢复 |
$0013 |
WM_QUERYOPEN |
最小化的窗口即将被恢复以前的大小位置 |
擦除背景 |
$0014 |
WM_ERASEBKGND |
当一个窗口的背景必须被擦除时本消息会被触发(如:窗口大小改变时) |
系统变色 |
$0015 |
WM_SYSCOLORCHANGE |
当系统颜色改变时,发送本消息给所有顶级窗口 |
开始关机 |
$0016 |
WM_ENDSESSION |
关机或注销时系统会发出WM_QUERYENDSESSION消息,然后将本消息发送给应用程序,通知程序会话结束 |
时间错误 |
$0017 |
WM_SYSTEMERROR |
系统时间错误 |
显示窗口 |
$0018 |
WM_SHOWWINDOW |
发送本消息给一个窗口,以便隐藏或显示该窗口 |
绘制控件 |
$0019 |
WM_CTLCOLOR |
在每个控件开始绘制之前,都会向其父窗口发送此消息,可用来设置控件显示文本的前景色、背景色以及字体。 |
配置更新 |
$001A |
WM_WININICHANGE |
读写\"win.ini\"时会发送本消息给所有顶层窗口,通知其它进程该文件已被更改 |
设备模式 |
$001B |
WM_DEVMODECHANGE |
改变设备模式设置(\"win.ini\")时,处理本消息的应用程序可重新初始化它们的设备模式设置 |
界面激活 |
$001C |
WM_ACTIVATEAPP |
窗口进程激活状态改动,正被激活的窗口属于不同的应用程序 |
字库更新 |
$001D |
WM_FONTCHANGE |
当系统的字体资源库变化时发送本消息给所有顶级窗口 |
时间改变 |
$001E |
WM_TIMECHANGE |
当系统的时间变化时发送本消息给所有顶级窗口 |
模态窗口 |
$001F |
WM_CANCELMODE |
发送本消息来取消某种正在进行的模态(操作)(如鼠示捕获),例如:启动一个模态窗口时,父窗会收到本消息;该消息无参数 |
捕获光标 |
$0020 |
WM_SETCURSOR |
若鼠标光标在某窗口内移动且鼠标没被捕获时,就会发送本消息给某个窗口 |
拖曳后窗 |
$0021 |
WM_MOUSEACTIVATE |
当鼠标光标在某个未激活窗口内,而用户正按着鼠标的某个键时,会发送本消息给当前窗口 |
通知子窗 |
$0022 |
WM_CHILDACTIVATE |
点击窗口标题栏或当窗口被激活、移动、大小改变时,会发送本消息给MDI子窗口 |
窗口改变 |
$0024 |
WM_GETMINMAXINFO |
当窗口将要改变大小或位置时,由系统发送本消息给窗口,用户拖动一个可重置大小的窗口时便会发出本消息 |
图标重绘 |
$0026 |
WM_PAINTICON |
当一个最小化的窗口图标将被重绘时发送本消息 |
图标背景 |
$0027 |
WM_ICONERASEBKGND |
本消息发送给某个最小化的窗口,仅当它在画图标前它的背景必须被重画 |
切换焦点 |
$0028 |
WM_NEXTDLGCTL |
发送本消息给一个对话框程序窗口过程,以便在各控件间设置键盘焦点位置 |
打印变化 |
$002A |
WM_SPOOLERSTATUS |
每当打印管理列队增加或减少一条作业时就会发出本消息 |
外观改变 |
$002B |
WM_DRAWITEM |
按钮、组合框、列表框、菜单的外观改变时会发送本消息给这些控件的所有者 |
控件创建 |
$002C |
WM_MEASUREITEM |
按钮、组合框、列表框、列表控件、菜单项被创建时会发送本消息给这些控件的所有者 |
删除列表 |
$002D |
WM_DELETEITEM |
列表框或组合框被销毁或删除清空某些项时,会发送本消息给这些控件的所有者 |
列表按键 |
$002E |
WM_VKEYTOITEM |
LBS_WANTKEYBOARDINPUT风格的列表框会发出本消息给其所有者,以便响应WM_KEYDOWN消息 |
列表字符 |
$002F |
WM_CHARTOITEM |
LBS_WANTKEYBOARDINPUT风格的列表框会发送本消息给其所有者,以便响应WM_CHAR消息 |
指定字体 |
$0030 |
WM_SETFONT |
指定控件所用字体 |
获取字体 |
$0031 |
WM_GETFONT |
得到当前控件绘制其文本所用的字体 |
设置热键 |
$0032 |
WM_SETHOTKEY |
为某窗口关联一个热键 |
拖放小窗 |
$0037 |
WM_QUERYDRAGICON |
本消息发送给最小化的窗口,当该窗口将被拖放而其窗口类中没有定义图标,应用程序能返回一个图标或光标的句柄。 |
新项位置 |
$0039 |
WM_COMPAREITEM |
可发送本消息来确定组合框(CBS_SORT)或列表框(LBS_SORT)中新增项的相对位置 |
显存不足 |
$0041 |
WM_COMPACTING |
显示内存已经很少了 |
串口事件 |
$0044 |
WM_COMMNOTIFY |
Win3.1中,当串口事件产生时,通讯设备驱动程序发送消息本消息给系统,指示输入输出队列的状态 |
改变窗口 |
$0046 |
WM_WINDOWPOSCHANGING |
本消息会发送给那些大小和位置(Z_Order)将被改变的窗口,以调用SetWindowPos函数或其它窗口管理函数 |
窗口变化 |
$0047 |
WM_WINDOWPOSCHANGED |
本消息会发送给那些大小和位置(Z_Order)已被改变的窗口,以调用SetWindowPos函数或其它窗口管理函数 |
系统暂停 |
$0048 |
WM_POWER |
当系统将要进入暂停状态时发送本消息(适用于16位的windows) |
传递数据 |
$004A |
WM_COPYDATA |
当一个应用程序传递数据给另一个应用程序时发送本消息 |
取消日志 |
$004B |
WM_CANCELJOURNAL |
当用户取消程序日志激活状态时,发送本消息给那个应用程序。该消息使用空窗口句柄发送 |
控件事件 |
$004E |
WM_NOTIFY |
当某控件的某事件已发生或该控件需得到一些信息时,发送本消息给其父窗 |
帮助按键 |
$0053 |
WM_HELP |
按下后,若某菜单是激活的,就发给此窗口关联的菜单;否则就发送给有焦点的窗口;若当前都没有焦点,发给当前激活的窗口 |
用户出入 |
$0054 |
WM_USERCHANGED |
当用户已登入或退出后发送本消息给所有窗口;当用户登入或退出时以及系统更新用户设置时,立即发送本消息 |
消息判断 |
$0055 |
WM_NOTIFYFORMAT |
公用控件、自定义控件和其父窗通过本消息判断控件在WM_NOTIFY通知消息中是使用ANSI还是UNICODE |
点击右键 |
$007B |
WM_CONTEXTMENU |
当用户在某窗口中点击右键就发送本消息给该窗口,设置右键菜单 |
改变风格 |
$007C |
WM_STYLECHANGING |
当调用SetWindowLong函数将要改变一个或多个窗口的风格时,发送本消息给那个窗口 |
风格变化 |
$007D |
WM_STYLECHANGED |
当调用SetWindowLong函数改变一个或多个窗口的风格后,发送本消息给那个窗口 |
调分辨率 |
$007E |
WM_DISPLAYCHANGE |
当显示器的分辨率改变后,发送本消息给所有窗口 |
窗口图标 |
$007F |
WM_GETICON |
本消息发送给某个窗口,用于返回与某窗口有关联的大图标或小图标的句柄 |
设置图标 |
$0080 |
WM_SETICON |
应用程序发送本消息让一个新的大图标或小图标与某窗口相关联 |
首创窗口 |
$0081 |
WM_NCCREATE |
当某窗口首次被创建时,本消息在WM_CREATE消息发送前发送 |
区外删除 |
$0082 |
WM_NCDESTROY |
本消息通知某窗口,非客户区正在销毁 |
区外调整 |
$0083 |
WM_NCCALCSIZE |
当某窗口的客户区的大小和位置须被计算时发送本消息 |
光标离开 |
$0084 |
WM_NCHITTEST |
当用户在在非客户区移动鼠标、按住或释放鼠标时发送本消息(击中测试);若鼠标没有被捕获,则在得到光标之后发出 |
区外重绘 |
$0085 |
WM_NCPAINT |
当窗口框架(非客户区)必须被被重绘时,应用程序发送本消息给该窗口 |
区外激活 |
$0086 |
WM_NCACTIVATE |
本消息发送给某窗口,在窗口的非客户区被激活时重绘窗口 |
切换控件 |
$0087 |
WM_GETDLGCODE |
发送本消息给某个与对话框程序关联的控件,系统控制方位键和TAB键使输入进入该控件 |
经过区外 |
$00A0 |
WM_NCMOUSEMOVE |
当光标在某窗口的非客户区内移动时,发送本消息给该窗口 |
区外按下左键 |
$00A1 |
WM_NCLBUTTONDOWN |
当光标在某窗口的非客户区内的同时按下鼠标左键,会发送本消息 |
区外释放左键 |
$00A2 |
WM_NCLBUTTONUP |
当用户释放鼠标左键的同时光标在某窗口的非客户区内时,会发送本消息 |
区外双击左键 |
$00A3 |
WM_NCLBUTTONDBLCLK |
当用户双击鼠标左键的同时光标在某窗口的非客户区内时,会发送本消息 |
区外按下右键 |
$00A4 |
WM_NCRBUTTONDOWN |
当用户按下鼠标右键的同时光标在某窗口的非客户区内时,会发送本消息 |
区外释放右键 |
$00A5 |
WM_NCRBUTTONUP |
当用户释放鼠标右键的同时光标在某窗口的非客户区内时,会发送本消息 |
区外双击右键 |
$00A6 |
WM_NCRBUTTONDBLCLK |
当用户双击鼠标右键的同时光标在某窗口的非客户区内时,会发送本消息 |
区外按下中键 |
$00A7 |
WM_NCMBUTTONDOWN |
当用户按下鼠标中键的同时光标在某窗口的非客户区内时,会发送本消息 |
区外释放中键 |
$00A8 |
WM_NCMBUTTONUP |
当用户释放鼠标中键的同时光标在某窗口的非客户区内时,会发送本消息 |
区外双击中键 |
$00A9 |
WM_NCMBUTTONDBLCLK |
当用户双击鼠标中键的同时光标在某窗口的非客户区内时,会发送本消息 |
键盘起始 |
$0100 |
WM_KEYFIRST |
用于WinCE系统,本消息在使用GetMessage和PeekMessage函数时,用于过滤键盘消息 |
键盘按下 |
$0100 |
WM_KEYDOWN |
当一个非系统按键被按下时(键没有被按下),会发送本消息给拥有键盘焦点的窗口 |
键盘松开 |
$0101 |
WM_KEYUP |
当一个非系统按键被释放弹起时(键没有被按下),会发送本消息给拥有键盘焦点的窗口 |
键入字符 |
$0102 |
WM_CHAR |
按下某按键,并已发出WM_KEYDOWN、WM_KEYUP消息,本消息包含被按下的按键的字符码 |
点击按键 |
$0103 |
WM_DEADCHAR |
\"死字符\"消息,当使用TranslateMessage函数翻译WM_KEYUP消息时,发送本消息给拥有键盘焦点的窗口 |
ALT键盘按下 |
$0104 |
WM_SYSKEYDOWN |
当用户按住键的同时又按下其它键时,发送本消息给拥有焦点的窗口 |
ALT键盘松开 |
$0105 |
WM_SYSKEYUP |
当用户释放一个按键的同时键还按着时,发送本消息给拥有焦点的窗口 |
ALT键入字符 |
$0106 |
WM_SYSCHAR |
当WM_SYSKEYDOWN消息被TranslateMessage函数翻译后,发送本消息给拥有焦点的窗口,注:键被按下 |
ALT点击按键 |
$0107 |
WM_SYSDEADCHAR |
\"死字符\"消息,当使用TranslateMessage函数翻译WM_SYSKEYDOWN消息时,发送本消息给拥有键盘焦点的窗口 |
键盘结束 |
$0108 |
WM_KEYLAST |
用于WinCE系统,本消息在使用GetMessage和PeekMessage函数时,用于过滤键盘消息 |
窗口初始 |
$0110 |
WM_INITDIALOG |
在某对话框程序被显示前发送本消息给该对话框程序,通常用本消息对控件进行一些初始化工作和执行其它任务 |
单击左键 |
$0111 |
WM_COMMAND |
用户选择一条菜单命令项或某控件发送一条通知消息给其父窗,或某快捷键被翻译时,本消息被发送 |
单击窗口 |
$0112 |
WM_SYSCOMMAND |
当用户选择一条系统菜单命令、用户最大化或最小化或还原或关闭时,窗口会收到本消息 |
定时事件 |
$0113 |
WM_TIMER |
发生了定时器事件 |
水平滚动 |
$0114 |
WM_HSCROLL |
当窗口的标准水平滚动条产生一个滚动事件时,发送本消息给该窗口 |
垂直滚动 |
$0115 |
WM_VSCROLL |
当窗口的标准垂直滚动条产生一个滚动事件时,发送本消息给该窗口 |
按下菜单 |
$0116 |
WM_INITMENU |
当一个菜单将被激活时发送本消息,它发生在用户点击了某菜单项或按下某菜单键。它允许程序在显示前更改菜单 |
弹出菜单 |
$0117 |
WM_INITMENUPOPUP |
当一个下拉菜单或子菜单将被激活时发送本消息,它允许程序在它显示前更改菜单,却不更改全部菜单 |
选择菜单 |
$011F |
WM_MENUSELECT |
当用户选择一条菜单项时,发送本消息给菜单的所有者(一般是窗口) |
菜单激活 |
$0120 |
WM_MENUCHAR |
当菜单已被激活且用户按下了某菜单字符键(括号括着、带下划线,不同于快捷键),发送本消息给菜单的所有者 |
模框空载 |
$0121 |
WM_ENTERIDLE |
当一个模态对话框或菜单进入空闲状态时,发送本消息给它的所有者,就是在处理完先前的消息后,消息队列为空时 |
菜单右键 |
$0122 |
WM_MENURBUTTONUP |
本消息允许程序为菜单项提供一个感知上下文的菜单(即快捷菜单) |
菜单点击 |
$0123 |
WM_MENUDRAG |
当用户拖动菜单项时,发送本消息给拖放菜单的拥有者,可让菜单支持拖拽,可使用OLE拖放传输协议启动拖放操作 |
单击菜单 |
$0126 |
WM_MENUCOMMAND |
当用户在一个菜单上作出选择时,会发送本消息,菜单要具有MNS_NOTIFYBYPOS风格(在MENUINFO结构体中设置) |
绘制弹窗 |
$0132 |
WM_CTLCOLORMSGBOX |
系统绘制消息框前发送本消息给消息框的所有者窗口,可用来设置消息框的文本和背景色 |
绘制编辑 |
$0133 |
WM_CTLCOLOREDIT |
当一个编辑框控件将要被绘制时,发送本消息给其父窗;可用来设置编辑框的文本和背景色 |
绘制列表 |
$0134 |
WM_CTLCOLORLISTBOX |
当一个列表框控件将要被绘制前,发送本消息给其父窗;可用来设置列表框的文本和背景色 |
绘制按钮 |
$0135 |
WM_CTLCOLORBTN |
息设置按钮的背景色 |
绘制对话 |
$0136 |
WM_CTLCOLORDLG |
设置对话框的背景色,通常是在WinnApp中使用SetDialogBkColor函数实现 |
绘制滚条 |
$0137 |
WM_CTLCOLORSCROLLBAR |
设置滚动条的背景色 |
绘制静态 |
$0138 |
WM_CTLCOLORSTATIC |
设置一个静态控件的背景色 |
鼠标起始 |
$0200 |
WM_MOUSEFIRST |
鼠标移动时发生(与WM_MOUSEMOVE等值),常用于判断鼠标消息的范围 |
鼠标移动 |
$0200 |
WM_MOUSEMOVE |
当鼠标在窗口客户区移动时 |
按下左键 |
$0201 |
WM_LBUTTONDOWN |
当鼠标左键在窗口客户区按下 |
释放左键 |
$0202 |
WM_LBUTTONUP |
当鼠标左键在窗口客户区放开 |
双击左键 |
$0203 |
WM_LBUTTONDBLCLK |
当鼠标左键在窗口客户区双击 |
按下右键 |
$0204 |
WM_RBUTTONDOWN |
当鼠标右键在窗口客户区按下 |
释放右键 |
$0205 |
WM_RBUTTONUP |
当鼠标右键在窗口客户区放开 |
双击右键 |
$0206 |
WM_RBUTTONDBLCLK |
当鼠标右键在窗口客户区双击 |
按下中键 |
$0207 |
WM_MBUTTONDOWN |
当鼠标中键在窗口客户区按下 |
释放中键 |
$0208 |
WM_MBUTTONUP |
当鼠标中键在窗口客户区放开 |
双击中键 |
$0209 |
WM_MBUTTONDBLCLK |
当鼠标中键在窗口客户区双击 |
滚轮转动 |
$020A |
WM_MOUSEWHEEL |
当滚动鼠标滚轮时 |
鼠标结束 |
$020A |
WM_MOUSELAST |
WM_MBUTTONDBLCLK的别名,通常用于判断鼠标消息的范围,对应的还有WM_MOUSEFIRST(鼠标起始) |
剪切 |
$0300 |
WM_CUT |
应用程序发送本消息给一个编辑框或组合框来删除当前选择的文本 |
复制 |
$0301 |
WM_COPY |
应用程序发送本消息给一个编辑框或组合框,以便用CF_TEXT格式复制当前选择的文本到剪贴板 |
粘贴 |
$0302 |
WM_PASTE |
应用程序发送本消息给编辑框或组合框,以便从剪贴板中得到数据 |
清除 |
$0303 |
WM_CLEAR |
应用程序发送本消息给编辑框或组合框,以清除当前选择的内容 |
撤销 |
$0304 |
WM_UNDO |
应用程序发送本消息给编辑框或组合框,以撤消最后一次操作 |
下载安装
如若转载,请注明出处:https://www.daxuejiayuan.com/18770.html