一个动画风格的对话框类

下载source files - 4 Kb下载demo project - 21 Kb

介绍
我一直在使用Almond和Maunder的DrawWireRects函数,因为
我总是喜欢我的程序看起来很酷。这个功能很好,但是,
为了使用它,我需要重载OnCreate和OnDestroy函数
每个对话框类,我希望它被影响,有一些不便
关于直接重用DrawWireRects功能:

如果有很多(比方说5种)不同的对话框,我将在a中使用
项目,由于它们的功能不同,因此每个类都必须是一个新的类
我需要重载每个类中的OnCreate和OnDestroy函数
并添加一些其他成员,以补充动画效果。那些
会有很多重复的代码。除了动画对话框,我可能还需要不时地做一些调整,
例如,我想要一个类名为CMyDialog的对话框
然后接近它的右下角,然后几分钟后我
改变主意,让它靠近系统托盘…无论如何,我应该
能够通过简单的使用DrawWireRects来做这些事情,但是很快我就会发现尺寸
MyDialog.cpp生长
该项目中的其他对话框类也是如此。

如果有一个现有的类可以封装所有这些必要的东西就好了,
我可以从它派生我的类,它会替我做所有的苦差事。
这就是CAniDialog类的由来。

CAniDialog类

首先,这个类的核心和灵魂是DrawWireRects函数,
这是由阿蒙德和蒙德写的,所以信用在那里。我试着
保持这个功能尽可能完整,有必要做一些小改动,
然而,为了使它与其他班级成员很好地合作。

类CAniDialog派生自CDialog
这个类的目的是使使用动画对话框像使用一样简单
MessageBox函数,这是唯一需要的
由用户提供的是一个CPoint对象,它指定对话框应该从哪里弹出
如果要使用as_reference动画样式标志,请接近。
所有其他元素都有默认值,而且在大多数情况下,它们已经经过了优化,不需要更改。

CAniDialog类的公共方法
隐藏,收缩,复制Code// construction
CAniDialog(UINT nDlgID, CWnd* pParent);
CAniDialog(CPoint pt, UINT nDlgID, CWnd* pParent);

// operation

// access frame number
UINT GetFrameNum() const;
void SetFrameNum(UINT nFrames);

// access animation speed
UINT GetAniSpeed() const;
void SetAniSpeed(UINT nMillSec);

// access the reference point
CPoint GetRefPt() const;
void SetRefPt(CPoint pt);

// access animation styles
WORD GetOpenStyle() const;
WORD GetCloseStyle() const;
void SetAniStyles(WORD wOpenStyle, WORD wCloseStyle);
WORD GetDispStyle() const;
void SetDispStyle(WORD wDispStyle);

// temporarily enable/disable animation
void EnableAni(BOOL bEnable = TRUE);

// check object status
BOOL IsAniValid() const;

动画风格

预定义的动画样式标志:

隐藏,收缩,复制Code// animation styles

// animate from/to the refer point
#define AS_REFER 0

// animate from/to center
#define AS_CENTER 1

// animate from/to corners
#define AS_TOPLEFT 2

#define AS_TOPRIGHT 3
#define AS_BOTTOMLEFT 4
#define AS_BOTTOMRIGHT 5

// animate from/to sides
#define AS_LEFT 6
#define AS_TOP 7
#define AS_RIGHT 8
#define AS_BOTTOM 9

// animate from/to a random point inside of dialog
#define AS_RANDOM 10

// define displaying style

// call “DrawWireRects”
#define DS_WIRE 0
// call “::DrawAnimatedRects”
#define DS_CAPTION 1

如何使用

要使用CAniDialog类,你需要:

添加AniDialog.h和AniDialog.cpp到你的项目和
在需要的地方包括AniDialog.h。
使用资源编辑器创建一个新的对话框,在对话框上绘制任何控件
然后使用类向导为它创建一个新类,例如,命名新
类CMyDlg并让CDialog作为它的基类。转到mydll .h并使用代码编辑器的替换特性来
用CAniDialog替换整个文件中的所有CDialog。转到mydll .cpp并使用代码编辑器的“替换”特性来
用CAniDialog替换整个文件中的所有CDialog。在这一点上,你已经改变了底面
类的CMyDlg从CDialog到CAniDialog。
修改CMyDlg类的构造函数,使它看起来像这样:
隐藏,复制代码// CMyDlg(CWnd* pParent = NULL);/ /原始
CMyDlg(CPoint pt, CWnd* pParent = NULL);/ /现在

构造函数的主体就变成了这样:CMyDlg(CPoint pt, CWnd* pParent / =NULL/)
// CDialog(CMyDlg::IDD, pParent) //原件
CAniDialog(pt, CMyDlg::IDD, pParent) //现在
{
/ / {{AFX_DATA_INIT (CDemoPopupDlg)
//注意:ClassWizard会添加
//这里的成员初始化
/ /}} AFX_DATA_INIT
}

就是这样!现在CMyDlg类已经准备好了。
在创建CMyDlg对象时,需要向它传递一个CPoint
对象,它告诉对话框从哪里弹出,从哪里靠近。

隐藏,复制Code// If you are going to use the AS_REFER flag,
// you must provide a valid CPoint.
// If you are not going to use the AS_REFER flag,
// then the value of this CPoint
// does not matter at all, in that case,
// just give it one so the compiler won’t
// complain.
CPoint pt;

// we are going to use the AS_REFER flag so
// we need a valid CPoint value.
::GetCursorPos(&pt); // fetch current cursor position

CMyDlg dlg(pt);

// optional
// you can specify animation styles, displaying
// styles, animation speed, animation
// frame numbers etc.

// the dialog will pop up from you cursor
dlg.SetAniStyles(AS_REFER, AS_CENTER);

// position and close inwards its own center
dlg.DoModal(); // watch the animation!

本文转载于:http://www.diyabc.com/frontweb/news3656.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值