用户名: 密码: 验证码:           网站地图  高级搜索  RSS订阅  收藏本站
您的位置:主页 > 程序编程 > VC >

扑克控件制作实例

[ 来源:   | 作者:龙浩天 | 更新日期:2008-4-5 13:08:05 | 人气: | 评论 0 条 ]

前言

  本文以扑克控件的制作过程为实例,介绍了MFC ActiveX控件的具体制作过程,希望对学习控件编写的朋友有所帮助。

下载扑克控件源代码 大小:92K



一、扑克控件的制作

1、新建一个“MFC ActiveX ControlWizard”工程。为工程名起名为Cards,然后用向导的默认值一路OK生成工程。

2、为工程中添加五十四张扑克牌位图以及扑克背景位图资源。注重位图中有一张IDB_CARDS位图为控件显示时的图标,可以自行修改成自己喜欢的图样。

3、为控件填加属性值,打开View—>ClassWizard。点击Automation标签。从类名下拉框中选择CCardsCtrl,点击“Add Property”按钮弹出属性添加对话框。在External name中输入value,Type选择为short类型。同时在Implementation一项中选择Get/Set methods,还有两项不管它,就用它自己设置的函数就行了。现在我们已经为控件添加好了一个属性,它是用来处理扑克牌的点数的。

4、按照第三步的方法,我们再依次设置几个属性,分别是backbmp,类型为short,用来处理背景图案是什么;background,类型为BOOL,用来处理显示牌正面还是反面。

复制于hot007.com



5、属性添加好了,下面为这些属性设置初始值:打开CardsCtl.cpp文件,在构造函数CCardsCtrl::CCardsCtrl()中加入代码:value=1;backbmp=1;

6、为了使控件能够在程序中正常显示出来,我们还需要对CCardsCtrl::OnDraw进行修改。修改后的内容如下:
void CCardsCtrl::OnDraw(CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid)
{
CBitmap *pOldBitmap;
CBitmap bitmap;
CRect rect; GetClientRect(rect);
CDC ppdc;
CClientDC dc(this);
ppdc.CreateCompatibleDC(&dc);
if(background)//背景图案

{ if(backbmp==1)bitmap.LoadBitmap(255);
if(backbmp==2)bitmap.LoadBitmap(256);

} else//前景图案
bitmap.LoadBitmap(IDB_BITMAP1 value-1);
pOldBitmap=ppdc.SelectObject(&bitmap);
dc.BitBlt(0,0,rect.Width(),rect.Height(),&ppdc,0,0,SRCCOPY);
ppdc.SelectObject(pOldBitmap);
}


  在上面的代码中,要注重的是bitmap.LoadBitmap(IDB_BITMAP1 value-1);语句,一定要保证你在资源中插入的位图资源连续。可以打开Resource.h文件看一看,你的位图资源是否是连续的。 文章来源于www.hot007.com

7、接下来要修改属性函数了。修改前在CardsCtl.h中加入成员变量(有些在后面能够用得上):
protected:
short value,backbmp;
BOOL background;
BOOL IsMove,m_IsMove;
BOOL IsGoHome;
CPoint OldPoint;
CRect rect;
long xx,yy;
修改后的函数如下: short CCardsCtrl::GetValue()
{
return value;
}
void CCardsCtrl::SetValue(short nNewValue)
{
value=nNewValue;
SetModifiedFlag();
InvalidateControl();//立即刷新
}
BOOL CCardsCtrl::GetBackground()
{
return background;
}
void CCardsCtrl::SetBackground(BOOL bNewValue)
{
background=bNewValue;
SetModifiedFlag();
InvalidateControl();
}
short CCardsCtrl::GetBackbmp()
{
return backbmp;
}
void CCardsCtrl::SetBackbmp(short nNewValue)
{
backbmp=nNewValue; SetModifiedFlag(); InvalidateControl();
}
www.hot007.com


  可以看出,这些函数的修改都是大同小异,GetXXXXX()是用来得到属性值,SetXXXXX()用来设置属性值。

  InvalidateControl()函数用来刷新控件,使修改属性后的控件能马上反映在屏幕上。
8、为了能使控件能够被随意拖动,我们还需要做下面的预备工作,首先按照第三步的方法添加两个属性:IsMove,类型为BOOL,用来处理控件是否能被拖动;IsGoHome,类型为BOOL,用来处理控件拖动后是否回到原位置。之后为这两个属性设置初始值,也是在构造函数CCardsCtrl::CCardsCtrl()中增加代码
IsMove=false;
m_IsMove=false;
IsGoHome=true;


9、使控件能被拖动,需要处理鼠标左键按下、鼠标拖动以及鼠标左键抬起三个消息。在ClassWizard的“Message Maps”标签中,为WM_LBUTTONDOWN、WM_MOUSEMOVE、WM_LBUTTONUP增加消息处理函数,然后修改这三个函数如下:
void CCardsCtrl::OnLButtonDown(UINT nFlags, CPoint point) www.jc567.cn
{
if(IsMove)//是否是答应拖动鼠标 {
m_IsMove=true;
SetCapture();//捕捉鼠标
xx=point.x;//得到鼠标(相对于控件左上角)的坐标
yy=point.y;
GetClientRect(&rect);//保存拖动前的扑克位置
::ClientToScreen(m_hWnd,&rect.TopLeft());
OldPoint=rect.TopLeft();
MoveWindow(0,0,0,0);//得到相对量
GetClientRect(&rect);
::ClientToScreen(m_hWnd,&rect.TopLeft());
} COleControl::OnLButtonDown(nFlags, point);
}
void CCardsCtrl::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default CPoint MyPoint=point;
if(m_IsMove)
{
ClientToScreen(&MyPoint);
MoveWindow(MyPoint.x-xx-rect.left,MyPoint.y-yy-rect.top,71,96);
}
COleControl::OnMouseMove(nFlags, point);
} void CCardsCtrl::OnLButtonUp(UINT nFlags, CPoint point) {
// TODO: Add your message handler code here and/or call default
if(m_IsMove)
{
ReleaseCapture();
m_IsMove=false;
if(IsGoHome) 文章来源于www.hot007.com
MoveWindow(OldPoint.x-rect.left,OldPoint.y-rect.top,71,96);//还原到扑克牌拖动前的位置
} COleControl::OnLButtonUp(nFlags, point);
}


共2页: 上一页 1 [2] 下一页
Tags:扑克控件制作实例
您的评论
用户名: 新注册) 密码: 匿名评论 [所有评论]

·用户发表意见仅代表其个人意见,并且承担一切因发表内容引起的纠纷和责任
·本站管理人员有权在不通知用户的情况下删除不符合规定的评论信息或留做证据
·请客观的评价您所看到的资讯,提倡就事论事,杜绝漫骂和人身攻击等不文明行为