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

📄 flatbutton.cpp

📁 我自己整理的一些VC源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
				pDC->SelectObject(penBtnHiLight);
				pDC->MoveTo(itemRect.left, itemRect.bottom-1);
				pDC->LineTo(itemRect.right-1, itemRect.bottom-1);
				pDC->LineTo(itemRect.right-1, itemRect.top-1);
				//
				pDC->SelectObject(pOldPen);
			}
		}
		else    
		{
			CBrush brBtnShadow(GetSysColor(COLOR_BTNSHADOW));
			pDC->FrameRect(&itemRect, &brBtnShadow);
		}
	}
	else // ...else draw non pressed button
	{
		CPen penBtnHiLight(PS_SOLID, 0, GetSysColor(COLOR_BTNHILIGHT)); // White
		CPen pen3DLight(PS_SOLID, 0, GetSysColor(COLOR_3DLIGHT));       // Light gray
		CPen penBtnShadow(PS_SOLID, 0, GetSysColor(COLOR_BTNSHADOW));   // Dark gray
		CPen pen3DDKShadow(PS_SOLID, 0, GetSysColor(COLOR_3DDKSHADOW)); // Black
		
		if (m_bIsFlat == TRUE)
		{
			if (m_MouseOnButton == TRUE && m_bDrawBorder == TRUE)
			{
				// Disegno i bordi a sinistra e in alto
				// White line
				pOldPen = pDC->SelectObject(&penBtnHiLight);
				pDC->MoveTo(itemRect.left, itemRect.bottom-1);
				pDC->LineTo(itemRect.left, itemRect.top);
				pDC->LineTo(itemRect.right, itemRect.top);
				// Disegno i bordi a destra e in basso
				// Dark gray line
				pDC->SelectObject(penBtnShadow);
				pDC->MoveTo(itemRect.left, itemRect.bottom-1);
				pDC->LineTo(itemRect.right-1, itemRect.bottom-1);
				pDC->LineTo(itemRect.right-1, itemRect.top-1);
				//
				pDC->SelectObject(pOldPen);
			}
		}
		else
		{
			// Disegno i bordi a sinistra e in alto
			// White line
			pOldPen = pDC->SelectObject(&penBtnHiLight);
			pDC->MoveTo(itemRect.left, itemRect.bottom-1);
			pDC->LineTo(itemRect.left, itemRect.top);
			pDC->LineTo(itemRect.right, itemRect.top);
			// Light gray line
			pDC->SelectObject(pen3DLight);
			pDC->MoveTo(itemRect.left+1, itemRect.bottom-1);
			pDC->LineTo(itemRect.left+1, itemRect.top+1);
			pDC->LineTo(itemRect.right, itemRect.top+1);
			// Disegno i bordi a destra e in basso
			// Black line
			pDC->SelectObject(pen3DDKShadow);
			pDC->MoveTo(itemRect.left, itemRect.bottom-1);
			pDC->LineTo(itemRect.right-1, itemRect.bottom-1);
			pDC->LineTo(itemRect.right-1, itemRect.top-1);
			// Dark gray line
			pDC->SelectObject(penBtnShadow);
			pDC->MoveTo(itemRect.left+1, itemRect.bottom-2);
			pDC->LineTo(itemRect.right-2, itemRect.bottom-2);
			pDC->LineTo(itemRect.right-2, itemRect.top);
			//
			pDC->SelectObject(pOldPen);
		}
	}
	
	// Read the button title
	CString sTitle;
	GetWindowText(sTitle);
	
	// If we don't want the title displayed
	if (m_bShowText == FALSE) sTitle.Empty();
	
	CRect captionRect = lpDIS->rcItem;
	
	// Draw the icon
	if (m_hIconIn != NULL)
	{
		DrawTheIcon(pDC, &sTitle, &lpDIS->rcItem, &captionRect, bIsPressed, bIsDisabled);
	}
	
	// Write the button title (if any)
	if (sTitle.IsEmpty() == FALSE)
	{
		// Disegno la caption del bottone
		// Se il bottone e' premuto muovo la captionRect di conseguenza
		if (bIsPressed)
			captionRect.OffsetRect(1, 1);
		
		// ONLY FOR DEBUG 
		// Evidenzia il rettangolo in cui verra' centrata la caption 
		//CBrush brBtnShadow(RGB(255, 0, 0));
		//pDC->FrameRect(&captionRect, &brBtnShadow);
		
#ifdef ST_USE_MEMDC
		// Get dialog's font
		CFont *pCurrentFont = GetFont(); 
		CFont *pOldFont = pDC->SelectObject(pCurrentFont);
#endif
		if ((m_MouseOnButton == TRUE) || (bIsPressed)) 
		{
			pDC->SetTextColor(GetActiveFgColor());
			pDC->SetBkColor(GetActiveBgColor());
		} 
		else 
		{
			pDC->SetTextColor(GetInactiveFgColor());
			pDC->SetBkColor(GetInactiveBgColor());
		}
		// Center text
		CRect centerRect = captionRect;
		pDC->DrawText(sTitle, -1, captionRect, DT_SINGLELINE|DT_CALCRECT);
		captionRect.OffsetRect((centerRect.Width() - captionRect.Width())/2, (centerRect.Height() - captionRect.Height())/2);
		/* RFU
		captionRect.OffsetRect(0, (centerRect.Height() - captionRect.Height())/2);
		captionRect.OffsetRect((centerRect.Width() - captionRect.Width())-4, (centerRect.Height() - captionRect.Height())/2);
		*/
		
		pDC->DrawState(captionRect.TopLeft(), captionRect.Size(), (LPCTSTR)sTitle, (bIsDisabled ? DSS_DISABLED : DSS_NORMAL), 
			TRUE, 0, (CBrush*)NULL);
#ifdef ST_USE_MEMDC
		pDC->SelectObject(pOldFont);
#endif
	}
	
	if (m_bIsFlat == FALSE || (m_bIsFlat == TRUE && m_bDrawFlatFocus == TRUE))
	{
		// Draw the focus rect
		if (bIsFocused)
		{
			CRect focusRect = itemRect;
			focusRect.DeflateRect(3, 3);
			pDC->DrawFocusRect(&focusRect);
		}
	}
} // End of DrawItem


void CFlatButton::DrawTheIcon(CDC* pDC, CString* title, RECT* rcItem, CRect* captionRect, BOOL IsPressed, BOOL IsDisabled)
{
	CRect iconRect = rcItem;
	
	switch (m_nAlign)
	{
    case ST_ALIGN_HORIZ:
		if (title->IsEmpty())
		{
			// Center the icon horizontally
			iconRect.left += ((iconRect.Width() - m_cxIcon)/2);
		}
		else
		{
			// L'icona deve vedersi subito dentro il focus rect
			iconRect.left += 3;  
			captionRect->left += m_cxIcon + 3;
		}
		// Center the icon vertically
		iconRect.top += ((iconRect.Height() - m_cyIcon)/2);
		break;
    case ST_ALIGN_VERT:
		// Center the icon horizontally
		iconRect.left += ((iconRect.Width() - m_cxIcon)/2);
		if (title->IsEmpty())
		{
			// Center the icon vertically
			iconRect.top += ((iconRect.Height() - m_cyIcon)/2);           
		}
		else
		{
			captionRect->top += m_cyIcon;
		}
		break;
	}
    
	// If button is pressed then press the icon also
	if (IsPressed) iconRect.OffsetRect(1, 1);
	// Ole'!
	pDC->DrawState(iconRect.TopLeft(), 
		iconRect.Size(), 
		(m_MouseOnButton == TRUE || IsPressed) ? m_hIconIn : m_hIconOut, 
		(IsDisabled ? DSS_DISABLED : DSS_NORMAL), 
		(CBrush*)NULL);
} // End of DrawTheIcon


void CFlatButton::PreSubclassWindow() 
{
	// Add BS_OWNERDRAW style
	SetButtonStyle(GetButtonStyle() | BS_OWNERDRAW);
	CButton::PreSubclassWindow();
} // End of PreSubclassWindow


void CFlatButton::SetDefaultInactiveBgColor(BOOL bRepaint)
{
	m_crInactiveBg = ::GetSysColor(COLOR_BTNFACE); 
	if (bRepaint == TRUE) Invalidate();
} // End of SetDefaultInactiveBgColor


void CFlatButton::SetInactiveBgColor(COLORREF crNew, BOOL bRepaint)
{
	m_crInactiveBg = crNew; 
	if (bRepaint == TRUE) Invalidate();
} // End of SetInactiveBgColor


const COLORREF CFlatButton::GetInactiveBgColor()
{
	return m_crInactiveBg;
} // End of GetInactiveBgColor


void CFlatButton::SetDefaultInactiveFgColor(BOOL bRepaint)
{
	m_crInactiveFg = ::GetSysColor(COLOR_BTNTEXT); 
	if (bRepaint == TRUE) Invalidate();
} // End of SetDefaultInactiveFgColor


void CFlatButton::SetInactiveFgColor(COLORREF crNew, BOOL bRepaint)
{
	m_crInactiveFg = crNew; 
	if (bRepaint == TRUE) Invalidate();
} // End of SetInactiveFgColor


const COLORREF CFlatButton::GetInactiveFgColor()
{
	return m_crInactiveFg;
} // End of GetInactiveFgColor


void CFlatButton::SetDefaultActiveBgColor(BOOL bRepaint)
{
	m_crActiveBg = ::GetSysColor(COLOR_BTNFACE); 
	if (bRepaint == TRUE) Invalidate();
} // End of SetDefaultActiveBgColor


void CFlatButton::SetActiveBgColor(COLORREF crNew, BOOL bRepaint)
{
	m_crActiveBg = crNew; 
	if (bRepaint == TRUE) Invalidate();
} // End of SetActiveBgColor


const COLORREF CFlatButton::GetActiveBgColor()
{
	return m_crActiveBg;
} // End of GetActiveBgColor


void CFlatButton::SetDefaultActiveFgColor(BOOL bRepaint)
{
	m_crActiveFg = ::GetSysColor(COLOR_BTNTEXT); 
	if (bRepaint == TRUE) Invalidate();
} // End of SetDefaultActiveFgColor


void CFlatButton::SetActiveFgColor(COLORREF crNew, BOOL bRepaint)
{
	m_crActiveFg = crNew; 
	if (bRepaint == TRUE) Invalidate();
} // End of SetActiveFgColor


const COLORREF CFlatButton::GetActiveFgColor()
{
	return m_crActiveFg;
} // End of GetActiveFgColor


void CFlatButton::SetFlatFocus(BOOL bDrawFlatFocus, BOOL bRepaint)
{
	m_bDrawFlatFocus = bDrawFlatFocus;
	
	// Repaint the button
	if (bRepaint == TRUE) Invalidate();
} // End of SetFlatFocus


BOOL CFlatButton::GetFlatFocus()
{
	return m_bDrawFlatFocus;
} // End of GetFlatFocus


BOOL CFlatButton::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) 
{
	// If a cursor was specified then use it!
	if (m_hCursor != NULL)
	{
		::SetCursor(m_hCursor);
		return TRUE;
	}
	
	return CButton::OnSetCursor(pWnd, nHitTest, message);
} // End of OnSetCursor

#undef ST_USE_MEMDC
#undef ST_LIKE

⌨️ 快捷键说明

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