www.gusucode.com > 基于VC编程界面编程高级应用技术源码程序 > VC界面编程高级应用技术/code/研究/AVIButonDemo/AVIButton.cpp
// AVIButton.cpp : implementation file // #include "stdafx.h" #include "AVIButonDemo.h" #include "AVIButton.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CAVIButton CAVIButton::CAVIButton() { this->aviResource=0; } CAVIButton::~CAVIButton() { } BEGIN_MESSAGE_MAP(CAVIButton, CButton) //{{AFX_MSG_MAP(CAVIButton) ON_CONTROL_REFLECT(BN_CLICKED, OnClicked) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // BOOL CAVIButton::Create( LPCTSTR lpszCaption, DWORD dwStyle, const RECT& rect, CWnd* pParentWnd, UINT nID ) { BOOL m_bSucess = CButton::Create( lpszCaption,dwStyle,rect, pParentWnd, nID ); return m_bSucess; } void CAVIButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) { // TODO: Add your code to draw the specified item CRect rect; GetClientRect(rect); //如果m_AnimateCtrl还没有建立 if (!::IsWindow(m_AnimateCtrl)) { //将按钮做为m_AnimateCtrl的父窗口 m_AnimateCtrl.Create(WS_CHILD |WS_VISIBLE,rect,this,0); m_AnimateCtrl.Open(this->aviResource); m_AnimateCtrl.GetClientRect(rect); //将按钮大小设置成和m_AnimateCtrl一致 SetWindowPos(NULL, -1, -1, rect.Width()+4, rect.Height()+4, SWP_NOMOVE|SWP_NOZORDER|SWP_NOREDRAW|SWP_NOACTIVATE); rect.OffsetRect(2,2); //开始播放 m_AnimateCtrl.MoveWindow(rect); m_AnimateCtrl.Play(0,-1,-1); } //进行按钮本身的绘制 CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC); UINT nState = lpDrawItemStruct->itemState; CRect buttonRect; GetClientRect(buttonRect); if (IsWindowEnabled()) nState &= ~ODS_DISABLED; else nState |= ODS_DISABLED; COLORREF upCol,downCol,Frame; //边框色 Frame=RGB(0,0,0); BOOL IsPressed = FALSE; //如果按钮已经被按下 if ((nState & ODS_SELECTED) == ODS_SELECTED) { upCol=RGB(0,0,0); Frame=RGB(128,128,128); downCol=RGB(0,0,0); IsPressed = TRUE; } else if ((nState & ODS_DISABLED) == ODS_DISABLED) { // Disabled// in the future maybe } else { // Normal upCol=RGB(255,255,255); downCol=RGB(128,128,128); } CPen* pOldPen = NULL; BOOL pen1Created; CPen pen1; BOOL pen2Created; CPen pen2; if (pen1Created = pen1.CreatePen(PS_SOLID, 1, upCol)) pOldPen = pDC->SelectObject( &pen1 ); //分别绘制按钮边框(立体) pDC->MoveTo(1,rect.Height()-1); pDC->LineTo(1,1); pDC->LineTo(rect.Width()-1,1); pDC->MoveTo(0,rect.Height()-1); pDC->LineTo(0,0); pDC->LineTo(rect.Width()-1,0); if (pen2Created = pen2.CreatePen(PS_SOLID, 1, downCol)) { pDC->SelectObject( &pen2 ); } if (pen1Created) pen1.DeleteObject(); pen1Created = FALSE; pDC->MoveTo(rect.Width()-1,0); pDC->LineTo(rect.Width()-1,rect.Height()-1); pDC->LineTo(0,rect.Height()-1); pDC->MoveTo(rect.Width()-2,1); pDC->LineTo(rect.Width()-2,rect.Height()-2); pDC->LineTo(0,rect.Height()-2); if (pen2Created) pen2.DeleteObject(); pen2Created = FALSE; if (pen1Created = pen1.CreatePen(PS_SOLID, 1, Frame)) pOldPen = pDC->SelectObject( &pen1 ); if (IsPressed) { pDC->MoveTo(1,rect.Height()-2); pDC->LineTo(1,1); pDC->LineTo(rect.Width()-2,1); } else { pDC->MoveTo(rect.Width()-1,0); pDC->LineTo(rect.Width()-1,rect.Height()-1); pDC->LineTo(-1,rect.Height()-1); } //恢复DC设置 if (pen1Created) pen1.DeleteObject(); pen1Created = FALSE; if (pOldPen != NULL) pDC->SelectObject( pOldPen ); } void CAVIButton::OnClicked() { AfxMessageBox("测试信息"); } //设置AVI的ID值 void CAVIButton::SetAVIResource(DWORD resource) { this->aviResource=resource; }