分享
 
 
 

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

王朝vc·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

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

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

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

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

.model flat,stdcall

option casemap:none

.code

cdtInit proc p1:DWORD, p2:DWORD

cdtInit endp

cdtDraw proc p1:DWORD, p2:DWORD, p3:DWORD, p4:DWORD, p5:DWORD, p6:DWORD

cdtDraw endp

cdtDrawExt proc p1:DWORD, p2:DWORD, p3:DWORD, p4:DWORD, p5:DWORD, p6:DWORD, p7:DWORD, p8:DWORD

cdtDrawExt endp

cdtAnimate proc p1:DWORD, p2:DWORD, p3:DWORD, p4:DWORD, p5:DWORD

cdtAnimate endp

cdtTerm proc

cdtTerm endp

end

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

cdtInit proc lpdwCardWidth:DWORD, lpdwCardHeight:DWORD

lpdwCardWidth 返回扑克的宽度

lpdwCardHeight 返回扑克的高度

cdtDraw proc hDC:DWORD, dwX:DWORD, dwY:DWORD, cd:DWORD, md:DWORD, rgbBkgnd:DWORD

cdtDrawExt proc hDC:DWORD, dwX:DWORD, dwY:DWORD, dwdx:DWORD, dwdy:DWORD, cd:DWORD, md:DWORD, rgbBkgnd:DWORD

hDC 设备句柄

dwX 左上角的位置的横坐标

dwY 左上角的位置的纵坐标

cd 指出绘制哪一张扑克,或哪一个背景,具体对应的序号可以参考例子代码中的 Cards.inc 文件

md 绘制方式,有以下几种

mdFace EQU 0 ;绘制各种花色扑克

mdBackground EQU 1 ;绘制各种背景

mdHilite EQU 2 ;反色绘制各种花色扑克,不支持反色背景

mdGhost EQU 3 ;绘制网格图

mdRemove EQU 4 ;采用背景颜色绘制一个扑克大小的矩形

mdInvisibleGhost EQU 5 ;绘制网格图

mdDeckX EQU 6 ;绘制 X 图

mdDeckO EQU 7 ;绘制 O 图

rgbBk 绘制背景时的背景颜色

dwdx 绘制放大的或缩小的扑克时的宽度

dwdy 绘制放大的或缩小的扑克时的高度

cdtTerm 没有参数

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

WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM

local hDC:HDC

local ps:PAINTSTRUCT

.IF uMsg==WM_DESTROY

invoke cdtTerm

invoke PostQuitMessage, NULL

.ELSEIF uMsg==WM_CREATE

invoke cdtInit, addr nCardWidth, addr nCardHeight

invoke ShowWindow, hWnd, SW_MAXIMIZE

.ELSEIF uMsg==WM_PAINT

invoke BeginPaint, hWnd, addr ps

mov hDC, eax

;===========================\ 按每种花色的顺序绘制 4 列扑克

xor ecx, ecx

xor ebx, ebx

mov esi, 10

@1:

mov edi, 12h

mov ebx, ecx

@2:

push ecx

invoke cdtDraw, hDC, esi, edi, ebx, mdFace, rgbBground

pop ecx

add edi, 12h

add ebx, 4

cmp ebx, 52

jb @2

add esi, nCardWidth

add esi, 10

inc ecx

cmp ecx, 4

jz @3

jmp @1

@3:

;===========================/

;===========================\ 绘制所有的可用背景

mov ebx, 54

mov esi, 10

mov edi, 400

@@:

invoke cdtDraw, hDC, esi, edi, ebx, mdBackground, rgbBground

inc ebx

add esi, nCardWidth

add esi, 10

cmp ebx, 66

jnz @B

;===========================/

;===========================\ 反色绘制各种花色的扑克

mov ebx, 0

mov esi, 10

mov edi, 500

@@:

invoke cdtDraw, hDC, esi, edi, ebx, mdHilite, rgbBground

add ebx, 5

add esi, nCardWidth

add esi, 10

cmp ebx, 55

jnz @B

;===========================/

;===========================\ 其它几种绘制方式

mov ebx, 6

mov esi, 10

mov edi, 600

invoke cdtDraw, hDC, esi, edi, ebx, mdGhost, rgbBground

add ebx, 5

add esi, nCardWidth

add esi, 10

RGB 255, 0, 0

invoke cdtDraw, hDC, esi, edi, ebx, mdRemove, eax

add ebx, 5

add esi, nCardWidth

add esi, 10

invoke cdtDraw, hDC, esi, edi, ebx, mdInvisibleGhost, rgbBground

add esi, nCardWidth

add esi, 10

invoke cdtDraw, hDC, esi, edi, ebx, mdDeckX, rgbBground

add esi, nCardWidth

add esi, 10

invoke cdtDraw, hDC, esi, edi, ebx, mdDeckO, rgbBground

;===========================/

invoke EndPaint, hWnd, addr ps

.ELSE

invoke DefWindowProc, hWnd, uMsg, wParam, lParam

ret

.ENDIF

xor eax,eax

ret

WndProc endp

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

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有