場景
1.在開發WTL(Win32)
程序時,超鏈接控件是很常見的,比如需要跳轉網頁或者打開本地文件夾等,都需要用到。Win32
本身就有提供系統自帶的WC_LINK
控件,而我們用WTL
有相應的封裝類CLinkCtrl
<atlctrls.h>.
2.有時需要根據界面的顏色主題需要修改超鏈接的顏色以適配界面。但是CLinkCtrl
並沒有提供修改字體顏色的方法, 而微軟的MSDN
裏對Link
也沒有相應修改顏色的例子或說明. 如何做?
說明
1.一般情況下我們知道修改系統控件的字體顏色都是通過響應WM_CTLCOLORSTATIC
,WM_CTLCOLOREDIT
,WM_CTLCOLORBTN
等相關消息來修改。超鏈接控件也是一樣的,需要響應WM_CTLCOLORSTATIC
並修改如下:
BEGIN_MSG_MAP 裏添加
MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnCtlColor)
OnCtlColor 實現增加.
SetBkMode(hDC,TRANSPARENT);
SetTextColor(hDC,RGB(255,0,0));
return (LRESULT)AtlGetStockBrush(HOLLOW_BRUSH);
但是不生效,咋辦?如果我們有時間和耐心看完官方的SysLink
裏的Link Attributes
也有說明. 裏面用到一個結構體LITEM
的state
的值LIS_DEFAULTCOLORS
,原來SysLink
的默認顏色是不能改的,需要通過設置LIS_DEFAULTCOLORS
來啓用顏色可修改, 那就好辦了。只要通過在創建SysLink
之後設置LIS_DEFAULTCOLORS
啓用顏色可修改。我們的OnCtlColor
裏的更改字體顏色就會生效.
LITEM item = { 0 };
item.iLink = 0;
item.mask = LIF_ITEMINDEX | LIF_STATE;
item.state = LIS_DEFAULTCOLORS; // 修改默認超鏈接顏色需要vista以上系統才支持.
item.stateMask = LIS_DEFAULTCOLORS;
SendMessage(link_support_, LM_SETITEM, 0, (LPARAM)&item);
代碼
View.h
// View.h : interface of the CView class
//
/////////////////////////////////////////////////////////////////////////////
#pragma once
enum
{
kMyDeviceLinkSupportId = WM_USER+1
};
class CView : public CWindowImpl<CView>
{
public:
DECLARE_WND_CLASS(NULL)
BOOL PreTranslateMessage(MSG* pMsg);
BEGIN_MSG_MAP_EX(CView)
MSG_WM_CREATE(OnCreate)
MESSAGE_HANDLER(WM_CTLCOLORSTATIC, OnCtlColor)
MESSAGE_HANDLER(WM_PAINT, OnPaint)
END_MSG_MAP()
// Handler prototypes (uncomment arguments if needed):
// LRESULT MessageHandler(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
// LRESULT CommandHandler(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
// LRESULT NotifyHandler(int /*idCtrl*/, LPNMHDR /*pnmh*/, BOOL& /*bHandled*/)
LRESULT OnPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
int OnCreate(LPCREATESTRUCT lpCreateStruct);
LRESULT OnCtlColor(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
private:
CLinkCtrl link_support_;
CFont font_16_normal_;
};
View.cpp
// View.cpp : implementation of the CView class
//
/////////////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "resource.h"
#include "View.h"
#include <CommCtrl.h>
#include <string>
#include <atlmisc.h>
BOOL CView::PreTranslateMessage(MSG* pMsg)
{
pMsg;
return FALSE;
}
LRESULT CView::OnPaint(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
CPaintDC dc(m_hWnd);
//TODO: Add your drawing code here
return 0;
}
static HFONT CreateFont(int pixel,bool bold,const wchar_t* font_name)
{
LOGFONT lf;
memset(&lf, 0, sizeof(LOGFONT)); // zero out structure
lf.lfHeight = pixel; // request a 8-pixel-height font
if(bold)
{
lf.lfWeight = FW_BOLD;
}
lstrcpy(lf.lfFaceName, font_name); // request a face name "Arial"
HFONT font = ::CreateFontIndirect(&lf);
return font;
}
LRESULT CView::OnCtlColor(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
HDC hDC = (HDC)wParam;
HWND hWnd = (HWND)lParam;
if(hWnd == link_support_){
SetBkMode(hDC,TRANSPARENT);
SetTextColor(hDC,RGB(255,0,0));
return (LRESULT)AtlGetStockBrush(HOLLOW_BRUSH);
}
return 0;
}
int CView::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
LITEM item = { 0 };
item.iLink = 0;
item.mask = LIF_ITEMINDEX | LIF_STATE;
item.state = LIS_DEFAULTCOLORS; // 修改默認超鏈接顏色需要vista以上系統才支持.
item.stateMask = LIS_DEFAULTCOLORS;
std::wstring text_link_connectfail;
text_link_connectfail.append(L"hello <A HREF=\"https://infoworld.blog.csdn.net\">tobey</A>, "
L"good good study,<A HREF=\"https://infoworld.blog.csdn.net\">day day up</A>.");
font_16_normal_ = CreateFont(16,false,L"Arial");
link_support_.Create(m_hWnd,NULL,text_link_connectfail.c_str(),
WS_CHILD |WS_VISIBLE| WS_CLIPCHILDREN,0,kMyDeviceLinkSupportId);
link_support_.SetFont(font_16_normal_);
CSize size;
link_support_.GetIdealSize(size);
int rc = link_support_.SetWindowPos(NULL,100, 100, size.cx, size.cy,
(SWP_NOZORDER | SWP_NOREPOSITION | SWP_NOACTIVATE));
SendMessage(link_support_, LM_SETITEM, 0, (LPARAM)&item);
item.iLink = 1;
SendMessage(link_support_, LM_SETITEM, 0, (LPARAM)&item);
return 0;
}
圖1:
項目
https://download.csdn.net/download/infoworld/12062541