49上位机VC MFC实现自绘的AVI动画按钮
49上位机VC MFC实现自绘的AVI动画按钮
功能展示 在上位机开发时,经常会遇到美化按钮来美化程序界面,能播放AVI动画的按钮会更炫更容易吸引用户的的目光。如何实现动画按钮功能?我们当前例程就实现了,当鼠标划过按钮,就实现按钮动画效果,按钮动画效果如图; 要点提示 我们在当前例程实现按钮的动画效果,主要是通过微软自带的控件CAniamteCtrl类来实现的,当前例程我们就用此类的播放AVI文件函数进行动画播放显示;查询MSDN得知播放AVI文件的函数有Open()方法。此方法打开一个AVI文件或打开一个资源ID,并显示第一帧。BOOL Open( LPCTSTR lpszFileName ); BOOL Open( UINT nID ); play()方法,此方法用于播放一个已打开的AVI,语法如BOOL Play( UINT nFrom, UINT nTo, UINT nRep ); nFrom, nTo 是帧的起始与结束索引, nRep 是否循环播放值为-1时无限循环播放;还有方法是Stop()与Close()函数用于停止与关闭AVI;
实现功能 1.新建基于对话框的应用程序 2.新建一个基于Cbutton的类classCAviButton : public Cbutton;在新建的类中添加变量CAnimateCtrl m_Animate;//用于播放AVI文件BOOL m_bPlay;//用于标识是否播放AVI int m_nID;//AVI文件ID;构造函数中初始化m_bPlay = false;
3.添加虚拟函数DrawItem()和DrawButton()实现按钮自绘; - void CAviButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
- {
- CRect rect;
- GetClientRect(rect);
- if (!::IsWindow(m_Animate))
- {
- m_Animate.Create(WS_CHILD | WS_VISIBLE,rect,this,0);
- m_Animate.Open(m_nID);
- m_Animate.GetClientRect(rect);
- VERIFY(SetWindowPos(NULL,0,0, rect.Width()+2, rect.Height()+2,SWP_NOMOVE));
- m_Animate.MoveWindow(rect);
- }
- CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
- UINT State = lpDrawItemStruct->itemState;
- DrawButton(pDC,State,rect);
- }
复制代码- void CAviButton::DrawButton(CDC *pDC,UINT nState,CRect rect)
- {
- COLORREF UpCol,DownCol;
- if ((nState & ODS_SELECTED) == ODS_SELECTED)
- {
- UpCol=RGB(0,0,0);
- DownCol=RGB(0,0,0);
- m_bPlay = false;
- }
- else if ((nState & ODS_DISABLED) != ODS_DISABLED)
- {
- UpCol=RGB(255,255,255);
- DownCol=RGB(128,128,128);
- }
- //画按钮的左边和上边
- CPen pen1,pen2;
- pen1.CreatePen(PS_SOLID,3,UpCol);
- pDC->SelectObject(&pen1);
- pDC->MoveTo(0,rect.Height()-1);
- pDC->LineTo(0,0);
- pDC->LineTo(rect.Width()-1,0);
- //画按钮的右边和下边
- pen2.CreatePen(PS_SOLID,2,DownCol);
- pDC->SelectObject(&pen2);
- pDC->MoveTo(rect.Width()-1,0);
- pDC->LineTo(rect.Width()-1,rect.Height()-1);
- pDC->LineTo(0,rect.Height()-1);
- pen1.DeleteObject();
- pen2.DeleteObject();
- }
复制代码4.添加OnMouseMove()实现动画的播放效果 - void CAviButton::OnMouseMove(UINT nFlags, CPoint point)
- {
- ClientToScreen(&point);
- CRect rc;
- GetWindowRect(rc);
- if(rc.PtInRect(point))
- {
- if (::IsWindow(m_Animate) && !m_bPlay)
- {
- m_Animate.Play(0,-1,1);
- m_bPlay = true;
- SetCapture();
- }
- }
- else
- {
- m_bPlay = false;
- ReleaseCapture();
- }
- CButton::OnMouseMove(nFlags, point);
复制代码5.添加一个接口函数实现动画文件的设置LoadAVI() void CAviButton:oadAVI(UINT nID) { m_nID =nID; } 6.最后当然是在父窗口定义一个我们自定义的按钮,加载个AVI文件,来实现按钮动画效果
我们来演示功能实现的过程
|