设为首页  
联系我们  
加入收藏  
网页制作 冲浪宝典 图形图像 操作系统 软件教学 编程开发 认证考试 安全技术 站长专区 文学驿站 娱乐天地 游戏天地 办公软件
文章搜索
您的位置: 首页 >> 文章首页 >> 编程开发 >> Visual C++ >> 利用 cards.dll 写自己的扑克程序
精品推荐
Visual C++点击TOP10
·用WINSOCK实现聊天室的VC++程序设计
·利用mfc编写activex控件
·用vc实现生产者消费者问题
·DirectX8.0
·C/C++ 大量经典编程书籍下载
·VC快捷键大全
·CreateFileMapping的MSDN翻译和使用心得
·Windows环境下的麦克风录音系统
·挂钩Windows API
·如何开发OPC Server
编程开发点击TOP10
·数字小键盘指法练习
·用C语言编通讯录程序(初学者级别的)
·ASP.NET 程序中常用的三十三种代码
·我写的Java学生成绩管理系统源代码
·CHK文件恢复工具
·java笔试题
·Modem 常用AT指令集
·异常java.sql.SQLException: Io exception:The Network Adapter could not establish connection
·单片机模拟I2C总线及24C02(I2C EEPROM)读写实例(源代码)
·C++经典电子书下载
精选专题

利用 cards.dll 写自己的扑克程序

作者: 来源:网络文章 时间:2005-12-13 17:18:32

利用 cards.dll 写自己的扑克程序


观察 Windows 自带的纸牌、空当接龙等扑克游戏会发现他们都利用到了 cards.dll 这个动态链接库,从中引入了 cdtInit 和 cdtDrawExt 等函数来实现扑克的绘制等工作。其实我们也可以利用 cards.dll 来写一个我们自己的扑克游戏。下面的示意图就是一个小的测试程序,用到了 cdtDrawExt 等函数绘制了所有扑克,扑克背面的图案,反色绘制扑克等等。这里是VBin.51.net/ztsprogram/doc/cardtest.zip">例子代码,这里是引入 cards.dll 所需要的 cards.lib

例子代码的示意图,点击查看大图CSDN_Dev_Image_2004-4-41314411.jpg" width=500>

为了在程序中调用 cards.dll,我们首先要搞清楚的就是 cards.dll 导出的每一个函数的用法,包括参数、返回值等等。关于这一点你可以自己反汇编纸牌游戏和 cards.dll 来分析反汇编后的代码从而得出每一个函数的用法,也可以参考 MSJ Spring 1996 中的文章 Fun and Games。当然,我在后面也会介绍每一个函数的用法。

知道了函数的用法后,我们考虑要在程序中用 invoke 的方法来调用函数,就需要构建一个引入库 cards.lib。由于引入库中不需要包含具体的代码,所以我们自己写一个动态库,导出和 cards.dll 一样的导出函数,那么编译连接动态库时生成的引入库就可以拿来使用。

.386.model flat,stdcalloption casemap:none.codecdtInit proc p1:DWord, p2:DWORDcdtInit endpcdtDraw proc p1:DWORD, p2:DWORD, p3:DWORD, p4:DWORD, p5:DWORD, p6:DWORDcdtDraw endpcdtDrawExt proc p1:DWORD, p2:DWORD, p3:DWORD, p4:DWORD, p5:DWORD, p6:DWORD, p7:DWORD, p8:DWORDcdtDrawExt endpcdtAnimate proc p1:DWORD, p2:DWORD, p3:DWORD, p4:DWORD, p5:DWORDcdtAnimate endpcdtTerm proccdtTerm endpend

好,有了引入库后我们就可以很方便的利用 invoke 来调用函数啦。下面介绍几个主要函数的用法:

cdtInit proc lpdwCardWidth:DWORD, lpdwCardHeight:DWORDlpdwCardWidth返回扑克的宽度lpdwCardHeight返回扑克的高度
cdtDraw proc hDC:DWORD, dwX:DWORD, dwY:DWORD, cd:DWORD, md:DWORD, rgbBkgnd:DWORDcdtDrawExt proc hDC:DWORD, dwX:DWORD, dwY:DWORD, dwdx:DWORD, dwdy:DWORD, cd:DWORD, md:DWORD, rgbBkgnd:DWORDhDC设备句柄dwX左上角的位置的横坐标dwY左上角的位置的纵坐标cd指出绘制哪一张扑克,或哪一个背景,具体对应的序号可以参考例子代码中的 Cards.inc 文件md绘制方式,有以下几种mdFace EQU0;绘制各种花色扑克mdBackground EQU1;绘制各种背景mdHiliteEQU2;反色绘制各种花色扑克,不支持反色背景mdGhostEQU3;绘制网格图mdRemoveEQU4;采用背景颜色绘制一个扑克大小的矩形mdInvisibleGhostEQU5;绘制网格图mdDeckXEQU6;绘制 X 图mdDeckOEQU7;绘制 O 图rgbBk绘制背景时的背景颜色dwdx 绘制放大的或缩小的扑克时的宽度dwdy 绘制放大的或缩小的扑克时的高度

cdtTerm 没有参数

有关上面几个函数的具体用法我们来看看例子代码:

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAMlocalhDC:HDClocalps:PAINTSTRUCT.IF uMsg==WM_DESTROY invokecdtTerm invokePostQuitMessage, NULL.ELSEIF uMsg==WM_CREATE invokecdtInit, addr nCardWidth, addr nCardHeight invokeShowWindow, hWnd, SW_MAXIMIZE.ELSEIF uMsg==WM_PAINT invokeBeginPaint, hWnd, addr ps movhDC, eax;===========================\按每种花色的顺序绘制 4 列扑克 xorecx, ecx xorebx, ebx movesi, 10@1: movedi, 12h movebx, ecx@2: push ecx invokecdtDraw, hDC, esi, edi, ebx, mdFace, rgbBground popecx addedi, 12h addebx, 4 cmpebx, 52 jb@2 addesi, nCardWidth addesi, 10 incecx cmpecx, 4 jz@3 jmp@1@3:;===========================/;===========================\绘制所有的可用背景 movebx, 54 movesi, 10 movedi, 400@@: invokecdtDraw, hDC, esi, edi, ebx, mdBackground, rgbBground incebx addesi, nCardWidth addesi, 10 cmpebx, 66 jnz@B;===========================/;===========================\反色绘制各种花色的扑克 movebx, 0 movesi, 10 movedi, 500@@: invokecdtDraw, hDC, esi, edi, ebx, mdHilite, rgbBground addebx, 5 addesi, nCardWidth addesi, 10 cmpebx, 55 jnz@B;===========================/;===========================\其它几种绘制方式 movebx, 6 movesi, 10 movedi, 600 invokecdtDraw, hDC, esi, edi, ebx, mdGhost, rgbBground addebx, 5 addesi, nCardWidth addesi, 10 RGB255, 0, 0 invokecdtDraw, hDC, esi, edi, ebx, mdRemove, eax addebx, 5 addesi, nCardWidth addesi, 10 invokecdtDraw, hDC, esi, edi, ebx, mdInvisibleGhost, rgbBground addesi, nCardWidth addesi, 10 invokecdtDraw, hDC, esi, edi, ebx, mdDeckX, rgbBground addesi, nCardWidth addesi, 10 invokecdtDraw, hDC, esi, edi, ebx, mdDeckO, rgbBground;===========================/ invokeEndPaint, hWnd, addr ps.ELSE invokeDefWindowProc, hWnd, uMsg, wParam, lParam ret.ENDIFxor eax,eaxretWndProc endp

怎么样,再看看前面的示意图,3.5KB 就有这样的效果,是不是很酷!在代码区还有一个用 C+SDK 方式编写的空当接龙源代码,大家如果有兴趣可以看看。


CopyRight (C) 2001-2004 一块三毛钱


利用 cards.dll 写自己的扑克程序 相关文章:
利用 cards.dll 写自己的扑克程序 相关软件:
特别声明:本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。
转载请注明来源:http://www.xgdown.com