skinhyperlink.cpp
来自「网狐棋牌(家园版)最新版本7.1.1源代码,共享组件源码」· C++ 代码 · 共 419 行
CPP
419 行
#include "Stdafx.h"
#include "Resource.h"
#include "SkinHyperLink.h"
//////////////////////////////////////////////////////////////////////////
//提示 ID
#define TOOLTIP_ID 100
//默认属性
#define DEF_HOVERTEXT_COLOR RGB(220,0,0)
#define DEF_VISITEDTEXT_COLOR RGB(0,0,100)
#define DEF_NORMALTEXT_COLOR RGB(0,0,230)
#define DEF_BACKGROUND_COLOR RGB(240,240,240)
#define DEF_HOVERTEXT_COLOR_EX RGB(220,0,0)
#define DEF_VISITEDTEXT_COLOR_EX RGB(0,0,100)
#define DEF_NORMALTEXT_COLOR_EX RGB(0,0,230)
#define DEF_BACKGROUND_COLOR_EX RGB(240,240,240)
//静态变量
CSkinHyperLinkAttribute CSkinHyperLink::m_SkinAttribute; //超连接属性
//////////////////////////////////////////////////////////////////////////
IMPLEMENT_DYNAMIC(CSkinHyperLink, CStatic)
BEGIN_MESSAGE_MAP(CSkinHyperLink, CStatic)
ON_WM_PAINT()
ON_WM_CREATE()
ON_WM_SETCURSOR()
ON_WM_MOUSEMOVE()
ON_MESSAGE(WM_MOUSELEAVE,OnMouseLeave)
ON_MESSAGE(WM_SETTEXT,OnSetTextMesage)
ON_CONTROL_REFLECT(STN_CLICKED, OnStnClicked)
END_MESSAGE_MAP()
//////////////////////////////////////////////////////////////////////////
//构造函数
CSkinHyperLinkAttribute::CSkinHyperLinkAttribute() : CSkinAttribute(TEXT("CSkinHyperLink"))
{
//初始化变量
m_crHoverText=DEF_HOVERTEXT_COLOR;
m_crVisitedText=DEF_VISITEDTEXT_COLOR;
m_crNormalText=DEF_NORMALTEXT_COLOR;
m_crBackColor=DEF_BACKGROUND_COLOR;
//注册属性
RegisterAttribute(SKIN_LINK_CRHOVERTEXT,&m_crHoverText,false);
RegisterAttribute(SKIN_LINK_CRVISITEDTEXT,&m_crVisitedText,false);
RegisterAttribute(SKIN_LINK_CRNORMALTEXT,&m_crNormalText,false);
RegisterAttribute(SKIN_LINK_CRBACKGROUND,&m_crBackColor,false);
}
//析构函数
CSkinHyperLinkAttribute::~CSkinHyperLinkAttribute()
{
}
//加载配置
bool __cdecl CSkinHyperLinkAttribute::LoadSkinOption()
{
//读取配置
m_crHoverText=ReadColor(SKIN_LINK_CRHOVERTEXT,DEF_HOVERTEXT_COLOR);
m_crVisitedText=ReadColor(SKIN_LINK_CRVISITEDTEXT,DEF_VISITEDTEXT_COLOR);
m_crNormalText=ReadColor(SKIN_LINK_CRNORMALTEXT,DEF_NORMALTEXT_COLOR);
m_crBackColor=ReadColor(SKIN_LINK_CRBACKGROUND,DEF_BACKGROUND_COLOR);
return true;
}
//保存配置
bool __cdecl CSkinHyperLinkAttribute::SaveSkinOption()
{
WriteColor(SKIN_LINK_CRHOVERTEXT,m_crHoverText);
WriteColor(SKIN_LINK_CRVISITEDTEXT,m_crVisitedText);
WriteColor(SKIN_LINK_CRNORMALTEXT,m_crNormalText);
return true;
}
//////////////////////////////////////////////////////////////////////////
//构造函数
CSkinHyperLink::CSkinHyperLink()
{
m_crBackColor=0;
m_bVisited=false;
m_bHovering=false;
m_bUnderline=true;
m_bAutoAdjust=true;
m_pIMouseEvent=NULL;
}
//析构函数
CSkinHyperLink::~CSkinHyperLink()
{
}
//设置鼠标回调接口
void CSkinHyperLink::SetMouseEventSink(IUnknownEx * pIUnknownEx)
{
ASSERT(pIUnknownEx!=NULL);
m_pIMouseEvent=GET_OBJECTPTR_INTERFACE(pIUnknownEx,IMouseEvent);
ASSERT(m_pIMouseEvent!=NULL);
return;
}
//获取鼠标回调接口
void * CSkinHyperLink::GetMouseEventSink(const IID & Guid, DWORD dwQueryVer)
{
if (m_pIMouseEvent==NULL) return NULL;
return m_pIMouseEvent->QueryInterface(Guid,dwQueryVer);
}
//消息解释
BOOL CSkinHyperLink::PreTranslateMessage(MSG * pMsg)
{
m_ToolTip.RelayEvent(pMsg);
return CStatic::PreTranslateMessage(pMsg);
}
//控件子类化
void CSkinHyperLink::PreSubclassWindow()
{
__super::PreSubclassWindow();
//初始化
InitHyperLink();
return;
}
//建立消息
int CSkinHyperLink::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (__super::OnCreate(lpCreateStruct)==-1) return -1;
//初始化
InitHyperLink();
return 0;
}
//绘画消息
void CSkinHyperLink::OnPaint()
{
CPaintDC dc(this);
//获取位置
CRect ClientRect;
GetClientRect(&ClientRect);
//绘画背景
dc.FillSolidRect(&ClientRect,m_crBackColor);
//设置 DC
dc.SetBkMode(TRANSPARENT);
if (m_bHovering) dc.SetTextColor(m_SkinAttribute.m_crHoverText);
else if (m_bVisited) dc.SetTextColor(m_SkinAttribute.m_crVisitedText);
else dc.SetTextColor(m_SkinAttribute.m_crNormalText);
//绘画字体
CString strText;
GetWindowText(strText);
LONG dwStyte=GetWindowLong(m_hWnd,GWL_STYLE);
UINT uFormat=DT_VCENTER|DT_SINGLELINE|DT_END_ELLIPSIS;
if (dwStyte&SS_RIGHT) uFormat|=DT_RIGHT;
else if (dwStyte&SS_CENTER) uFormat|=DT_CENTER;
else uFormat|=DT_LEFT;
dc.SelectObject(m_SkinAttribute.m_DefaultFont);
dc.DrawText(strText,&ClientRect,uFormat);
return;
}
//光标消息
BOOL CSkinHyperLink::OnSetCursor(CWnd * pWnd, UINT nHitTest, UINT message)
{
HCURSOR hCursor=LoadCursor(GetModuleHandle(SKIN_CONTROL_DLL_NAME),MAKEINTRESOURCE(IDC_HAND_CUR));
::SetCursor(hCursor);
return TRUE;
}
//单击控件
void CSkinHyperLink::OnStnClicked()
{
//判断状态
if ((m_pIMouseEvent!=NULL)||(m_strURL.IsEmpty())) return;
//打开网页
ShellExecute(NULL,TEXT("open"),m_strURL,NULL,NULL,SW_SHOW);
//重画控件
if (m_bVisited==false)
{
m_bVisited=true;
Invalidate();
}
return;
}
//鼠标移动消息
void CSkinHyperLink::OnMouseMove(UINT nFlags, CPoint point)
{
if (m_bHovering==false)
{
//注册消息
m_bHovering=true;
Invalidate();
TRACKMOUSEEVENT TrackMouseEvent;
TrackMouseEvent.cbSize=sizeof(TrackMouseEvent);
TrackMouseEvent.dwFlags=TME_LEAVE;
TrackMouseEvent.hwndTrack=GetSafeHwnd();
TrackMouseEvent.dwHoverTime=HOVER_DEFAULT;
_TrackMouseEvent(&TrackMouseEvent);
}
__super::OnMouseMove(nFlags, point);
}
//鼠标离开消息
LRESULT CSkinHyperLink::OnMouseLeave(WPARAM wparam, LPARAM lparam)
{
m_bHovering=false;
Invalidate();
return 0;
}
//标题消息
LRESULT CSkinHyperLink::OnSetTextMesage(WPARAM wParam, LPARAM lParam)
{
LRESULT lResult=Default();
if (m_bAutoAdjust) AdjustHyperLink();
return lResult;
}
//设置访问
void CSkinHyperLink::SetVisited(bool bVisited)
{
if (m_bVisited!=bVisited)
{
m_bVisited=bVisited;
if (GetSafeHwnd()) Invalidate();
}
return;
}
//设置下划线
void CSkinHyperLink::SetUnderline(bool bUnderline)
{
if (m_bUnderline!=bUnderline)
{
m_bUnderline=bUnderline;
if (GetSafeHwnd()) Invalidate();
}
return;
}
//设置 URL
void CSkinHyperLink::SetHyperLinkUrl(LPCTSTR pszUrl)
{
//设置变量
m_strURL=pszUrl;
//建立提示
UpdateToolTip();
return;
}
//背景颜色
void CSkinHyperLink::SetBackGroundColor(COLORREF crColor)
{
m_crBackColor=crColor;
if (m_hWnd!=NULL) Invalidate(FALSE);
return;
}
//停靠颜色
void CSkinHyperLink::SetHoverTextColor(COLORREF crColor)
{
m_crHoverTextColor=crColor;
if (m_hWnd!=NULL) Invalidate(FALSE);
return;
}
//访问后颜色
void CSkinHyperLink::SetVisitedTextColor(COLORREF crColor)
{
m_crVisitedTextColor=crColor;
if (m_hWnd!=NULL) Invalidate(FALSE);
return;
}
//正常颜色
void CSkinHyperLink::SetNormalTextColor(COLORREF crColor)
{
m_crNormalTextColor=crColor;
if (m_hWnd!=NULL) Invalidate(FALSE);
return;
}
//设置调整
void CSkinHyperLink::SetAutoAdjust(bool bAutoAdjust)
{
if (m_bAutoAdjust!=bAutoAdjust)
{
m_bAutoAdjust=bAutoAdjust;
if (m_bAutoAdjust) AdjustHyperLink();
}
return;
}
//初始化
void CSkinHyperLink::InitHyperLink()
{
SetWindowLong(m_hWnd,GWL_STYLE,GetStyle()|SS_NOTIFY);
if (m_bAutoAdjust) AdjustHyperLink();
m_crBackColor=m_SkinAttribute.m_crBackColor;
UpdateToolTip();
return;
}
//更新提示
void CSkinHyperLink::UpdateToolTip()
{
if (GetSafeHwnd())
{
if (m_ToolTip.GetSafeHwnd()==NULL) m_ToolTip.Create(this);
if (m_strURL.IsEmpty()==false)
{
CRect ClientRect;
GetClientRect(&ClientRect);
m_ToolTip.Activate(TRUE);
m_ToolTip.AddTool(this,m_strURL,&ClientRect,TOOLTIP_ID);
}
else m_ToolTip.Activate(FALSE);
}
return;
}
//调整位置
void CSkinHyperLink::AdjustHyperLink()
{
//获取标题
CString strText;
GetWindowText(strText);
//获取位置
CRect ControlRect;
GetWindowRect(&ControlRect);
GetParent()->ScreenToClient(&ControlRect);
//计算长度
CDC * pDC=GetDC();
pDC->SelectObject(&m_SkinAttribute.m_DefaultFont);
CSize Size=pDC->GetTextExtent(strText);
ReleaseDC(pDC);
//移动位置
MoveWindow(ControlRect.left,ControlRect.top,Size.cx,Size.cy);
return;
}
//默认回调函数
LRESULT CSkinHyperLink::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
if (m_pIMouseEvent)
{
switch (message)
{
case WM_MOUSELEAVE:
{
UINT uButtonID=GetWindowLong(GetSafeHwnd(),GWL_ID);
m_pIMouseEvent->OnEventMouseLeft(uButtonID,wParam,lParam);
break;
}
case WM_MOUSEMOVE:
{
UINT uButtonID=GetWindowLong(GetSafeHwnd(),GWL_ID);
m_pIMouseEvent->OnEventMouseMove(uButtonID,wParam,lParam);
break;
}
case WM_LBUTTONDOWN:
{
UINT uButtonID=GetWindowLong(GetSafeHwnd(),GWL_ID);
m_pIMouseEvent->OnEventLButtonDown(uButtonID,wParam,lParam);
break;
}
case WM_LBUTTONUP:
{
UINT uButtonID=GetWindowLong(GetSafeHwnd(),GWL_ID);
m_pIMouseEvent->OnEventLButtonUp(uButtonID,wParam,lParam);
break;
}
case WM_RBUTTONDOWN:
{
UINT uButtonID=GetWindowLong(GetSafeHwnd(),GWL_ID);
m_pIMouseEvent->OnEventRButtonDown(uButtonID,wParam,lParam);
break;
}
case WM_RBUTTONUP:
{
UINT uButtonID=GetWindowLong(GetSafeHwnd(),GWL_ID);
m_pIMouseEvent->OnEventRButtonUp(uButtonID,wParam,lParam);
break;
}
}
}
return __super::DefWindowProc(message, wParam, lParam);
}
//////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?