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.使用其他卡号将绘制错误的牌。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/347379.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

netbeans7.4_使用NetBeans 7.4 beta提示进行更好的基于JUnit的单元测试

netbeans7.4在上一篇文章中 ,我写了NetBeans 7.4 beta中提供的提示 ,这些提示提高了开发人员避免Java异常处理带来的讨厌的运行时问题的能力。 在本文中,我将探讨如何使用NetBeans 7.4 beta提供的另外两个提示使单元测试在执行单元测试期间更…

Java锤子剪刀布大家应该都会玩“锤子剪刀布”的游戏: 现给出两人的交锋记录,请统计双方的胜、平、负次数,并且给出双方分别出什么手势的胜算最大。

题目描述&#xff1a; 大家应该都会玩“锤子剪刀布”的游戏&#xff1a;现给出两人的交锋记录&#xff0c;请统计双方的胜、平、负次数&#xff0c;并且给出双方分别出什么手势的胜算最大。 输入描述: 输入第1行给出正整数N&#xff08;<105&#xff09;&#xff0c;即双方…

【MATLAB函数系列】fskmod函数参数及源代码详解

关注回复【fskmod】可看 在用matlab仿真生成fsk信号时&#xff0c;发现matlab库提供fskmod函数可以直接生成fsk信号&#xff0c;但生成的信号为复信号&#xff0c;于是查看其源码&#xff0c;结果对其原理看了好久都没明白&#xff0c;在网上查询资料也少得可怜&#xff0c;唯一…

Java数字黑洞给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到 一个新的数字。一直重复这样做,我们很快会停在有“数字

题目描述&#xff1a; 给定任一个各位数字不完全相同的4位正整数&#xff0c;如果我们先把4个数字按非递增排序&#xff0c;再按非递减排序&#xff0c;然后用第1个数字减第2个数字&#xff0c;将得到 一个新的数字。一直重复这样做&#xff0c;我们很快会停在有“数字黑洞”之…

Java Spring Security示例教程中的2种设置LDAP Active Directory身份验证的方法

LDAP身份验证是全球范围内最流行的企业应用程序身份验证机制之一&#xff0c;而Active Directory &#xff08;Microsoft针对Windows的LDAP实现&#xff09;是另一种广泛使用的LDAP服务器。 在许多项目中&#xff0c;我们需要通过登录屏幕中提供的凭据使用LDAP对活动目录进行身…

C语言文件读写操作之换行符处理

getc&#xff0c;fgetc&#xff1a; -1代表结束符&#xff0c;不但能接收键盘输入的内容&#xff0c;也能从文件中读取一个字符&#xff1b; getchar() 等价于 getc(stdin); putc,fputc: putchar© 等价于 putc(c,stdout); 文件操作 t模式 与 b模式&#xff1a; windo…

Java月饼月饼是中国人在中秋佳节时吃的一种传统食品,不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需 求量,请你计算可以获得的最大收益是多少。注意:销售时允许取出一

题目描述&#xff1a; 月饼是中国人在中秋佳节时吃的一种传统食品&#xff0c;不同地区有许多不同风味的月饼。现给定所有种类月饼的库存量、总售价、以及市场的最大需求量&#xff0c;请你计算可以获得的最大收益是多少。 注意&#xff1a;销售时允许取出一部分库存。样例给出…

【各种信噪比联系与区别详解】实信号、复信号Es、N0、符号信噪比EsN0、带内信噪比、比特信噪比EbN0、SNR的含义及关系详解

引言 关于EsN0、EbN0与SNR三者关系的描述,在MATLAB帮助文档中搜索词条“AWGN Channel”有比较详细的描述,但有些细节没有讲清楚。 简单翻译解释一下,就是 SNR表示每个采样点的信号噪声比。EbN0表示每个比特能量与噪声功率谱密度的比值。EsN0表示每个符号能量与噪声功率谱密…

非科班Java尝试全国高校计算机能力挑战赛第三届计挑赛

写在前面&#xff1a;①大佬勿在意&#xff0c;小打小闹&#xff01;②若不决参加与否&#xff0c;希望下文可以给你帮助&#xff08;仅限程序设计赛项&#xff09;。 文章目录一、个人真实情况二、比赛最细简介三、最全参赛准备四、比赛时候遇到不会做怎么办&#xff1f;一、个…

加密数据的检索_透明地持久保存并从数据库中检索加密的数据

加密数据的检索自从我在这里发表上一个帖子以来已经有两个多月了&#xff0c;但是今年六月和七月非常忙碌而密集。 首先&#xff0c; Confitura的组织&#xff08;欧洲最大的Java开发人员免费会议&#xff09;参加了我所有的免费晚会&#xff0c;然后在相当紧张的住院期间&…

微信小程序云开发日记类日记记录分享动态

微信公众号&#xff1a;创享日记&#xff08;微信号csds992022&#xff09; 发送关键词&#xff1a;日记类小程序 免费获取源码 1 概述 1.1 关于本手册 为了使您对研岸日记记录社交软件的使用有清晰详尽的了解&#xff0c;特此编写《用户手册》&#xff0c;为了保障您的利益&a…

使用Arquillian(远程)测试OpenLiberty

听到许多好评后&#xff0c;我想我会尝试一下Open Liberty 。 在这篇文章中&#xff0c;我将讨论以下内容&#xff1a; 开放自由的设置 设置JDBC连接 设置Arquillian 测试REST端点 安装开放自由 在撰写本文时&#xff0c;我正在使用Open Liberty 18.0.0.1&#xff0c;并且…

Windows编程初步(三)【说明:有敏感字眼已全删,不知道为啥还审核不通过】

第三节 设计输出及利用在线帮助 在Windows中&#xff0c;消息ON_PAINT是专门用来处理输出的。基本所有的输出代码应放在这里。 。其输出方式不再限于从上往下&#xff0c;而是全屏可控&#xff0c;因此每个输出都需要告知系统输出位置。典型的文字输出代码是TextOut函数。 将…

第十二届蓝桥杯省赛A组砝码称重Java解题思路及代码

【问题描述】 你有一架天平和 N个砝码&#xff0c;这N个砝码重量依次是W1, W2, …, Wn。 请你计算一共可以称出多少种不同的重量&#xff1f;注意砝码可以放在天平两边。 【输入格式】 输入的第一行包含一个整数N。 第二行包含N个整数: W1, W2, W3, … Wn。 【输出格式】 输出…

【定时同步系列1】定时同步之MARTIN OERDER算法原理与公式推导

关注公号【逆向通信猿】,口令:OM算法 信号模型 接收到的信号(PAM)或等效的低通信号(QAM,PSK)可以写为 r ( t ) = ∑ n = − ∞ ∞ a n g T (

408考研数据结构复习-时间复杂度与空间复杂度-附统考真题

文章目录一、时间复杂度二、空间复杂度三、相关题目一、时间复杂度 一个语句的频度是指该语句在算法中被重复执行的次数。算法中所有语句的频度之和记为T(n)&#xff0c;它是该算法问题规模n的函数&#xff0c;时间复杂度主要分析T(n)的数量级。算法中基本运算&#xff08;最深…

解调去载波后均衡信道与实际信道的关系

关注公号【逆向通信猿】更精彩!!! 通常,信号经过调制后发送,会经过信道作用,示意图可以表示为 其中 x ( t ) x(t) x(t)为基带信号, e

第十二届蓝桥杯省赛A组试题:左儿子右兄弟Java

【问题描述】 对于一棵多叉树&#xff0c;我们可以通过 “左孩子右兄弟” 表示法&#xff0c;将其转化成一棵二叉树。如果我们认为每个结点的子结点是无序的&#xff0c;那么得到的二叉树可能不唯一。换句话说&#xff0c;每个结点可以选任意子结点作为左孩子&#xff0c;并按任…

activiti脚本任务_Activiti中的高级脚本:自定义配置注入

activiti脚本任务脚本任务可能是Activiti代码库中“最古老的”类之一&#xff0c;但是我认为它仍然未被许多人使用。 &#xff08;感知到的&#xff09;缺点当然是性能&#xff08;解释还是编译&#xff09;&#xff0c;并且从IDE角度来看支持较少。 但是&#xff0c;好处&…

【锁相环系列3】QPSK+基带+Costas锁相环载波同步(重点环路滤波器参数设置和迭代核心代码详解)

引言 假设在QPSK信号解调中,完成匹配滤波、定时抽样后的星座如下所示 而画出基带信号部分点的星座图如下所示 由以上两幅图可以看出,基带信号中还存在微小的频偏,导致星座图旋转,而这种微小的频偏很难通过FFT估计出来,由此想到了用锁相环解决,锁相环锁定后的星座如下 …