gdi高级编程
‘壹’ GDI+高级编程的编辑推荐
《GDI+高级编程》是由清华大学出版社出版的。《GDI+高级编程》采用C#语言描述,面向对.NET框架有一定认识并有一定编程经验的中高级读书。《GDI+高级编程》也可以作为对GDI+和C#感兴趣的在校师生的参考读物。
‘贰’ 谁给我推荐一本关于GDI+的C#高级编程的书
《GDI+高级编程》,《GDI+图形程序设计》,《GDI+程序设计》
http://www.amazon.cn/GDI-%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B-%E6%9D%A8%E5%BB%BA%E6%98%8C/dp/B00328IJ6O/ref=sr_1_fkmr1_1?ie=UTF8&qid=1318138888&sr=8-1-fkmr1
http://www.amazon.cn/GDI-%E5%9B%BE%E5%BD%A2%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1-%E9%92%B1%E5%BE%B7/dp/B0011ASANM/ref=sr_1_fkmr1_3?ie=UTF8&qid=1318138888&sr=8-3-fkmr1
http://www.amazon.cn/GDI-%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/dp/B0011ABUMA/ref=sr_1_fkmr1_2?ie=UTF8&qid=1318138888&sr=8-2-fkmr1
‘叁’ 怎么学习api函数
API是包含在一个附加名为DLL的动态连接库文件中的。用标准的定义来讲,API就是Windows的32位应用程序编程接口,是一系列很复杂的函数,消息和结构,可以说,如果你曾经学过VC,那么API对你来说不是什么问题。但是如果你没有学过VC,或者你对Windows95的结构体系不熟悉,那么可以说,学习API将是一件很辛苦的事情。 如果你打开WINDOWS的SYSTEM文件夹,你可以发现其中有很多附加名为DLL的文件。一个DLL中包含的API函数并不只是一个,数十个,API函数总共大约有110多个。如果要全部掌握!那你非下苦功不可,但实际上,我们真的没必要都掌握,只要重点掌握Windos系统本身自带的API函数就可以了。我可以敢跟你说,只要你熟悉地掌握100个,那么你的编程水平比现在高出至少要两倍。API函数和WINDOWS具有密切的关系,如果你学会了API,首要的收获便是对WINDOWS体系结构的认识。这个收获是来自不易的。 如果你不依靠API会怎么样?我可以跟你说,绝大多是高级编程书本(当然这不是书的名程叫高级而高级的,而是在一开始的《本书内容》中指明《本书的阅读对象是具有一定VB基础的读者》的那些书),首先提的问题一般大都是从API开始。因此可以说,你不学API,你大概将停留在初级水平,无法往上攀登。很多API函数都是很长很长的。想看什么样子吗?如下就是作为例子的API DdeClientTransaction函数∶
Declare Function DdeClientTransaction Lib "user32" (pData As Byte, ByVal cbData As Long, ByVal hConv As Long, ByVal hszItem As Long, ByVal wFmt As Long, ByVal wType As Long, ByVal dwTimeout As Long, pdwResult As Long) As Long
哇!这么长?如果你从来没有接触过API,我想你肯定被吓住了。你也许考虑,该不该继续学下去。不过不要担心,幸运的是Microsoft的设计家们为我们提供了有用的工具,这便是API
文本查看器。 通过API文本查看器,我们可以方便地查找程序所需要的函数声明、结构类型和常数,然后将它复制到剪贴板,最后再粘贴到VB程序的代码段中。在大多数情况下,只要我们确定了程序所需要的函数、结构和常数这三个方面后,就可以通过对API文本游览器的以上操作将他们加入到程序段中,从而程序中可以使用这些函数了。这些是学习API最基本的常识问题,它远远占不到API的庞大的体系内容。今后我们把精力浪费(这绝不是浪费)在哪里呢?那就是∶
Function SetWindowRgn Lib "user32"Alias "SetWindowRgn" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long 即,这行代码定义了名为SetWindowRgn的函数,此函数具有一个Long型数据类型的参数,并按值传递(ByVal),函数执行后将返回一个Long型数据。
API函数的声明也很类似,如,API中的SetWindowRgn 函数是这样写的∶Public Declare Function SetWindowRgn Lib "user32" Alias "SetWindowRgn" (ByVal hWnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long Declare 语句用于在模块级别中声明对动态链接库 (DLL) 中外部过程的引用。对此,你只要记住任何API函数声明都必须写这个语句就可以了。
Iib 指明包含所声明过程或函数的动态链接库或代码资源。也就是说,它说明的是,函数或过程从何而来的问题。
如在上例中,SetWindowRgn Lib "user32"说明 函数 SetWindowRgn 来自 user32.dll文件。主要的dll动态连接库文件有∶
user32.dll Windows管理。生成和管理应用程序的用户接口。GDI32.dll 图形设备接口。产生Windows设备的图形输出
Kernel32.dll 系统服务。访问操作系统的计算机资源。
注意,当DLL文件不在Windows或System文件夹中的时候,必须在函数中说明其出处(
路径)。如,SetFocus Lib "c:\Mydll\user32"
函数声明中的Alias 是可选的。表示将被调用的过程在动态链接库 (DLL) 中还有另外的名称(别名)。如,Alias "SetWindowRgn" ,说明SetWindowRgn函数在User32.dll中的另外一个名称是,
SetWindowsTextA,表示为Alias "SetWindowsTextA"。这个A只不过是设计家们的习惯的命名约定,表示函数属于ANSI版本。需要注意的是,不是所有的API函数都有别名.选用Alias的时候,应注意别名的大小写;如果不选用Alias 时的时候,函数名必须注意大小写,而且不能改动。当然,在很多情况下,由于函数声明是直接从API
文本游览器中拷贝过来的,所以这种错误的发生机会是很少的,但您有必要知道这一点。
最后提醒你一句,API声明(包括结构、常数)必须放在窗体或模块的"通用(General Declarations)段。
数据类型与"类型安全" [返回]API函数中使用的数据类型基本上和VB中的一样。但作为WIN32的API函数中,不存在Integer
数据类型。另外一点是在API函数中看不到Boolean数据类型。 Variant数据类型在API函数中是以Any的形式出现,如Data As Any。尽管其含义是允许任意参数类型作为一个该API函数的参数传递,但这样做存在一定的缺点。其原因是,这将会使得对目标参数的所有类型检查都会被关闭。这自然会给各种类型的参数调用带来了产生错误的机会。
‘肆’ C++教程 求个好的C++教程 下载地址
★★强烈推荐★★ 全国计算机等级考试网 http://www.zxrd.com/ncre/index.asp?ip=2011996 含历年各级等级考试笔试真题及答案、上机真题。
全国计算机等级考试上机考试系统(超级模拟软件)根据考试大纲、历年命题规律以及作者的实际经验预测考试内容。该系统以对学生进行综合指导为原则,具有极强针对性,特别适合希望在较短时间内取得较大收获的广大应试考生。
本系统依据等级考试的特点提供了全真的模拟环境和全真的试题,原题命中率高达100%。在作者所辅导的学生中,应用本系统,上机通过率高达95%,满分高达47%。本系统含100套上机真题,真正免费下载、免费注册。(现在有些软件或者题量太少,或者要缴费注册。该软件的出现真是广大考生的福音。)全国计算机等级考试上机考试系统(超级模拟软件)下载地址: http://www.zxrd.com/ncre/soft.asp?ip=2011996
免费注册地址: http://www.zxrd.com/ncre/reg.asp?ip=2011996
‘伍’ GDI+高级编程的目录
第1章 .NET Framework 2.0图形设备接口 1
1.1 GDI+Vs GDI、DirectX、OpenGL 1
1.2 Visual Studio 2005集成开发环境与Visual C# 3
1.3 System.Drawing.dll程序集 13
1.4 本章小结 14
第2章 Windows视觉样式和WinForm基础控件 15
2.1 VisualStyles和ControlPaint类 15
2.1.1 视觉样式浏览器 16
2.1.2 ControlPaint类 31
2.1.3 Windows导航栏控件 34
2.2 分层窗口 42
2.2.1 分层窗口的概念 42
2.2.2 CreateParams类 44
2.2.3 使用分层窗口 46
2.3 颜色空间和拾色器 52
2.3.1 颜色空间 52
2.3.2 色彩转换 64
2.3.3 拾色器 75
2.4 本章小结 150
第3章 GDI+与.NET创意控件 152
3.1 不规则形状 152
3.1.1 Circle类 153
3.1.2 Circle类型转换器 159
3.1.3 高级衍生图形 163
3.1.4 WaitingCircle控件 167
3.2 坐标系统与度量单位 175
3.2.1 坐标系统 176
3.2.2 屏幕坐标与工作区坐标 179
3.2.3 度量单位 180
3.2.4 Ruler控件 183
3.3 矩阵变换 192
3.3.1 Matrix类 192
3.3.2 矩阵的仿射变换 194
3.3.3 全局变换和局部变换 199
3.3.4 Tuner控件 204
3.4 设计时支持 211
3.4.1 设计时框架 211
3.4.2 优化属性网格编辑 214
3.4.3 设计器 220
3.4.4 设计器序列化 236
3.4.5 调试设计时代码 243
3.4.6 自定义窗体设计器 244
3.5 添加音效 262
3.5.1 播放声音 262
3.5.2 音乐播放器 264
3.5.3 控制系统音量 272
3.6 管理双倍缓存 273
3.6.1 位图双缓存 273
3.6.2 BufferedGraphics类 278
3.7 本章小结 280
第4章 字体、文本和打印 281
4.1 字体概述 281
4.1.1 基本概念 281
4.1.2 TrueType与OpenType字体 283
4.1.3 Microsoft ClearType技术 284
4.1.4 GDI+中的字体 287
4.2 绘制格式化文本 289
4.2.1 文本修整 289
4.2.2 文本简排 290
4.3 测量文字大小 295
4.3.1 字体规格和排版 295
4.3.2 精确测量文字大小 299
4.4 3D效果文本 301
4.4.1 阴影文本 301
4.4.2 拉伸文本 302
4.4.3 浮雕及雕刻 303
4.4.4 镜像文本 304
4.5 沿路径文字 305
4.5.1 中式圆形印章 305
4.5.2 按任意路径排版 309
4.6 打印 316
4.6.1 打印概述 316
4.6.2 打印设置与打印预览 319
4.6.3 处理页边距和多页 324
4.7 本章小结 328
第5章 动画 329
5.1 播放GIF动画 329
5.1.1 动态GIF图像 330
5.1.2 ImageAnimator类 333
5.2 幻灯片 335
5.2.1 淡入与淡出效果 339
5.2.2 溶解效果 341
5.2.3 收缩效果 343
5.2.4 分散效果 346
5.2.5 翻转效果 349
5.2.6 幻灯片控制器 354
5.3 屏幕保护程序 357
5.3.1 屏保概述 358
5.3.2 肥皂泡泡屏保 359
5.4 GDI+游戏 372
5.4.1 场景控制器 373
5.4.2 处理用户输入 381
5.4.3 人工智能 384
5.5 本章小结 393
第6章 分形艺术 394
6.1 分形概述 394
6.1.1 分形和分形几何 395
6.1.2 分形艺术 398
6.1.3 分形模型 401
6.2 绘制分形图像 405
6.2.1 L-System及其应用 406
6.2.2 美妙的复动力系统 411
6.3 本章小结 424
第7章 图像处理 425
7.1 图像处理概述 425
7.1.1 常见图像格式 426
7.1.2 使用GDI+处理图像 430
7.1.3 处理图像Exif信息 435
7.2 图像预处理 444
7.2.1 单像素重新着色 445
7.2.2 直方图与直方图均衡 454
7.2.3 图像变换 462
7.3 邻域运算与卷积 478
7.4 色彩混合模式 483
7.4.1 伪混合模式 484
7.4.2 可交换对称模式 485
7.4.3 非对称模式 491
7.4.4 其他混合模式 498
7.5 特效虑镜 499
7.5.1 浮雕 500
7.5.2 霓虹 502
7.5.3 毛玻璃 504
7.5.4 柔和 506
7.5.5 素描 509
7.6 其他实用技术 511
7.6.1 图层与混合 511
7.6.2 仅操作选区 515
7.6.3 平滑与羽化选区 518
7.6.4 由Region重构GraphicsPath对象 522
7.7 本章小结 525
附录一 GDI+特性速查 526
附录二 .NET精简版提供的GDI+特性 538参考文献 544
‘陆’ 高分悬赏visual c++编程题
long factorial(int m) //用于求阶乘
{
if(m==0||m==1)
return 1;
else return m*factorial(m-1);
}
long forSum(int n) //用于求阶乘之和
{
int i=0;
long y=0;
for(i=1;i<=n;i++)
{
y+=factorial(i);
}
return y;
}
#include <stdio.h>
int main()
{
long y=0;
int n=0;
printf("请输入一个 n:");
scanf("%d",&n);
printf("y=%d\n",forSum(n));
printf("n=%d\n",n);
return 0;
}
第二题:
int weiShu(int x) //用于判断数x是几位数
{
int flag=0;
do
{
x=x/10;
flag++;
}while(x!=0);
return flag;
}
#include <stdio.h>
{
int flag=0,x=0,i=0;
int sum=0;
printf("请输入一个数 x=");
scanf("%d",&x);
flag=weiShu(x);
for(i=1;i<=flag;i++)
{
sum+=x%10;
x=x/10;
}
printf("%d各个位上数字之和是%d\n",x,sum);
}
‘柒’ C# 学习 高级
自定义控件的方法在你有的那些“基础的”书里没说么……
那稍微深点的么就是《C#高级编程》
这本书里讲的很少但是把自定义控件的原理和大概的流程说清楚了
要跟着书上说的自己写例子查资料才行
至于专门讲怎么做自定义控件的书我就不清楚了
祝你好运……
‘捌’ 游戏编程
学习游戏编程最好是有系统的学习方式,有老师带领会高效得多。
当下互联网行业发展迅速,与之相关的产业大多发展都很好,游戏设计的前景自然也是相当不错的。一个游戏问世要经历很多环节,剧本设计,原画创作,场景建模,但核心部分还是编程语言开发。
主要学的内容如下:
1.游戏程序设计:C++程序设计入门;基本数据类型和输入输出;流程控制语句;数组、指针和引用、函数;程序结构和书写规;范结构体和联合体、类;继承与多态;异常处理与程序调试。
2.算法与数据结构:算法分析;数据结构;基本算法;STL的概念与使用;静态库与动态库;XML库的使用。
3.Win32程序设计:Windows程序入门;Windows消息;GDI绘图游戏工具与MFC;网络编程基础。
4.游戏数学和智能应用:游戏中的坐标系;矢量、矩阵;几何碰撞;物理模拟;人工智能与寻路算法。
5.2D游戏技术与应用:2D游戏技术概论;游戏地图系统;GUI系统;战斗系统设计;任务系统;优秀的声音引擎BASS;Cocos2D-X引擎;Box2D物理引擎。
互联网行业目前还是最热门的行业之一,学习IT技能之后足够优秀是有机会进入腾讯、阿里、网易等互联网大厂高薪就业的,发展前景非常好,普通人也可以学习。
想要系统学习,你可以考察对比一下开设有相关专业的热门学校,好的学校拥有根据当下企业需求自主研发课程的能力,能够在校期间取得大专或本科学历,中博软件学院、南京课工场、南京北大青鸟等开设相关专业的学校都是不错的,建议实地考察对比一下。
祝你学有所成,望采纳。
‘玖’ 解释下VB里的API函数及作用
什么是API
首先,有必要向大家讲一讲,什么是API。所谓API本来是为C和C++程序员写的。API说来说去,就是一种函数,他们包含在一个附加名为DLL的动态连接库文件中。用标准的定义来讲,API就是Windows的32位应用程序编程接口,是一系列很复杂的函数,消息和结构,它使编程人员可以用不同类型的编程语言编制出的运行在Windows95和Windows NT操作系统上的应用程序。可以说,如果你曾经学过VC,那么API对你来说不是什么问题。但是如果你没有学过VC,或者你对Windows95的结构体系不熟悉,那么可以说,学习API将是一件很辛苦的事情。
如果你打开WINDOWS的SYSTEM文件夹,你可以发现其中有很多附加名为DLL的文件。一个DLL中包含的API函数并不只是一个,数十个,甚至是数百个。我们能都掌握它嘛?回答是否定的∶不可能掌握。但实际上,我们真的没必要都掌握,只要重点掌握Windos系统本身自带的API函数就可以了。但,在其中还应当抛开掉同VB本身自有的函数重复的函数。如,VB
的etAttr命令可以获得文件属性,SetAttr可以设置文件属性。对API来讲也有对应的函数
GetFileAttributes和SetFileAttributes,性能都差不多。如此地一算,剩下来的也就5、600个。是的,也不少。但,我可以敢跟你说,只要你熟悉地掌握100个,那么你的编程水平比现在高出至少要两倍。尽管人们说VB和WINDOWS具有密切的关系,但我认为,API更接近
WINDOWS。如果你学会了API,首要的收获便是对WINDOWS体系结构的认识。这个收获是来自不易的。
如果你不依靠API会怎么样?我可以跟你说,绝大多是高级编程书本(当然这不是书的名程叫高级而高级的,而是在一开始的《本书内容》中指明《本书的阅读对象是具有一定VB基础的读者》的那些书),首先提的问题一般大都是从API开始。因此可以说,你不学API,你大概将停留在初级水平,无法往上攀登。唯一的途径也许就是向别人求救∶我快死了,快来救救我呀,这个怎么办,那个怎么办?烦不烦呢?当然,现在网上好人太多(包括我在内,嘻嘻),但,你应当明白,通过此途径,你的手中出不了好的作品。这是因为缺乏这些知识你的脑子里根本行不成一种总体的设计构思。
API文本游览器 [返回]
很多API函数都是很长很长的。想看什么样子吗?如下就是作为例子的API DdeClientTransaction函数∶
Declare Function DdeClientTransaction Lib "user32" (pData As Byte, ByVal cbData As Long, ByVal hConv As Long, ByVal hszItem As Long, ByVal wFmt As Long, ByVal wType As Long, ByVal dwTimeout As Long, pdwResult As Long) As Long
哇!这么长?如果你从来没有接触过API,我想你肯定被吓住了。你也许考虑,该不该继续学下去。不过不要担心,幸运的是Microsoft的设计家们为我们提供了有用的工具,这便是API
文本查看器。
通过API文本查看器,我们可以方便地查找程序所需要的函数声明、结构类型和常数,然后将它复制到剪贴板,最后再粘贴到VB程序的代码段中。在大多数情况下,只要我们确定了程序所需要的函数、结构和常数这三个方面后,就可以通过对API文本游览器的以上操作将他们加入到程序段中,从而程序中可以使用这些函数了。这些是学习API最基本的常识问题,它远远占不到API的庞大的体系内容。今后我们把精力浪费(这绝不是浪费)在哪里呢?那就是∶
什么时候使用什么函数,什么时候使用什么结构类型,什么时候使用什么常数。
API函数声明
让我们回想一下。在VB中,如何声明函数呢?我想,如果你正在看此文,那么你绝对能够回答得出这个问题。以下便是你应该很熟悉的函数声明∶
Function SetFocus (ByVal hwnd As Long) As Long
即,这行代码定义了名为SetFocus的函数,此函数具有一个Long型数据类型的参数,并按值传递(ByVal),函数执行后将返回一个Long型数据。
API函数的声明也很类似,如,API中的SetFocus 函数是这样写的∶
Declare Function SetFocus Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long
有点复杂了一些。是的,是复杂了点。但我可以告诉你,除了这些多出来的部分,其他部分还是和你以前学到的东西是一样的。函数在程序中的调用也是一样。如:
Dim dl As Long
dl&=SetFoucs(Form1.Hwnd)
但,一点是清楚的。它不象你自己写的程序那样能够看到里面的运行机理,也不像VB
自带的函数那样,能够从VB的联机帮助中查到其用法。唯一的方法就是去学、查VB以外的资料。
Declare 语句用于在模块级别中声明对动态链接库 (DLL) 中外部过程的引用。对此,你只要记住任何API函数声明都必须写这个语句就可以了。
Iib 指明包含所声明过程或函数的动态链接库或代码资源。也就是说,它说明的是,函数或过程从何而来的问题。
如在上例中,SetFocus Lib "user32"说明 函数 SetFocus 来自 user32.dll文件。主要的dll动态连接库文件有∶
user32.dll Windows管理。生成和管理应用程序的用户接口。
GDI32.dll 图形设备接口。产生Windows设备的图形输出
Kernel32.dll 系统服务。访问操作系统的计算机资源。
注意,当DLL文件不在Windows或System文件夹中的时候,必须在函数中说明其出处(
路径)。如,SetFocus Lib "c:\Mydll\user32"
函数声明中的Alias 是可选的。表示将被调用的过程在动态链接库 (DLL) 中还有另外的名称(别名)。如,Alias "SetFocus" ,说明SetFocus函数在User32.dll中的另外一个名称是,
SetFocus。怎么两个名都一样呢?当然,也可以是不同的。在很多情况下,Alias说明的函数名,即别名最后一个字符经常是字符A,如SetWindowsText函数的另一个名称是
SetWindowsTextA,表示为Alias "SetWindowsTextA"。这个A只不过是设计家们的习惯的命名约定,表示函数属于ANSI版本。
那么,别名究竟有什么用途呢?从理论上讲,别名提供了用另一个名子调用API的函数方法。如果你指明了别名,那么 尽管我们按Declare语句后面的函数来调用该函数,但在函数的实际调用上是以别名作为首要选择的。如,以下两个函数(Function,ABCD)声明都是有效的,他们调用的是同一个 SetFocus函数∶
Declare Function SetFocus Lib "user32" "SetFocus" (ByVal hwnd As Long) As Long
Declare ABCD SetFocus Lib "user32" Alias "SetFocus" (ByVal hwnd As Long) As Long
需要注意的是,选用Alias的时候,应注意别名的大小写;如果不选用Alias 时的时候,函数名必须注意大小写,而且不能改动。当然,在很多情况下,由于函数声明是直接从API
文本游览器中拷贝过来的,所以这种错误的发生机会是很少的,但您有必要知道这一点。
最后提醒你一句,API声明(包括结构、常数)必须放在窗体或模块的"通用(General Declarations)段。
数据类型与"类型安全"
API函数中使用的数据类型基本上和VB中的一样。但作为WIN32的API函数中,不存在Integer
数据类型。另外一点是在API函数中看不到Boolean数据类型。 Variant数据类型在API函数中是以Any的形式出现,如Data As Any。尽管其含义是允许任意参数类型作为一个该API函数的参数传递,但这样做存在一定的缺点。其原因是,这将会使得对目标参数的所有类型检查都会被关闭。这自然会给各种类型的参数调用带来了产生错误的机会。
为了强制执行严格的类型检查,并避免上面提到的问题,一个办法是在函数里使用上面提到到Alias技术。如对API函数 GetDIBits 可进行另外一种声明方法。如下∶
GetDIBits函数的原型∶
Public Declare Function GetDIBits Lib "gdi32" Alias "GetDIBits" (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long
GetDIBits函数的改型∶
Public Declare Function GetDIBitsLong Lib "gdi32" Alias "GetDIBits" (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Long, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long
通过本课程前面所学到的知识,我们已经可以得知原型 GetDIBits函数也好,改型 GetDIBitsLong函数也好,实际将调用的都是Alias所指定的 GetDIBits原函数。但你应当看到,两者的区别在于,我们在改型的函数中强制指定lpBits参数为Long形。这样就会使得函数调用中发生的错误机率减少到了最小。这种方法叫做"安全类型"声明。
API函数中经常看到的数据类型有∶Long,String,Byte,Any....(也就这些吧。)
常 数
对于API常数来讲,没有什么太特别的学问。请看VB中的以下代码∶
Msg = MsgBox("您好", vbOKCancel)
我们知道, vbOKCancel这个常数的值等于1。对上面的代码我们完全可以这样写,而不会影响代码的功能∶
Msg = MsgBox("您好", 1)
但你大概不太愿意选择后一种,因为这会使得看懂代码费劲起来。这种方法也被API采取了。只是API常数必须在事情之前做好初始化声明VB本身是看不懂的。其内容仍然来自与API
文本游览器。具体形式如下等等∶
Public Const ABM_ACTIVATE = &H6
Public Const RIGHT_CTRL_PRESSED = &H4
Public Const RPC_E_SERVER_DIED = &H80010007
Private Const RPC_S_CALL_FAILED_DNE = 1727&
在常数的初始化中,有些程序使用Global,如Global Const ABM_ACTIVATE = &H6,但我认为Public完全可以代替它。过去我也用过Global,但现在不大用了。一会儿用这个,一会儿用那个,各程序之间不能保持一致性了,起码看起来别扭。
结 构 [返回]
结构是C和C++语言中的说法。在VB中一般称为自定义数据类型。想必很多朋友都已经认识它。在API领域里,我更喜欢把它叫做结构,因为API各种结构类型根本不是我定义(
自定义)的。
在VB中,API结构同样由TYPE.......END TYPE语句来定义。如,在API中,点(Point)结构的定义方法如下:
Public Type POINTAPI
X As Long '点在X坐标(横坐标)上的坐标值
Y As Long '点在Y坐标(纵坐标)上的坐标值
End Type
又如,API中矩形(Rect)结构的定义如下∶
Public Type RECT
Left As Long '矩形左上角的X坐标
Top As Long '矩形左上角的Y坐标
Right As Long '矩形右下角的X坐标
Bottom As Long '矩形右下角的Y坐标
End Type
这些内容同样可以从API文本游览器中拷贝过来。这些结构中的变量名可随意改动,而不会影响结构本身。也就是说,这些成员变量都是虚拟的。如,POINTAPI结构可改为如下∶
Public Type POINTAPI
MyX As Long '点在X坐标(横坐标)上的坐标值
MyY As Long '点在Y坐标(纵坐标)上的坐标值
End Type
不过,一般来讲,是没有这种必要的。结构本身是一种数据类型,因此,使用时必须声明具体变量为该结构型,才能在程序中真正使用到该结构。结构的声明方法和其他数据的声明方法一样,如,以下语句把变MyPoint声明为POINTAPI结构类型∶
MyPoint As POINTAPI
引用结构中的成员变量也十分简单,在结构名后面加上一个".",然后紧接着写要引用的成员变量即可。这很象VB中的引用一个对象的某个属性。如,假如我们把上面已经声明的MyPoint结构中的X变量的值赋给变量Temp&
则代码如下∶
Temp&=MyPoint.X
但,特别注意的是,你千万不要认为上例中的MyPoint是一个值。它不是值,而是地址(
指针)。值和地址是完全不同的概念。结构要求按引用传递给WINDOWS函数,即所有API
函数中,结构都是按ByRef传递的(在Declare语句 中ByRef是默认型)。对于结构的传递,你不要试图采用ByVal,你将一无所获。由于结构名实际上就是指向这个结构的指针(这个结构的首地址),所以,你也就传送特定的结构名就可以了(参见小结,我用红色字体来突出了这种传递方式)。
由于结构传送的是指针,所以函数将直接对结构进行读写操作。这种特性很适合于把函数执行的结果装载在结构之中。
小 结 [返回]
以下的程序是为了总结本课中学到的内容而给出的。启动VB,新建一个项目,添加一个命令按钮,并把下面的代码拷贝到代码段中,运行它。
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Type POINTAPI '定义点(Point)结构
X As Long '点在X坐标(横坐标)上的坐标值
Y As Long '点在Y坐标(纵坐标)上的坐标值
End Type
Sub PrintCursorPos( )
Dim dl AS Long
Dim MyPoint As POINTAPI
dl&= GetCursorPos(MyPoint) '调用函数,获取屏幕鼠标坐标
Debug.Print "X=" & Str(MyPoint.X) & " and " & "Y=" & Str(MyPoint.Y)
End Sub
Private Sub Command1_Click()
PrintCursorPos
End Sub
输出结果为(每次运行都可能得到不同的结果,这得由函数调用时鼠标指针在屏幕中所处的位置而决定)∶
X= 240 and Y= 151
程序中,GetCursorPos函数用来获取鼠标指针在屏幕上的位置。
以上例子中,你可以发现,以参数传递的MyPpint结构的内容在函数调用后发生了实质性变化。这是由于结构是按ByRef传递的原因。
一些API函数集
‘拾’ 关于MFC 和 C#
MFC 已经被微软淘汰了, 很早的windows 平台的编程API , 是微软为C++ 语言封装的windows API。由于C++ 编程过于复杂。后来被.net 平台的 winform 取代(微软的意思,但个人看来winform是鸡肋,运行速度和渲染图形的速度都太垃圾,使用传统的
GDI+ 渲染。商业上很少使用以至于后来微软推出了wpf)。 WPF 是windows 软件平台的一次重要变革 ,是基于DirectX引擎的,支持GPU硬件加速。不在使用传统GDI 渲染,所以可以制作2D/3D 动画。 概念版QQ就是使用wpf 作为展现层。内核使用C++ 编写。 所以 wpf是下一带窗体程序的大势所趋。 wpf 的开发方式 和android ,flex, 等开发方式一样都是 xml+代码。 学会了wpf 还可以编写 微软的银光和 window Phone 的展现。 他们都是一样的API ,只不过wpf 要比 银光和wp7 多一部分 。编写wpf 需要掌握.NET 主推的语言 C#