回 帖 发 新 帖 刷新版面

主题:如何从WINDOWS的DLL中取出扑克牌图形

愚人编了几个扑克牌游戏,但苦于无从获取扑克牌图形文件,只好拿了扑克逐张扫描,实在愚蠢之极,费时费力,效果又差。我想WINDOWS本身带的扑克牌游戏中的扑克牌图形如此精美,不知它的DLL文件是哪一个?如何可以从中读取图形?特此请教!

回复列表 (共7个回复)

沙发

Windows 自带的纸牌、空当接龙等扑克游戏都利用到了 cards.dll 这个动态链接库,从中引入了 cdtInit 和 cdtDrawExt 等函数来实现扑克的绘制等工作。其实我们也可以利用 cards.dll 来写一个我们自己的扑克游戏。

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      指出绘制哪一张扑克,或哪一个背景

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 没有参数

板凳

楼上的是高人,可否将你的QQ号给我!向你学习。

3 楼

[em4]谢谢IASM仁兄,我试成了你介绍的方法,多谢指点,以后不懂的一定会多向您请教!

4 楼

楼上两位兄弟错爱了,我只是碰巧知道这一点罢了。:)

5 楼

好,不错,正是我要的,哈哈,谢了

6 楼

愚人又有问题了:在BCB中如何实现扑克牌在窗体中的拖动,在拖动过程中如何防止图片的闪烁?

7 楼

利用内存DC,进行绘图,从而消除闪烁,方法原理为:
    涉及到两个DC,屏幕DC和内存DC。把所要绘制的一切现在内存DC中进行绘制,之后全部搬到屏幕DC中,从而把所有烦琐的绘制过程都在内存DC中完成了,用户在屏幕上看到的是一幅完整的图画,所以不可能出现闪烁情况。期间,关键是这幅图画。这幅图画是从屏幕DC中创建出来的,只不过画面的尺寸就是客户区域的大小,之后把这幅画选入内存DC中,之后在内存DC中绘制的动作都在这幅画中,最后把内存DC中的这幅已经绘制好的画在选入到屏幕DC中,达到最终目的。(这就是游戏制作中常用的双缓冲技术)

我来回复

您尚未登录,请登录后再回复。点此登录或注册