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

📄 labelex.cpp

📁 Wince下一款静态字符显示控件源码
💻 CPP
字号:
// LabelEx.cpp : implementation file
//

#include "stdafx.h"

#include "LabelEx.h"

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

/////////////////////////////////////////////////////////////////////////////
// CLabelEx

CLabelEx::CLabelEx()
{
	m_bClicked=FALSE;
	m_bOver=FALSE;
	m_bUnderLine=FALSE;
	m_bAutoUnderLine=FALSE;
	m_bBorder=FALSE;
	m_bHighLight=TRUE;
	m_bBackUnderLine=FALSE;

	m_crText=RGB(0,0,0);
	m_crBorder=RGB(255,255,255);
	m_crBG=RGB(255,255,255);
	m_crUnderLine=RGB(0,0,0);
	m_text = _T("提示");

	m_hHandCur=AfxGetApp()->LoadCursor(IDC_HAND);
}

CLabelEx::~CLabelEx()
{
	if(m_BGBm.GetSafeHandle()!=NULL)
		m_BGBm.DeleteObject();
	if(m_MouseOverBGBm.GetSafeHandle()!=NULL)
		m_MouseOverBGBm.DeleteObject();
	if(m_ClickedBGBm.GetSafeHandle()!=NULL)
		m_ClickedBGBm.DeleteObject();
	if(m_LabelBm.GetSafeHandle()!=NULL)
		m_LabelBm.DeleteObject();
	if(m_MouseOverLabelBm.GetSafeHandle()!=NULL)
		m_MouseOverLabelBm.DeleteObject();
	if(m_ClickedLabelBm.GetSafeHandle()!=NULL)
		m_ClickedLabelBm.DeleteObject();
}


BEGIN_MESSAGE_MAP(CLabelEx, CStatic)
	//{{AFX_MSG_MAP(CLabelEx)
	ON_WM_PAINT()
	ON_WM_MOUSEMOVE()
	ON_WM_LBUTTONDOWN()
	//}}AFX_MSG_MAP
//	ON_WM_ERASEBKGND()
//ON_WM_ERASEBKGND()
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CLabelEx message handlers

void CLabelEx::OnPaint() 
{
	CPaintDC dc(this); // device context for painting
	dc.SetTextColor(m_crText);
	dc.SetBkColor(m_crBG);
	CPen *pOldPen;
	CPen BorderPen;
    CBrush BGBrush,*pOldBrush;

	BGBrush.CreateSolidBrush(m_crBG); 

	pOldPen=dc.SelectObject(&BorderPen);
	pOldBrush=dc.SelectObject(&BGBrush);


//    dc.SelectObject(this->GetFont());	//nxx

	/////准备工作
	CRect rect;
	CDC MemDC;
	 
// 	BITMAP bm;
 	int nTextLeft=0,nTextTop=0; //文字输出的位置
	this->GetClientRect(&rect);
	dc.FillRect(&rect,&BGBrush);


//-----------------nxx
LOGFONT lf;
memset(&lf, 0, sizeof(LOGFONT));
if (m_bBorder)
lf.lfWeight = FW_BOLD;
//lf.lfHeight = 20;
//lf.lfQuality = CLEARTYPE_QUALITY;
lf.lfCharSet = GB2312_CHARSET;
HFONT hFontNew, hFontOld;
hFontNew = CreateFontIndirect(&lf);
hFontOld = (HFONT) SelectObject(dc, hFontNew);
//---------------------

	///输出文字
	TEXTMETRIC tm;
	dc.GetTextMetrics(&tm);
	dc.SetBkMode(TRANSPARENT);
	nTextTop=rect.top+(rect.Height()-tm.tmHeight)/2;
	char ss[40];
	int len = WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,m_text, -1, ss, (m_text.GetLength()+1)*2, NULL, NULL) -1;
	
	nTextLeft=rect.left+(rect.Width()-tm.tmAveCharWidth*len)/2;
	if(!m_text.IsEmpty())
	{	
		dc.SetTextColor(m_crText);
		//dc.DrawText(m_text, rect, 0 ); 
		dc.ExtTextOut(nTextLeft,nTextTop,ETO_OPAQUE,rect,m_text,NULL);	//nxx
	}
	SelectObject(dc,hFontOld);											//nxx
	dc.SelectObject(pOldPen);
	dc.SelectObject(pOldBrush);
}

void CLabelEx::PreSubclassWindow() 
{
	// TODO: Add your specialized code here and/or call the base class
	DWORD dwStyle = GetStyle();
    ::SetWindowLong(GetSafeHwnd(), GWL_STYLE, dwStyle | SS_NOTIFY);
	SetFont(GetParent()->GetFont());
	CStatic::PreSubclassWindow();
}

void CLabelEx::OnMouseMove(UINT nFlags, CPoint point) 
{
	//// TODO: Add your message handler code here and/or call default
	//if (m_bOver)        // Cursor is currently over control
 //   {
 //       CRect rect;
 //       GetClientRect(rect);

 //       if (!rect.PtInRect(point))
 //       {
 //           m_bOver = FALSE;
	//		if(m_bAutoUnderLine)  ///自动下划线
	//		{
	//			this->SetUnderLine(FALSE,RGB(0,0,0));
	//		}
	//		if(m_bHighLight)   //自动高亮
	//		{
	//			///恢复原来的字体颜色
	//			this->SetTextColor(m_crBackText);
	//		}
	//		RedrawWindow();
 //           ReleaseCapture();
 //           return;
 //       }
 //   }
 //   else                      // Cursor has just moved over control
 //   {
 //       m_bOver = TRUE;
	//	if(m_bAutoUnderLine)
	//	{
	//		this->SetUnderLine(TRUE,RGB(0,0,255));
	//	}
	//	if(m_bHighLight)
	//	{
	//		m_crBackText=m_crText;
	//		this->SetTextColor(RGB(0,0,255));
	//	}
 //       RedrawWindow();
 //       SetCapture();
	//	::SetCursor(m_hHandCur);
 //   }

	//CStatic::OnMouseMove(nFlags, point);
}

void CLabelEx::SetTextColor(COLORREF crText)
{
	m_crText=crText;
}

void CLabelEx::SetUnderLine(BOOL bUnderLine, COLORREF crUnderLine)
{
	m_bUnderLine=bUnderLine;
	m_crUnderLine=crUnderLine;

}

void CLabelEx::SetBorder(BOOL bBorder, COLORREF crBorder)
{
	m_bBorder=bBorder;
	m_crBorder=crBorder;
}

void CLabelEx::SetBkColor(COLORREF crBkColor)
{
	m_crBG=crBkColor;

}

void CLabelEx::EnableAutoUnderLine(BOOL bAutoUnderLine)
{
	m_bAutoUnderLine=bAutoUnderLine;
	if(m_bAutoUnderLine)   ///设置了自动下划线
	{
		m_bBackUnderLine=m_bUnderLine;//保存原来下划线的状态
		m_bUnderLine=FALSE;
	}
	else   ///取消了自动下划线
	{
		m_bUnderLine=m_bBackUnderLine;//回复原来下划线的状态
	}
}

void CLabelEx::RedrawWindow()
{
	CStatic::RedrawWindow();
	RECT rect;
	this->GetWindowRect(&rect);
	GetParent()->ScreenToClient(&rect);
	GetParent()->InvalidateRect(&rect);
}

void CLabelEx::SetBGBitmap(UINT ID)
{
	if(m_BGBm.GetSafeHandle()!=NULL)
		m_BGBm.DeleteObject();
	m_BGBm.LoadBitmap(ID);

}

void CLabelEx::SetMouseOverBGBitmap(UINT ID)
{
	if(m_MouseOverBGBm.GetSafeHandle()!=NULL)
		m_MouseOverBGBm.DeleteObject();
	m_MouseOverBGBm.LoadBitmap(ID);
}

void CLabelEx::SetClickedBGBitmap(UINT ID)
{
	if(m_ClickedBGBm.GetSafeHandle()!=NULL)
		m_ClickedBGBm.DeleteObject();
	m_ClickedBGBm.LoadBitmap(ID);

}

void CLabelEx::SetLabelBitmap(UINT ID)
{
	if(m_LabelBm.GetSafeHandle()!=NULL)
		m_LabelBm.DeleteObject();
	m_LabelBm.LoadBitmap(ID);

}


void CLabelEx::OnLButtonDown(UINT nFlags, CPoint point) 
{
	// TODO: Add your message handler code here and/or call default
	m_bClicked=!m_bClicked;
	RedrawWindow();
	CStatic::OnLButtonDown(nFlags, point);
}

void CLabelEx::SetMouseOverLabelBitmap(UINT ID)
{
	if(m_MouseOverLabelBm.GetSafeHandle()!=NULL)
		m_MouseOverLabelBm.DeleteObject();
	m_MouseOverLabelBm.LoadBitmap(ID);

}

void CLabelEx::SetClickedLabelBitmap(UINT ID)
{
	if(m_ClickedLabelBm.GetSafeHandle()!=NULL)
		m_ClickedLabelBm.DeleteObject();
	m_ClickedLabelBm.LoadBitmap(ID);

}

///自动感应字体颜色
void CLabelEx::EnableHighLight(BOOL bHighLight)
{
	m_bHighLight=bHighLight;
}

void CLabelEx::SetWindowText(LPCTSTR lpszString)
{
	m_text =lpszString;
	if (m_text.IsEmpty())
		m_text=_T("提示");
	Invalidate();
}

//BOOL CLabelEx::OnEraseBkgnd(CDC* pDC)
//{
//	// TODO: 在此添加消息处理程序代码和/或调用默认值
//
//	
//
//return TRUE; 
//
//
//}

//BOOL CLabelEx::OnEraseBkgnd(CDC* pDC)
//{
//	// TODO: 在此添加消息处理程序代码和/或调用默认值
//	 
//	 return FALSE;
//
//	//return CStatic::OnEraseBkgnd(pDC);
//}

⌨️ 快捷键说明

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