[WTL/ATL]_[初級]_[設置超鏈接字體顏色]

場景

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也有說明. 裏面用到一個結構體LITEMstate的值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

參考

create-syslink-controls

change-color-of-syslink-control

syslink-overview

ns-commctrl-litem

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章