⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 colorbutton.cpp

📁 visual c++ 实例编程
💻 CPP
字号:
//贵州省安顺市第二高级中学 高二一班 蒋伟	
//2002.7.1
//请勿修改版权信息 谢谢
//Neil
//
// ColorButton.cpp : implementation file
//

#include "stdafx.h"
#include "ColorButton.h"

#include "ColorPopup.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

#define MAX_ARROW_WIDTH 12

/////////////////////////////////////////////////////////////////////////////
// CColorButton

CColorButton::CColorButton()
{
	m_MouseOnButton=FALSE;
	m_bArrowPress =FALSE;
	m_bButtonPress = FALSE;
	m_bTrackSelection = FALSE;
	
	m_clrCurrent = 0;

}

CColorButton::~CColorButton()
{
}

BEGIN_MESSAGE_MAP(CColorButton, CButton)
	//{{AFX_MSG_MAP(CColorButton)
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONDOWN()
	ON_WM_LBUTTONUP()
	//}}AFX_MSG_MAP
	ON_MESSAGE(CPN_SELENDOK,     OnSelEndOK)
  ON_MESSAGE(CPN_SELENDCANCEL, OnSelEndCancel)
  ON_MESSAGE(CPN_SELCHANGE,    OnSelChange)
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CColorButton message handlers

void CColorButton::DrawItem(LPDRAWITEMSTRUCT lpDIS ) 
{
	// TODO: Add your code to draw the specified item
	CDC* pDC = CDC::FromHandle(lpDIS->hDC);
	UINT state = lpDIS->itemState;
	
	// Set the Button Rect
	CRect itemRect = lpDIS->rcItem;
	CRect ButtonRect(itemRect);
	CRect ArrowRect(itemRect);
	
	ButtonRect.InflateRect (0 , 0, - MAX_ARROW_WIDTH,0);  
	
	m_rectButton = ButtonRect;
	
	ArrowRect.InflateRect ( -ButtonRect.Width() ,0,0,0);
	
	m_rectArrow = ArrowRect; 
	
	BOOL bIsPressed  = (lpDIS->itemState & ODS_SELECTED);
	BOOL bIsFocused  = (lpDIS->itemState & ODS_FOCUS);
	BOOL bIsDisabled = (lpDIS->itemState & ODS_DISABLED);

	pDC->SetBkMode(TRANSPARENT);
	 
	
	// Draw pressed button
	if (bIsPressed)	{
		if (m_bButtonPress){
			pDC->Draw3dRect(ButtonRect, ::GetSysColor(COLOR_BTNSHADOW), 
							::GetSysColor(COLOR_BTNHILIGHT));
		}
		if (m_bArrowPress){
			pDC->Draw3dRect(ArrowRect, ::GetSysColor(COLOR_BTNSHADOW), 
							::GetSysColor(COLOR_BTNHILIGHT));
		}
	}
	else{
		if(m_MouseOnButton ){
				pDC->Draw3dRect(ButtonRect, ::GetSysColor(COLOR_BTNHILIGHT),
								::GetSysColor(COLOR_BTNSHADOW));
				pDC->Draw3dRect(ArrowRect, ::GetSysColor(COLOR_BTNHILIGHT),
								::GetSysColor(COLOR_BTNSHADOW));
			}
	}   
	
/*	// Draw the Demo Word 
	CRect rectWord = m_rectButton;
	rectWord.InflateRect (-6,-6);
	rectWord.OffsetRect (-1,-2);
    pDC->DrawText("C", rectWord, DT_CENTER |DT_VCENTER | DT_SINGLELINE);
	*/
	// Draw the Demo fillRect
	CRect rectFillRect = m_rectButton;
	pDC->Rectangle(m_rectButton);
	rectFillRect.InflateRect (-1,-1);
	pDC->FillSolidRect(rectFillRect, GetColor());
    
	// Draw the DownArrow 
	ArrowRect.InflateRect (-1,-2);
	pDC->DrawFrameControl(&ArrowRect, DFC_SCROLL, DFCS_SCROLLDOWN  ); 
	
	// Erasure the frame of the little Arrow 
	pDC->Draw3dRect(&ArrowRect,::GetSysColor(COLOR_BTNFACE),
					::GetSysColor(COLOR_BTNFACE));
	ArrowRect.InflateRect (-1,-1);
	pDC->Draw3dRect(&ArrowRect,::GetSysColor(COLOR_BTNFACE),
					::GetSysColor(COLOR_BTNFACE));

}

void CColorButton::OnMouseMove(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if (nFlags & MK_LBUTTON && m_MouseOnButton == FALSE) return;
	
	if (GetCapture() != this){
		m_MouseOnButton = TRUE;
		SetCapture();
		Invalidate();
	}
	else{
		POINT p2 = point;
		ClientToScreen(&p2);
		CWnd* wndUnderMouse = WindowFromPoint(p2);
		if (wndUnderMouse && wndUnderMouse->m_hWnd != this->m_hWnd){
			// Redraw only if mouse goes out
			if (m_MouseOnButton == TRUE){
				m_MouseOnButton = FALSE;
				Invalidate();
			}
			// If user is NOT pressing left button then release capture!
			if (!(nFlags & MK_LBUTTON)) 
				ReleaseCapture();
		}	
	}
	
	CButton::OnMouseMove(nFlags, point);
}


void CColorButton::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	if (m_rectButton.PtInRect (point))
		m_bButtonPress = TRUE;
	else
		m_bButtonPress = FALSE;

	if (m_rectArrow.PtInRect (point))
			m_bArrowPress = TRUE;
		else 
			m_bArrowPress = FALSE;
	
	CButton::OnLButtonDown(nFlags, point);
}

void CColorButton::OnLButtonUp(UINT nFlags, CPoint point) 
{

	m_bArrowPress = FALSE;
	m_bButtonPress = FALSE;
	
	if (m_rectArrow.PtInRect (point)){
		CRect rect;
		GetWindowRect(rect);
		new CColorPopup(CPoint(rect.left, rect.bottom),  
			            GetColor(), this, _T("自动选择颜色"),_T("其他颜色 ..."));
	}	
	
	CButton::OnLButtonUp(nFlags, point);
}

////////////////////////////////////////////////////
COLORREF CColorButton::GetColor()
{
	return m_clrCurrent;
}

/////////////////////////////////////////////////////////////////////////////
// CColorButton message handlers

LONG CColorButton::OnSelEndOK(UINT lParam, LONG /*wParam*/)
{
    COLORREF crNewColor = (COLORREF) lParam;
    m_MouseOnButton = FALSE;
	SetColor(crNewColor);
	
//	CFontTestView *pView = (CFontTestView *)((CMainFrame*)AfxGetMainWnd())->GetActiveView();
	
//	pView->SetEditFont (crNewColor);
    
	return TRUE;
}

/////////////////////////////////////////////////////////////////////
LONG CColorButton::OnSelEndCancel(UINT lParam, LONG /*wParam*/)
{
    m_MouseOnButton = FALSE;
    
	SetColor((COLORREF) lParam);
	
	return TRUE;
}

////////////////////////////////////////////////////////////////////
LONG CColorButton::OnSelChange(UINT lParam, LONG /*wParam*/)
{
	m_MouseOnButton = FALSE;
    if (m_bTrackSelection)
	SetColor((COLORREF) lParam);
	
	return TRUE;
}

///////////////////////////////////////////////////////////////////////
void CColorButton::SetColor(COLORREF clrColor)
{ 
  m_clrCurrent = clrColor; 
	Invalidate();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -