www.pudn.com > Label.rar > LABEL.CPP


// Label.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "Label.h" 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
///////////////////////////////////////////////////////////////////////////// 
// CLabel 
 
CLabel::CLabel(void) 
{ 
	//初始化文本颜色和背景颜色 
	m_crText = GetSysColor(COLOR_WINDOWTEXT); 
	m_crBkground=GetSysColor(COLOR_3DFACE); 
 
	//初始化字体结构 
	::GetObject((HFONT)GetStockObject(DEFAULT_GUI_FONT),sizeof(m_lf),&m_lf); 
 
	//初始化链接 
	m_bLink = false; 
 
	//初始化闪烁类型、是否闪烁 
	m_Type = CLabel::None; 
	m_bFlash=false; 
 
	//初始化光标句柄 
	m_hCursor=NULL; 
 
	//初始化启动山所标志 
	m_bStartTimerFlag=false; 
} 
 
//拷贝构造函数 
CLabel::CLabel(const CLabel & p) 
{ 
	//设置字体 
	m_lf=p.m_lf; 
 
	//设置是否链接 
	m_bLink=p.m_bLink; 
 
	//设置闪烁类型 
	m_Type=p.m_Type; 
 
	//设置背景色和文本色 
	m_crBkground=p.m_crBkground; 
	m_crText=p.m_crText; 
 
	//设置光标 
	if(p.m_hCursor != NULL) 
	{ 
		m_hCursor=CopyCursor(p.m_hCursor); 
	} 
 
	//定时期启动标志和闪烁标志 
	m_bStartTimerFlag=false; 
	m_bFlash=false;	 
} 
 
//赋值构造函数 
CLabel& CLabel::operator=(const CLabel& p) 
{ 
	if(this != &p) 
	{ 
		//设置字体 
		m_lf=p.m_lf; 
		 
		//设置是否链接 
		m_bLink=p.m_bLink; 
		 
		//设置闪烁类型 
		m_Type=p.m_Type; 
		 
		//设置背景色和文本色 
		m_crBkground=p.m_crBkground; 
		m_crText=p.m_crText; 
		 
		//设置光标 
		if(m_hCursor != NULL) 
		{ 
			DestroyCursor(m_hCursor); 
			m_hCursor=NULL; 
		} 
		if(p.m_hCursor != NULL) 
		{ 
			m_hCursor=CopyCursor(p.m_hCursor); 
		} 
		 
		//定时期启动标志和闪烁标志 
		m_bStartTimerFlag=false; 
		m_bFlash=false;	 
	} 
	 
	return *this; 
} 
 
//析构函数 
CLabel::~CLabel(void) 
{ 
	//销毁光标 
	if(m_hCursor != NULL) 
	{ 
		DestroyCursor(m_hCursor); 
		m_hCursor=NULL; 
	} 
 
	//销毁字体 
	m_textfont.DeleteObject(); 
} 
 
//设置文本 
void CLabel::SetText(IN const CString& strText) 
{ 
	//设置显示文本 
	SetWindowText(strText); 
 
	//重绘窗口(经过测试,Invalidate所耗时间远小于RedrawWindow 
	Invalidate(); 
} 
 
//设置文本颜色 
void CLabel::SetTextColor(IN COLORREF crText) 
{ 
	//设置文本颜色 
	m_crText = crText; 
	 
	//重绘窗口(经过测试,Invalidate所耗时间远小于RedrawWindow 
	Invalidate(); 
} 
 
//设置是否加粗显示 
bool CLabel::SetFontBold(IN bool bBold) 
{	 
	bool returnvalue=false; 
	 
	//设置是否加粗 
	if(bBold == true) 
	{ 
		m_lf.lfWeight=FW_BOLD; 
	} 
	else 
	{ 
		m_lf.lfWeight=FW_NORMAL; 
	} 
 
	//更新字体 
	if(CreateFont()==true) 
	{ 
		//重绘窗口(经过测试,Invalidate所耗时间远小于RedrawWindow 
		Invalidate(); 
		 
		returnvalue=true; 
	} 
	 
	return returnvalue; 
} 
 
//设置是否下划线显示 
bool CLabel::SetFontUnderline(IN bool bSet) 
{	 
	bool returnvalue=false; 
	 
	//设置是否下划线 
	m_lf.lfUnderline = bSet; 
 
	//更新字体 
	if(CreateFont()==true) 
	{ 
		//重绘窗口(经过测试,Invalidate所耗时间远小于RedrawWindow 
		Invalidate(); 
 
		returnvalue=true; 
	} 
 
	return returnvalue; 
} 
 
//设置是否斜体显示 
bool CLabel::SetFontItalic(IN bool bSet) 
{ 
	bool returnvalue=false; 
	 
	//设置是否斜体 
	m_lf.lfItalic = bSet; 
	 
	//更新字体 
	if(CreateFont()==true) 
	{ 
		//重绘窗口(经过测试,Invalidate所耗时间远小于RedrawWindow 
		Invalidate(); 
		 
		returnvalue=true; 
	} 
	 
	return returnvalue; 
} 
 
//设置字号 
bool CLabel::SetFontSize(IN long nSize) 
{ 
	bool returnvalue=false; 
	 
	//设置新字号 
	if(nSize >=0 ) 
	{ 
		m_lf.lfWeight = nSize; 
	} 
	else 
	{ 
		m_lf.lfHeight = -nSize; 
	} 
 
	//更新字体 
	if(CreateFont()==true) 
	{ 
		//重绘窗口(经过测试,Invalidate所耗时间远小于RedrawWindow 
		Invalidate(); 
		 
		returnvalue=true; 
	} 
	 
	return returnvalue; 
} 
 
//获取是否加粗 
bool CLabel::IsFontBold(void) 
{ 
	bool returnvalue=false; 
 
	//判断字体权重是否大于等于700 
	if(m_lf.lfWeight >= 700) 
	{ 
		returnvalue=true; 
	} 
 
	return returnvalue; 
} 
 
//获取是否斜体 
bool CLabel::IsFontItalic(void) 
{ 
	bool returnvalue=false; 
 
	//判断字体斜显属性是否为真 
	if(m_lf.lfItalic != 0) 
	{ 
		returnvalue=true; 
	} 
 
	return returnvalue; 
} 
 
//获取是否下划线 
bool CLabel::IsFontUnderline(void) 
{ 
	bool returnvalue=false; 
 
	//判断字体下划线属性是否为真 
	if(m_lf.lfUnderline != 0) 
	{ 
		returnvalue=true; 
	} 
 
	return returnvalue; 
} 
 
//获取字号 
long	 CLabel::GetFontSize(void) 
{ 
	long returnvalue=0; 
	 
	//获取字体的绝对值 
	returnvalue=abs(m_lf.lfWidth); 
 
	return returnvalue; 
} 
 
//获取字体名 
CString CLabel::GetFontName(void) 
{ 
	CString tempstring(""); 
 
	tempstring=m_lf.lfFaceName; 
 
	return tempstring; 
} 
 
//设置背景色 
void CLabel::SetBkColor(IN COLORREF crBkgnd) 
{ 
	//设置背景色 
	m_crBkground=crBkgnd; 
	 
	//重绘窗口(经过测试,Invalidate所耗时间远小于RedrawWindow 
	Invalidate(); 
} 
 
//获取背景色 
COLORREF CLabel::GetBkColor(void) 
{ 
	return m_crBkground; 
} 
 
//获取前景色 
COLORREF CLabel::GetTextColor(void) 
{ 
	return m_crText; 
} 
 
//设置字体名 
bool CLabel::SetFontName(IN const CString& strFont) 
{	 
	bool returnvalue=false; 
	 
	//设置新字体 
	strcpy(m_lf.lfFaceName,strFont); 
 
	//更新字体 
	if(CreateFont()==true) 
	{ 
		//重绘窗口(经过测试,Invalidate所耗时间远小于RedrawWindow 
		Invalidate(); 
		 
		returnvalue=true; 
	} 
	 
	return returnvalue; 
} 
 
 
BEGIN_MESSAGE_MAP(CLabel, CStatic) 
	//{{AFX_MSG_MAP(CLabel) 
	ON_WM_TIMER() 
	ON_WM_LBUTTONDOWN() 
	ON_WM_SETCURSOR() 
	ON_WM_ERASEBKGND() 
	ON_WM_PAINT() 
	ON_WM_DESTROY() 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CLabel message handlers 
 
//WM_TIMER响应函数 
void CLabel::OnTimer(IN UINT nIDEvent)  
{ 
	//修改闪烁标志 
	m_bFlash = !m_bFlash; 
	 
	//重绘窗口(经过测试,Invalidate所耗时间远小于RedrawWindow 
	Invalidate(); 
 
//	CStatic::OnTimer(nIDEvent); 
} 
 
//设置是否以链接文本显示和光标 
void CLabel::SetLink(IN bool bLink,IN UINT nIDCursor) 
{ 
	HINSTANCE hInstance=AfxGetInstanceHandle(); 
	const COLORREF crLinkText=RGB(0,255,0);//文本颜色为绿色 
 
	//修改链接标志 
	m_bLink=bLink; 
 
	if(bLink == true) 
	{ 
		//设置文本颜色为绿色 
		m_crText=crLinkText; 
 
		//设置下划线 
		m_lf.lfUnderline=TRUE; 
 
		//设置新光标 
		m_hCursor=::LoadCursor(hInstance,MAKEINTRESOURCE(nIDCursor)); 
 
		//修改NOTIFY风格,该风格可激活WM_SETCURSOR 
		ModifyStyle(0,SS_NOTIFY); 
	} 
	else 
	{ 
		//设置文本颜色为正常色色 
		m_crText=GetSysColor(COLOR_WINDOWTEXT); 
 
		//设置下划线 
		m_lf.lfUnderline=FALSE; 
		 
		//销毁光标 
		if(m_hCursor != NULL) 
		{ 
			DestroyCursor(m_hCursor); 
			m_hCursor=NULL; 
		} 
		 
		//修改NOTIFY风格,该风格可激活WM_SETCURSOR 
		ModifyStyle(SS_NOTIFY,0); 
	} 
 
	//重绘窗口(经过测试,Invalidate所耗时间远小于RedrawWindow) 
	Invalidate(); 
} 
 
//是否链接 
bool	CLabel::IsLink(void) 
{ 
	return m_bLink; 
} 
 
//WM_LBUTTONDOWN消息相应函数 
void CLabel::OnLButtonDown(IN UINT nFlags, IN CPoint point)  
{ 
	const int	nTextLength=1024; 
	char text[nTextLength]; 
	int length=0; 
	 
	//判断是否有链接标志 
	if(m_bLink == true) 
	{ 
		//获取窗口文本 
		length=GetWindowText(text,nTextLength-1); 
		text[min(length,nTextLength-1)]='\0'; 
 
		//执行链接 
		ShellExecute(NULL,"open",text,NULL,NULL,SW_SHOWNORMAL); 
	} 
} 
 
//WM_SETCURSOR消息相应函数 
bool CLabel::OnSetCursor(IN CWnd* pWnd,IN UINT nHitTest,IN  UINT message)  
{ 
	bool returnvalue=false; 
 
	if(m_hCursor != NULL) 
	{ 
		//设置新光标 
		::SetCursor(m_hCursor); 
 
		returnvalue=true; 
	} 
	else 
	{ 
		if(CStatic::OnSetCursor(pWnd, nHitTest, message) != 0) 
		{ 
			returnvalue=true; 
		} 
	} 
 
	return returnvalue; 
} 
 
//WM_ERASEBKGND消息相应函数 
bool CLabel::OnEraseBkgnd(IN CDC* pDC)  
{ 
	// TODO: Add your message handler code here and/or call default 
	return TRUE; 
} 
 
//WM_PAINT消息相应函数 
void CLabel::OnPaint(void)  
{ 
	CPaintDC dc(this); // device context for painting 
	 
	// TODO: Add your message handler code here 
	 
	// Do not call CStatic::OnPaint() for painting messages 
	CRect clientrect(0,0,0,0);//客户区RECT  
 
	//获取客户区尺寸 
	GetClientRect(&clientrect); 
 
	//绘制背景 
	DrawBackground(dc,clientrect); 
	//绘制文本 
	DrawText(dc,clientrect); 
} 
 
//设置闪烁类型 
bool CLabel::SetFlashType(IN int iFlashType) 
{ 
	bool returnvalue=false; 
 
	//验证iFlashType的有效性 
	if(iFlashType == CLabel::None  
	|| iFlashType == CLabel::Text 
	|| iFlashType == CLabel::Background) 
	{ 
		m_Type = iFlashType; 
		returnvalue=true; 
	} 
	else 
	{ 
		m_Type = ErrorType; 
	} 
 
	return returnvalue; 
} 
 
//获取闪烁类型 
int	CLabel::GetFlashType(void) 
{ 
	return m_Type; 
} 
 
//启动闪烁 
bool CLabel::StartFlash(IN UINT iIntervalTime) 
{ 
	bool returnvalue=false; 
	BOOL bSetTimer=FALSE; 
 
	//首先停止定时器 
	StopFlash(); 
 
	//启动定时器 
	bSetTimer=SetTimer(IDT_TIMER1,iIntervalTime,NULL); 
	if(bSetTimer != 0) 
	{ 
		m_bStartTimerFlag=true; 
 
		returnvalue=true; 
	} 
	 
	return returnvalue; 
} 
 
//关闭闪烁 
void CLabel::StopFlash(void) 
{ 
	if(m_bStartTimerFlag == true) 
	{ 
		KillTimer(IDT_TIMER1); 
 
		m_bStartTimerFlag=false; 
	} 
} 
 
//设置光标 
bool CLabel::SetCursor(IN UINT nIDCursor) 
{ 
	HCURSOR hCursor=NULL; 
	bool	returnvalue=false; 
	HINSTANCE hInstance=AfxGetInstanceHandle(); 
	 
	 
	//装载光标资源 
	hCursor=::LoadCursor(hInstance,MAKEINTRESOURCE(nIDCursor)); 
 
	if(hCursor != NULL) 
	{ 
		//如过当前光标有效,则先销毁 
		if(m_hCursor != NULL) 
		{ 
			DestroyCursor(m_hCursor); 
		} 
		//设置新光标 
		m_hCursor=hCursor; 
		 
		ModifyStyle(0,SS_NOTIFY); 
 
		returnvalue=true; 
	} 
 
	return returnvalue; 
} 
 
//WM_DESTROY响应函数 
void CLabel::OnDestroy(void)  
{ 
	//销毁定时器 
	if(m_bStartTimerFlag == true) 
	{ 
		KillTimer(IDT_TIMER1); 
 
		m_bStartTimerFlag=false; 
	} 
	 
	CStatic::OnDestroy(); 
	 
	// TODO: Add your message handler code here 
} 
 
//设置光标(支持动态光标) 
bool CLabel::SetCursor(IN LPCTSTR lpCursorFileName) 
{ 
	HCURSOR hCursor=NULL; 
	bool	returnvalue=false; 
	 
	//装载光标资源 
	hCursor=::LoadCursorFromFile(lpCursorFileName); 
	 
	if(hCursor != NULL) 
	{ 
		//如过当前光标有效,则先销毁以前光标 
		if(m_hCursor != NULL) 
		{ 
			DestroyCursor(m_hCursor); 
		} 
		//设置新光标 
		m_hCursor=hCursor; 
		 
		ModifyStyle(0,SS_NOTIFY); 
		 
		returnvalue=true; 
	} 
	 
	return returnvalue; 
} 
 
//创建字体 
bool CLabel::CreateFont(void) 
{ 
	BOOL bCreateFont=FALSE; 
	bool returnvalue=false; 
	 
	//首先释放 
	m_textfont.DeleteObject(); 
 
	//创建字体 
	bCreateFont=m_textfont.CreateFontIndirect(&m_lf); 
 
	if(bCreateFont == TRUE) 
	{ 
		returnvalue=true; 
	} 
 
	return returnvalue; 
} 
 
//绘制文本 
void CLabel::DrawText(CDC &dc, CRect &clientrect) 
{ 
	CString strText(""); 
	UINT nTextFlags=DT_VCENTER | DT_SINGLELINE; 
	UINT maskchar=0x03; 
	DWORD windowstyle=GetStyle(); 
	 
	 
	//获取文本绘制标志 
	maskchar &= windowstyle; 
	if(maskchar == SS_CENTER) 
	{ 
		nTextFlags |= DT_CENTER; 
	} 
	else if(maskchar == SS_LEFT) 
	{ 
		nTextFlags |= DT_LEFT; 
	} 
	else 
	{ 
		nTextFlags |= DT_RIGHT; 
	} 
	 
	//设置为透明 
	dc.SetBkMode(TRANSPARENT); 
	 
	//绘制文本 
	if(m_Type == CLabel::Text && !m_bFlash) 
	{ 
	} 
	else 
	{ 
		//设置文本颜色 
		if(windowstyle & WS_DISABLED) 
		{ 
			dc.SetTextColor(GetSysColor(COLOR_INACTIVECAPTIONTEXT)); 
		} 
		else 
		{ 
			dc.SetTextColor(m_crText); 
		} 
		 
		//选入字体 
		dc.SelectObject(m_textfont); 
		 
		//获取显示文本 
		GetWindowText(strText); 
		dc.DrawText(strText,&clientrect,nTextFlags); 
	} 
} 
 
//绘制背景 
void CLabel::DrawBackground(CDC &dc, CRect &clientrect) 
{ 
	CBrush bkbrush(RGB(0,0,0));//画刷 
 
	//绘制背景 
	bkbrush.DeleteObject(); 
	if(m_Type == CLabel::Background && !m_bFlash) 
	{ 
		bkbrush.CreateSolidBrush(GetSysColor(COLOR_3DFACE)); 
	} 
	else 
	{ 
		bkbrush.CreateSolidBrush(m_crBkground); 
	} 
	dc.FillRect(&clientrect,&bkbrush); 
	bkbrush.DeleteObject(); 
}