📄 buttonst.cpp
字号:
// ButtonST.cpp : implementation file
//
#include "stdafx.h"
#include "最近邻法分类器.h"
#include "ButtonST.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CButtonST
CButtonST::CButtonST()
{
m_MouseOnButton = FALSE;
m_hCursor = NULL;
m_bShowText = TRUE;
m_strToolTip.Empty();
m_bTracking=FALSE;
bIsFocused=FALSE;
flagb=true;
down=false;
MOUSEFLAG=false;
flagv=false;flagT=false;
}
CButtonST::~CButtonST()
{
if (m_hCursor != NULL) ::DestroyCursor(m_hCursor);
}
BEGIN_MESSAGE_MAP(CButtonST, CButton)
//{{AFX_MSG_MAP(CButtonST)
ON_WM_MOUSEMOVE()
ON_MESSAGE(WM_MOUSELEAVE, OnMouseLeave)
ON_MESSAGE(WM_MOUSEHOVER, OnMouseHover)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CButtonST message handlers
void CButtonST::PreSubclassWindow()
{
// TODO: Add your specialized code here and/or call the base class
CRect rect;
GetClientRect ( &rect );
SetButtonStyle(GetButtonStyle() | BS_OWNERDRAW);
CButton::PreSubclassWindow();
}
void CButtonST::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: Add your code to draw the specified item
CDC *pdrawDC = CDC::FromHandle(lpDrawItemStruct->hDC);
CMemDC memDC(pdrawDC);
CDC *pDC = &memDC;
CPen *pOldPen;
CBrush *pOldBrush;
BOOL bIsPressed = (lpDrawItemStruct->itemState & ODS_SELECTED);
BOOL Focused=(lpDrawItemStruct->itemState & ODS_FOCUS);
int nSaveDC=pDC->SaveDC();
if(bIsPressed)
{bIsFocused=bIsPressed;}
if(!Focused)
{bIsFocused=FALSE;}
//BOOL bIsFocused = (lpDrawItemStruct->itemState & ODS_FOCUS);
BOOL bIsDisabled = (lpDrawItemStruct->itemState & ODS_DISABLED);
CRect itemRect = lpDrawItemStruct->rcItem;
//COLORREF bgColor(RGB(88,122,187));
if(down||(!down&&bIsPressed))
{
down=true;
CPen penBtnHiLight(PS_SOLID, 0, GetSysColor(COLOR_BTNHILIGHT)); // Bianco
CPen penBtnShadow(PS_SOLID, 0, GetSysColor(COLOR_BTNSHADOW)); // Grigio scuro
CRect rects(itemRect);
///////////////////////////////////////////////////
CRect rectst1,rectst2,rectst3,rectst4;
rectst1.left=rects.left;
rectst1.top=rects.top;
rectst1.bottom =rects.bottom;
rectst1.right=rectst1.left+rects.Width()/4;
pDC->FillSolidRect(&rectst1, RGB(255, 242, 200));
rectst2.left= rectst1.right;
rectst2.top=rects.top;
rectst2.bottom =rects.bottom;
rectst2.right=rectst2.left+rects.Width()/4;
pDC->FillSolidRect(&rectst2, RGB(255, 238, 196));
rectst3.left= rectst2.right;
rectst3.top=rects.top;
rectst3.bottom =rects.bottom;
rectst3.right=rectst3.left+rects.Width()/4;
pDC->FillSolidRect(&rectst3, RGB(255, 234, 192));
rectst4.left= rectst3.right;
rectst4.top=rects.top;
rectst4.bottom =rects.bottom;
rectst4.right=rects.right;
pDC->FillSolidRect(&rectst4, RGB(255, 230, 189));
/////////////////////////////////////////////////////////
pOldPen = pDC->SelectObject(&penBtnShadow);
pDC->MoveTo(itemRect.left, itemRect.bottom-1);
pDC->LineTo(itemRect.left, itemRect.top);
pDC->LineTo(itemRect.right, itemRect.top);
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);
}
else
{
if(m_MouseOnButton==TRUE)
{
CRect rects(itemRect);
CRect rectst1,rectst2,rectst3,rectst4;
rectst1.left=rects.left;
rectst1.top=rects.top;
rectst1.bottom =rects.bottom;
rectst1.right=rectst1.left+rects.Width()/4;
pDC->FillSolidRect(&rectst1, RGB(255, 242, 200));
rectst2.left= rectst1.right;
rectst2.top=rects.top;
rectst2.bottom =rects.bottom;
rectst2.right=rectst2.left+rects.Width()/4;
pDC->FillSolidRect(&rectst2, RGB(255, 238, 196));
rectst3.left= rectst2.right;
rectst3.top=rects.top;
rectst3.bottom =rects.bottom;
rectst3.right=rectst3.left+rects.Width()/4;
pDC->FillSolidRect(&rectst3, RGB(255, 234, 192));
rectst4.left= rectst3.right;
rectst4.top=rects.top;
rectst4.bottom =rects.bottom;
rectst4.right=rects.right;
pDC->FillSolidRect(&rectst4, RGB(255, 230, 189));
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
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
{
CRect rects(itemRect);
for(int i=0;i<18;i++)
{
rects.top=itemRect.top+i*2;
rects.bottom=rects.top+2;
pDC->FillSolidRect(rects,RGB(189+i,213+i,249));
}
}
}
TCHAR strText[MAX_PATH + 1];
::GetWindowText(m_hWnd, strText, MAX_PATH);
//显示按钮的文本
if(flagv)
return;
if(flagT)
{
if (strText1!=NULL)
{
CFont* hFont = GetFont();
CFont* hOldFont = pDC->SelectObject(hFont);
CSize szExtent = pDC->GetTextExtent(strText, lstrlen(strText));
CPoint pt( itemRect.CenterPoint().x - szExtent.cx / 2, itemRect.CenterPoint().y - szExtent.cy / 2);
if (bIsPressed&&!down )
pt.Offset(1, 1);
int nMode = pDC->SetBkMode(TRANSPARENT);
pDC->DrawState(pt, szExtent, strText1, DSS_NORMAL, TRUE, 0, (HBRUSH)NULL);
pDC->SelectObject(hOldFont);
pDC->SetBkMode(nMode);
}
}
else
{
if (strText!=NULL)
{
CFont* hFont = GetFont();
CFont* hOldFont = pDC->SelectObject(hFont);
CSize szExtent = pDC->GetTextExtent(strText, lstrlen(strText));
CPoint pt( itemRect.CenterPoint().x - szExtent.cx / 2, itemRect.CenterPoint().y - szExtent.cy / 2);
if (bIsPressed&&!down )
pt.Offset(1, 1);
int nMode = pDC->SetBkMode(TRANSPARENT);
pDC->DrawState(pt, szExtent, strText, DSS_NORMAL, TRUE, 0, (HBRUSH)NULL);
pDC->SelectObject(hOldFont);
pDC->SetBkMode(nMode);
}
}
}
LRESULT CButtonST::OnMouseLeave(WPARAM wParam, LPARAM lParam)
{
m_MouseOnButton = FALSE;
m_bTracking = FALSE;
MOUSEFLAG=false;
GetParent()->SendMessage(WM_MOUSEMOVE);
InvalidateRect(NULL, FALSE);
return 0;
}
LRESULT CButtonST::OnMouseHover(WPARAM wParam, LPARAM lParam)
{
m_MouseOnButton = TRUE;
InvalidateRect(NULL);
return 0;
}
void CButtonST::OnMouseMove(UINT nFlags, CPoint point)
{
// TODO: Add your message handler code here and/or call default
if (!m_bTracking)
{
TRACKMOUSEEVENT tme;
tme.cbSize = sizeof(tme);
tme.hwndTrack = m_hWnd;
tme.dwFlags = TME_LEAVE | TME_HOVER;
tme.dwHoverTime = 1;
m_bTracking = _TrackMouseEvent(&tme);
}
CButton::OnMouseMove(nFlags, point);
}
BOOL CButtonST::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
return CButton::PreTranslateMessage(pMsg);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -