主题:如何从WINDOWS的DLL中取出扑克牌图形
puma1972
[专家分:0] 发布于 2005-03-10 21:11:00
愚人编了几个扑克牌游戏,但苦于无从获取扑克牌图形文件,只好拿了扑克逐张扫描,实在愚蠢之极,费时费力,效果又差。我想WINDOWS本身带的扑克牌游戏中的扑克牌图形如此精美,不知它的DLL文件是哪一个?如何可以从中读取图形?特此请教!
回复列表 (共7个回复)
沙发
IASM [专家分:260] 发布于 2005-03-11 10:11:00
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 没有参数
板凳
qiji [专家分:0] 发布于 2005-03-17 10:14:00
楼上的是高人,可否将你的QQ号给我!向你学习。
3 楼
puma1972 [专家分:0] 发布于 2005-03-19 09:51:00
[em4]谢谢IASM仁兄,我试成了你介绍的方法,多谢指点,以后不懂的一定会多向您请教!
4 楼
IASM [专家分:260] 发布于 2005-03-21 08:23:00
楼上两位兄弟错爱了,我只是碰巧知道这一点罢了。:)
5 楼
qiujiafu [专家分:0] 发布于 2005-03-21 20:18:00
好,不错,正是我要的,哈哈,谢了
6 楼
puma1972 [专家分:0] 发布于 2005-03-22 19:47:00
愚人又有问题了:在BCB中如何实现扑克牌在窗体中的拖动,在拖动过程中如何防止图片的闪烁?
7 楼
IASM [专家分:260] 发布于 2005-03-24 08:44:00
利用内存DC,进行绘图,从而消除闪烁,方法原理为:
涉及到两个DC,屏幕DC和内存DC。把所要绘制的一切现在内存DC中进行绘制,之后全部搬到屏幕DC中,从而把所有烦琐的绘制过程都在内存DC中完成了,用户在屏幕上看到的是一幅完整的图画,所以不可能出现闪烁情况。期间,关键是这幅图画。这幅图画是从屏幕DC中创建出来的,只不过画面的尺寸就是客户区域的大小,之后把这幅画选入内存DC中,之后在内存DC中绘制的动作都在这幅画中,最后把内存DC中的这幅已经绘制好的画在选入到屏幕DC中,达到最终目的。(这就是游戏制作中常用的双缓冲技术)
我来回复