使用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

文章介绍了如何通过派生CListBox控件并修改其样式,以支持字体大小、样式、间距的设置,以及实现水平滚动条的自动显示隐藏。通过定义_itemStyle结构体来存储每一项的样式信息,并重写PreCreateWindow、MeasureItem、DrawItem等函数,实现了对控件的深度定制。
最低0.47元/天 解锁文章
869

被折叠的 条评论
为什么被折叠?



