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编程之使用外部动态链接库——纸牌相关推荐

  1. Windows 编程

    Delphi 利用Object Pascal 和可视控件库(VCL)对底层的Windows API 进行了完美的封装,所以很少需要使用基础Pascal 语言来建立Windows应用程序,也无需直接调用 ...

  2. windows编程常用系统API函数

    windows编程常用API的函数 1. API之网络函数 2. API之消息函数 3. API之文件处理函数 4. API之打印函数 5. API之文本和字体函数 6. API之菜单函数 7. AP ...

  3. Windows编程一日一练(1)

    首先,编程和旅游是我个人人生两大爱好,所以,每天空闲的时候我喜欢敲敲代码,或者看看别人写的程序,实在是很惬意.今天想看看window编程,争取坚持每日一练.        windows程序主要是由微 ...

  4. 跨进程的 键盘钩子_Delphi下深入Windows编程之钩子原理一

    我的理想是能够写出一个可以永不封号的游戏外G 嗯,所以需要学习Windows下编程,最近好不容易有一点点空余时间,抓紧时间读书[Delphi下深入Windows编程],人丑就该多读书 钩子原理 定义: ...

  5. Windows编程 从消息窗口到基本窗口 游戏循环窗口框架的简单实现

    版本:VS2015 语言:C++ 本来想昨天写个消息窗口的内容,讲一些好玩的东西,不过没有时间了,就放到一起了. 今天正好把书的第二章看完了,感觉良好,Windows的编程确实难度要高,一下子会有一大 ...

  6. MFC与Windows编程

    Windows编程基础 MFC:Microsoft Foundation Classes,它封装了WIN32/WIN64功能,在MFC应用程序中,可以使用一组标准类,它们把我们与Windows API ...

  7. 用C语言进行Windows编程入门

    用C语言进行Windows编程入门 本文对一般教程或网上有的(如C语言语法等基础)不深入介绍,对初学者易造成疑惑误解或难以找到的内容进行较详尽的介绍. 学习C语言很久了,一直面对控制台应用程序(Win ...

  8. 《实用VC编程之玩转控件》第1课:Windows编程简介

    本文转载自: VC驿站 https://www.cctry.com/thread-297374-1-1.html 0.开发环境: 操作系统:Microsoft Windows 7 Ultimate S ...

  9. Windows编程初步

    Windows编程初步 目前来说Windows已经家喻户晓,它的历史是Microsoft历史上最辉煌的一页.人们现在已经基本上使用Windows操作系统,因此在编程方面我们有必要从DOS环境编程向Wi ...

最新文章

  1. fun函数是什么php,c语言fun函数有什么例题?
  2. 支付宝服务商子商户_支付宝服务商新功能,无需商家花钱的消费券怎么参与
  3. CTF-练习平台-WEB之 签到题
  4. 卫星轨道推演计算相关知识点总结(含欧拉角、旋转矩阵、及各坐标系转化等)
  5. JS入门之Date对象
  6. 有限元笔记06-三维实体单元
  7. matlab里dcgain,制系统的时域分析
  8. 【计算机视觉】运动目标检测算法文献阅读笔记
  9. python的变量的命名规则以及定义
  10. python2 字符串函数_笔记六:python2字符串运算与函数
  11. 快速找出bug的几点建议
  12. Scala——函数式编程、面向对象
  13. IT大败局----第十章 企业公关的真谛
  14. java-net-php-python-jspm智守护学生健康管理系统软件设计与开发计算机毕业设计程序
  15. 如何安装正版的Xmanager
  16. 你们公司的产品[zhuan]
  17. 无人机开发系列 Ubuntu18.04安装 含虚拟机与双系统
  18. 送5本刚刚出版的《大数据时代生存法则》
  19. 淘宝客,根据淘宝Url,获取到商品的ID
  20. 新冠病毒的SEIR模型仿真---matlab

热门文章

  1. Java大新闻不断涌现:Java SE 6和OpenJDK
  2. 长大了Java! 提出Java桌面版
  3. python 分布式队列_〖Python〗-- Celery分布式任务队列
  4. HTML块级元素/块标签/块元素
  5. HH SaaS电商系统的销售订单毛利润设计
  6. c语言行列式源代码,新手作品:行列式计算C语言版
  7. python与sqlite3_sqlite3与python2.5,pysqlite和apsw有什么区别
  8. FFmpeg options
  9. 网络延长器分为哪几类?其应用领域有哪些?
  10. 光纤收发器的工作原理以及使用方法