MFC 设置CListBox各行的字体、样式、颜色、行间距,并自动显示隐藏水平滚动条

文章介绍了如何通过派生CListBox控件并修改其样式,以支持字体大小、样式、间距的设置,以及实现水平滚动条的自动显示隐藏。通过定义_itemStyle结构体来存储每一项的样式信息,并重写PreCreateWindow、MeasureItem、DrawItem等函数,实现了对控件的深度定制。
使用MFC进行软件开发时,控件的显示效果往往不能尽如人意,需要对控件进行修改。如CListBox控件,无法对字体样式大小、间距进行设置,且水平滚动条也无法根据内容长度实现自动的显示隐藏。
为满足上述需求,需要对CListBox控件进行派生修改,增加相应功能。

定义各行样式的结构体_itemStyle,并创建私有向量存放各项的样式结构体


#define	FONTSTYLE_NORMAL 0x00000000				//普通
#define	FONTSTYLE_BOLD 0x00000001				//字体加粗
#define	FONTSTYLE_ITALIC 0x00000002				//斜体
#define FONTSTYLE_SPESICLFONT 0x00000004		//设定字体
#define FONTSTYLE_RESIZE 0x00000008				//设定字体大小

typedef struct _itemStyle
{
   
   
	int isItemWidth;  					//行宽
	int isItemHeight;					//行高
	BYTE isCharSet;						//字体集 默认134
	TCHAR isFontName[256];				//字体名称
	int isFontStyle;					//样式标志包括 Normal、Bold、Italic、自定义字体、设置字体大小
	int isFontSize;						//字体大小
	COLORREF isColorHighLightBK;		//高亮毕竟色
	COLORREF isColorBK;					//背景色
	COLORREF isColorHighLightText;		//高亮字体颜色
	COLORREF isColorText;				//字体颜色
	bool isFlagSolidSpacing;			//是否固定行间距
	int isSolidSpacing;					//固定间距值
	float isSpacingInProportionToFont;	//间距与字体高度的比例,用于非固定间距模式

	_itemStyle() :						//构造函数,初始化
		isFontStyle(0),
		isCharSet(0),
		isFontSize(0),
		isColorHighLightBK(COLOR_HIGHLIGHT),
		isColorBK(COLOR_WINDOW),
		isColorHighLightText(COLOR_HIGHLIGHTTEXT),
		isColorText(COLOR_WINDOWTEXT),
		isFlagSolidSpacing(false),
		isSolidSpacing(20),
		isSpacingInProportionToFont(1.0)
	{
   
   
		memset(isFontName, 0, sizeof(TCHAR) * 256);
	};
	
	//定义结构体的小于操作符,用户后续计算最大值
	bool operator < (_itemStyle &b) {
   
    return isItemWidth < b.isItemWidth; }
}RICHLISTBOXITEMSTYLESTRUCT;
...
private:
	std::vector<RICHLISTBOXITEMSTYLESTRUCT> m_vecItemStyle;
...

设置CListBox的ExtentStyle

在PreCreateWindow函数中设置CListBox的一些ExtentStyle:
禁止LBS_SORT、 LBS_OWNERDRAWFIXED
设置LBS_OWNERDRAWVARIABLE和LBS_NOINTEGRALHEIGH

cs.style &= ~(LBS_SORT | LBS_OWNERDRAWFIXED);
cs.style |= LBS_OWNERDRAWVARIABLE;
cs.style |= LBS_NOINTEGRALHEIGHT;

或使用.SubclassWindow函数直接集成放置在Dialog中的CListBox控件的Style设置。

重写MeatureItem、DrawItem虚函数

CListBox绘制行的流程是在调用DrawItem前,先调用MeatureItem对Item的大小进行计算,因此在MeatureItem中需要获得实现各种字体、间距设置后Item的高度。需要根据_itemStyle结构体中样式标志位isFontStyle分情况计算。使用CDC::GetTextExtent(LPCTSTR)或GetTextExtentPoint32(HDC, LPCTSTR, UINT, SIZE)函数获得文字的大小。

		LPCTSTR lpszText = (LPCTSTR)lpMeasureItemStruct->itemData;
		ASSERT(lpszText != NULL
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值