一个动画风格的对话框类

介绍 我一直在使用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

posted @ 2020-08-09 00:45  Dincat  阅读(228)  评论(0编辑  收藏  举报