Delphi 组件编写--扑克牌组件
2004-12-08 16:36
351 查看
Delphi 组件编写--扑克牌组件
Hunter
在网上看了不少关于扑克牌组件的编写,大多是调用Windows/system32下的cards.dll其实我们如果不调用这些函数也是可以作一个很好扑克牌组件。具体步骤如下:
1、首先做一个位图文件,符合如下格式,所有的扑克牌均为同样大小,每种花色排一行,从A到K排列,花色按黑桃、红桃、方块、梅花排列。如果不想做可以从QQ game 下的CardRes.dll中导出,本组件就用的就是QQ Game的位图。然后建立一个文本文件名为card.rc,内容为 card Bitmap “card.bmp“,然后用brcc32.exe编译成 card.res。
2、该扑克牌组件自TGraphicControl继承。可以做为一个单个扑克牌使用。其主要的属性有CardId,是其牌的编号,FaceUp是扑克牌正面朝上还是朝下的属性。Left,Top,Width,Height,Visual等属性均是继承于TGraphicControl,只需要说明一下即可。其源代码如下:
Hunter
在网上看了不少关于扑克牌组件的编写,大多是调用Windows/system32下的cards.dll其实我们如果不调用这些函数也是可以作一个很好扑克牌组件。具体步骤如下:
1、首先做一个位图文件,符合如下格式,所有的扑克牌均为同样大小,每种花色排一行,从A到K排列,花色按黑桃、红桃、方块、梅花排列。如果不想做可以从QQ game 下的CardRes.dll中导出,本组件就用的就是QQ Game的位图。然后建立一个文本文件名为card.rc,内容为 card Bitmap “card.bmp“,然后用brcc32.exe编译成 card.res。
2、该扑克牌组件自TGraphicControl继承。可以做为一个单个扑克牌使用。其主要的属性有CardId,是其牌的编号,FaceUp是扑克牌正面朝上还是朝下的属性。Left,Top,Width,Height,Visual等属性均是继承于TGraphicControl,只需要说明一下即可。其源代码如下:
unit uCard; // 单元: 可视化组件 ——扑克牌组件 // 作者: 黄涛 // E_Mail: hunto@163.com // 日期: 2004.12.7 // 修改日期: 2004.12.8 interface uses windows,Messages,classes,Graphics,controls,dialogs; type //朴克的花色定义,分别是黑桃、红心、方块、梅花 TCardSuit=( csSpade,csHeart,csClub,csDiamond); TCard =class(TGraphicControl) //扑克的组件 private FCardId:Cardinal ; //扑克的编号,0-51为各花色的1-K,52为大王,53小王 FFaceUp:bool; //是否正面朝上 procedure SetCardId(id:Cardinal);//设置扑克牌的编号 procedure SetFaceUp(Flag:Bool); //设置是否正面朝上 function GetValue:integer; //得到扑克牌的点数 function GetSuit:TCardSuit; //得到扑克牌的花色 protected procedure Paint; override; //画扑克牌的程序 public constructor Create(AOwner:TComponent);overload;override; //构造函数 constructor Create(AOwner:TComponent;Id:Cardinal);overload; procedure SetCard(Suit:TCardSuit;Value:Cardinal); //设置扑克牌的编号 published property CardId:Cardinal read FCardId write SetCardId; //扑克牌编号 property FaceUp:bool read FFaceUp write SetFaceUp default False; //正面朝上 property Value:integer read GetValue; //扑克的点数,只读 property Suit:TCardSuit read GetSuit; //扑克的花色,只读 property OnClick; //单击 property OnDblClick; //双击 end; implementation {$R Card.res} { TCard } var CardMap:TBitmap; //扑克牌的图形,从Card.res中获取 constructor TCard.Create(AOwner: TComponent); begin inherited; //如果父控件是WINDOWCONTROL的话,设置其Parent属性 if Aowner is TWinControl then self.Parent := TWinControl(Aowner); Width:=CardMap.Width div 14; //得到扑克牌的宽度 Height:=CardMap.Height div 4; //得到扑克牌的高度 FaceUp:=False; //默认扑克牌朝下 end; constructor TCard.Create(AOwner: TComponent;Id: Cardinal); begin Create(AOwner); CardId:=Id; //设置扑克牌的编号 end; procedure TCard.SetCardId(id:Cardinal); begin if id<54 then FCardId:=id; //设置扑克牌的编号 Paint; //重新画扑克牌 end; procedure TCard.SetCard(Suit:TCardSuit; Value: Cardinal); begin dec(Value); CardId:=Value shl 2 + Cardinal(Suit) and 3;//设置扑克牌的编号并重画 end; procedure TCard.Paint; //画扑克牌 var x,y,tmp:integer; begin if not assigned(Parent) then exit;//如果没有定义父控件,直接退出,以免报错 inherited; if FaceUp then tmp:=CardId //如果面朝上,则画正面 else tmp:=54; //反之画背面 x:=(tmp shr 2)*Width; //该扑克牌在位图中横坐标的位置 y:=(tmp and 3)*Height; //该扑克牌在位图中纵坐标的位置 bitblt(Canvas.Handle,0,0,Width,Height, //画图 CardMap.Canvas.Handle ,x,y,SRCCOPY); end; procedure TCard.SetFaceUp(Flag: Bool);//设置牌面朝上还是朝下 begin FFaceUp:=Flag; Paint; //重画 end; function TCard.GetValue: integer; begin Result:=CardId shr 2; //得到该牌的值 inc(Result); end; function TCard.GetSuit:TCardSuit; begin Result:=TCardSuit(CardId and 3); //得到该牌的花色 end; initialization //单元初始化 CardMap:=TBitmap.create ; //创建位图 CardMap.LoadFromResourceName(HINSTANCE,'card');//从资源中导入 finalization CardMap.Free ;//清除位图 end.
相关文章推荐
- Borland Delphi 2005 发布会
- Delphi 6重温
- delphi2005 启动加快
- Delphi2005的使用感受
- Delphi编写soap服务器与客户端程序
- 利用Delphi和金山词霸制作批量单词翻译
- Delphi2005学习笔记4——再谈NameSpace和Dll以及Package
- 用Delphi制作DLL的方法(转)
- DELPHI常用函数集及简要范例 (转)
- Delphi帮助里的虚拟键值表
- 第十八期:CSDN论坛秀-Delphi版-本期作秀:CDSoftwareWj(95927)---[夫妻秀]
- DELPHI高精度计时方法
- 用Delphi编制可自动升级程序
- delphi的属性property和消息处理特点事件属性。
- Delphi中常见的文件格式
- 一步一步跟我学Delphi制作多文档编辑器
- Delphi程序设计综合训练任务书
- Delphi 对treeview的操作(转,收藏)
- Delphi2005学习笔记3——数组参数的研究
- delphi 缓冲画图(内存画图)解决画图闪烁问题