Windows编程之使用外部动态链接库——纸牌
C语言功能强大的一个重要原因是因为具有丰富的库函数,例如字符串处理有string库,数学处理有math库。微软公司对程序库的支持又更进一步,提供了丰富的动态链接库。下面以微软操作系统内嵌的纸牌链接库为例写一个简单的小程序。
由于我们已经较为理解Windows应用程序的框架了,因此这次拓展练习将所有的代码由手工完成一个最简洁的框架。
在WinLearn中创建新的Win32 Application,项目名叫做WinStep6。在选项中注意选择简单的应用程序。
图1 创建简单应用程序
初始的代码应该是这样的:
我们首先在WinMain中注册一个窗口类。窗口类的代码可以从早期的WinStep1中的MyRegistClass函数中复制过来:
注意其中删除了和资源相关的代码。
然后通过刚注册的WinStep6窗口类,生成纸牌的主窗口。相应的代码可以从WinStep1中的InitInstance函数中复制过来。
向主函数中增加主循环代码。主循环代码可以从WinStep1中的WinMain复制过来。
向程序中添加消息处理函数MainProc。消息处理函数可以由WinStep1中的MainWndProc复制并改编而来。因为我们不用处理菜单和快捷键,因此将相关的代码删除了。剩下的框架如下:
将一些变量的声明,函数的声明补充完整,这个最简单的框架就可以运行了。
我们自定义的框架程序运行结果:
在这个最简框架基础上,我们来做一个简单的纸牌显示和操作的演示。
微软提供的纸盘链接库叫做cards.dll,通常在Windows\System32目录下。若是找不到该链接库,可以从网络或者网络课堂下载。
动态链接库(.dll)和常见的静态链接库(.lib,例如math.lib)类似,都存放了函数的二进制代码。但是动态链接库要多一些步骤。首先是程序执行时根据需要加载动态链接库,和程序不再需要库函数时从内存中卸载动态链接库以节约内存开销。这两个函数分别是LoadLibrary和FreeLibrary。在刚才的最简框架基础上添加对cards的打开和关闭:
程序片段34 动态链接库的加载
程序片段35 动态链接库的释放
然后需要从动态链接库中获得函数的入口。
微软的cards.dll提供了5个函数来绘制纸牌,和大多数静态链接库不同,微软的cards.dll没有提供头文件,因此需要我们手工建立这5个函数的声明。一般而言,我们应该为cards.dll的函数专门建立一个cards.h头文件,但是为了简洁起见,在WinStep6中,仅仅将这几个头文件放置在WinStep6.cpp开头的位置。
并且在函数声明后面立即为这5个函数建立全局函数指针备用:
注意这5个typedef定义了一种函数指针类型,举例而言,第一行的函数定义如下:
这行定义了一个接受两个整型指针作为形参并且返回BOOL类型(其实BOOL就是int类型)的函数指针,凡是这样的函数指针都可以叫做pfcdtInit类型。
因此下面的全局变量定义中,使用pfcdtInit定义了一个函数指针:
在应用程序设计中,这样的书写方式很常见,希望同学们能够模仿并书写自己的函数指针定义。
在主函数中,等动态链接库加载成功后,便可以从动态链接库中获得这5个函数的入口地址(即给前述5个指针变量赋值)
在正式绘图前,需要知道所绘制的一张完整的纸牌的大小(所占用的像素)。这使用cdtInit函数可以获得。
因为在绘图中会反复用到纸牌的大小,因此将这大小数据以全局变量形式存放:
并且在主函数中获得牌的大小:
下面在WM_PAINT中绘制我们的第一张牌:红桃K。注意为了后面的绘图,下面的代码中增加了一个矩形结构体RECT,并且在绘图代码WM_PAINT中增加了获得窗口位置大小的信息的代码。
现在程序可以运行并且绘制一张图片了。
绘图函数cdtDraw的参数很直接:hdc表示在哪个窗口绘图,20,20表示左上角20,20坐标位置;50表示第50号牌。cards每张牌均有一个牌号,若定义花色为suit(03),点数为face(012),则有公式card = suit + face * 4例如红桃K的卡号为2+12×4=50。卡号53~68为各种牌的背面。type为显示类型,type=0时表示显示正面,这时候卡号card只能是0~51,当type=1时表示显示牌背面,这时候卡号card只能是53~68.使用其他卡号将绘制错误的牌。
Windows编程之使用外部动态链接库——纸牌相关推荐
- Windows 编程
Delphi 利用Object Pascal 和可视控件库(VCL)对底层的Windows API 进行了完美的封装,所以很少需要使用基础Pascal 语言来建立Windows应用程序,也无需直接调用 ...
- windows编程常用系统API函数
windows编程常用API的函数 1. API之网络函数 2. API之消息函数 3. API之文件处理函数 4. API之打印函数 5. API之文本和字体函数 6. API之菜单函数 7. AP ...
- Windows编程一日一练(1)
首先,编程和旅游是我个人人生两大爱好,所以,每天空闲的时候我喜欢敲敲代码,或者看看别人写的程序,实在是很惬意.今天想看看window编程,争取坚持每日一练. windows程序主要是由微 ...
- 跨进程的 键盘钩子_Delphi下深入Windows编程之钩子原理一
我的理想是能够写出一个可以永不封号的游戏外G 嗯,所以需要学习Windows下编程,最近好不容易有一点点空余时间,抓紧时间读书[Delphi下深入Windows编程],人丑就该多读书 钩子原理 定义: ...
- Windows编程 从消息窗口到基本窗口 游戏循环窗口框架的简单实现
版本:VS2015 语言:C++ 本来想昨天写个消息窗口的内容,讲一些好玩的东西,不过没有时间了,就放到一起了. 今天正好把书的第二章看完了,感觉良好,Windows的编程确实难度要高,一下子会有一大 ...
- MFC与Windows编程
Windows编程基础 MFC:Microsoft Foundation Classes,它封装了WIN32/WIN64功能,在MFC应用程序中,可以使用一组标准类,它们把我们与Windows API ...
- 用C语言进行Windows编程入门
用C语言进行Windows编程入门 本文对一般教程或网上有的(如C语言语法等基础)不深入介绍,对初学者易造成疑惑误解或难以找到的内容进行较详尽的介绍. 学习C语言很久了,一直面对控制台应用程序(Win ...
- 《实用VC编程之玩转控件》第1课:Windows编程简介
本文转载自: VC驿站 https://www.cctry.com/thread-297374-1-1.html 0.开发环境: 操作系统:Microsoft Windows 7 Ultimate S ...
- Windows编程初步
Windows编程初步 目前来说Windows已经家喻户晓,它的历史是Microsoft历史上最辉煌的一页.人们现在已经基本上使用Windows操作系统,因此在编程方面我们有必要从DOS环境编程向Wi ...
最新文章
- fun函数是什么php,c语言fun函数有什么例题?
- 支付宝服务商子商户_支付宝服务商新功能,无需商家花钱的消费券怎么参与
- CTF-练习平台-WEB之 签到题
- 卫星轨道推演计算相关知识点总结(含欧拉角、旋转矩阵、及各坐标系转化等)
- JS入门之Date对象
- 有限元笔记06-三维实体单元
- matlab里dcgain,制系统的时域分析
- 【计算机视觉】运动目标检测算法文献阅读笔记
- python的变量的命名规则以及定义
- python2 字符串函数_笔记六:python2字符串运算与函数
- 快速找出bug的几点建议
- Scala——函数式编程、面向对象
- IT大败局----第十章 企业公关的真谛
- java-net-php-python-jspm智守护学生健康管理系统软件设计与开发计算机毕业设计程序
- 如何安装正版的Xmanager
- 你们公司的产品[zhuan]
- 无人机开发系列 Ubuntu18.04安装 含虚拟机与双系统
- 送5本刚刚出版的《大数据时代生存法则》
- 淘宝客,根据淘宝Url,获取到商品的ID
- 新冠病毒的SEIR模型仿真---matlab