在开发应用程序时,经常需要记录日志或者显示一些异常信息。为了吸引用户的注意力,使用颜色来标记这些信息是一种有效的方法。本文将介绍一个自定义的颜色列表框控件CXListBox,它允许开发者以不同的文本和背景颜色显示列表项。
CXListBox控件的实现相当简单,可以像使用标准的CListBox控件一样使用它。它的强大之处在于能够显示具有文本和背景颜色的行。目前,颜色限制在16种基本颜色,这是由于颜色存储方式的限制。
具体实现方式是将列表框的样式设置为“ownerdraw fixed”和“has strings”。每个添加到列表框的字符串都会在前面添加两个额外的字符——一个用于文本颜色,一个用于背景颜色。当需要显示字符串时,CXListBox::DrawItem会查看这两个颜色字节来确定如何绘制行。这种方法比分配内存块并使用SetItemData()方法要简单得多,尽管这样做的折衷是颜色限制在16种。
演示项目提供了一个示例应用程序,允许选择文本、文本和背景颜色以及其他选项:
要将CXListBox集成到自己的应用程序中,首先需要将以下文件添加到项目中:
如果想要上下文菜单,还需要IDR_XLISTBOX弹出菜单资源。可以通过调用SetContextMenuId()方法来添加弹出菜单,如下所示:
m_List.SetContextMenuId(IDR_XLISTBOX);
接下来,在对话框的.h文件中包含头文件XListBox.h,并创建一个CXListBox变量(最简单的方法是让Class Wizard为CListBox对象生成一个变量,然后重命名为CXListBox)。
注意,列表框必须具有“Owner draw fixed”和“Has strings”的样式。以下是一些使用CXListBox类的示例,假设有一个名为m_List的变量:
m_List.AddString(_T("This is a sample string"));
这将在列表框中添加一个字符串,文本颜色为黑色,背景颜色为白色。
m_List.AddLine(CXListBox::White, CXListBox::Red, _T("This is a sample string"));
这将在列表框中添加一个字符串,文本颜色为白色,背景颜色为红色。
m_List.Printf(CXListBox::Blue, CXListBox::White, 0, _T("XListBox Version %d.%d"), nMajor, nMinor);
这将在列表框中添加一个字符串,文本颜色为蓝色,背景颜色为白色,使用printf格式化。