分享
 
 
 

制作扑克控件

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

VCKBASE Online Help Journal No.12

扑克控件制作实例

作者:龙浩天 (浪子转载自http://www.vckbase.com)

前言

本文以扑克控件的制作过程为实例,介绍了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,用来处理显示牌正面还是反面。

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文件看一看,你的位图资源是否是连续的。

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();

}

可以看出,这些函数的修改都是大同小异,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)

{

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)

MoveWindow(OldPoint.x-rect.left,OldPoint.y-rect.top,71,96);//还原到扑克牌拖动前的位置

}

COleControl::OnLButtonUp(nFlags, point);

}

10、到了这一步,此控件的主要工作已经完成了,现在我们为控件添加属性页,以使它和用户的交流更友好。首先在ResourceView中修改默认的属性页对话框为你需要的(详见程序源代码)。然后在ClassWizard的“Member Variables”中。从类中选择CCardsPropPage,点击“Add Variable…”按钮分别为你加入在属性页中的控件添加变量。这里添加变量的方法大致和为普通对话框添加变量相同,唯一有区别的是这里多了一项可选属性名(Optional property name),用于选择和变量相连的属性。具体设置详见下表:

控件名

变量名

组件

变量类型

可选属性名

IDC_CHECK1

m_check1

value

BOOL

background

IDC_CHECK2

m_check2

value

BOOL

IsMove

IDC_CHECK4

m_check4

value

BOOL

IsGoHome

IDC_EDIT1

m_edit1

value

short

value

IDC_EDIT2

m_edit2

value

short

backbmp

11、最后,为了使属性页和控件关联起来,我们再在void CCardsCtrl::DoPropExchange(CPropExchange* pPX)函数中添加代码: PX_Short(pPX,"value",value,1);

PX_Short(pPX,"backbmp",backbmp,1);

PX_Bool(pPX,"background",background,false);

PX_Bool(pPX,"IsMove",IsMove,false);

PX_Bool(pPX,"IsGoHome",IsGoHome,false);

补充:控件中的右键单击处理因为和制作此控件无关,这里没有解释,若想知详情请看源代码。

二、控件测试

1、新建一“MFC AppWizard(exe)”工程,取名为test,建立完毕,在Project(工程)中选择“Add Project(添加工程)”,再选“Components and Controls…”选项。 之后从弹出的对话框中双击“Registered ActiveX Controls”目录。从目录中选择刚才我们编的控件“Cards Control”,点“Insert”按钮把此控件插入到test工程中。

2、打开对话框资源,把控件拖动至对话框中,用鼠标右键单击Cards控件,进行属性设置,完毕后就可以运行了。

另外你也可以通过调用SetValue(short propVal)来手工设置扑克点数。好了,一切都OK了!

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有