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