Click here to Skip to main content
Click here to Skip to main content

XListBox - Owner-draw CListBox with selectable text and background colors

, 27 Feb 2008
Rate this:
Please Sign up or sign in to vote.
XListBox is an owner-draw listbox that provides printf-style formatting and selection of text and background colors

Introduction

Listboxes are still useful for many things. I use them frequently when I need to log something. Usually, logging means flagging some exception or unusual event, so it is nice to be able to use colors to draw user's attention to these items.

Here is my CXListBox class. It is very simple to use, and can be used like a CListBox if you wish. Its power lies in its ability to display lines with text and background colors. Currently, the colors are limited to the 16 basic colors, because of the way the colors are stored.

Implementation

Briefly, here is the implementation: the listbox's style is set to ownerdraw fixed and has strings. Each string that is added to listbox is prefixed by two additional characters — one for text color and one for background color. When it is time to display string, CXListBox::DrawItem looks at these two color bytes to determine how to draw line. This approach is far simpler than allocating a memory block and stuffing the pointer using SetItemData(), although the tradeoff is that you are limited to 16 colors.

XListBox Features

The demo project provides a sample app that allows choice of text, text and background colors, and other options:

screenshot

  1. Enter text in edit box and click on Add String.
  2. Text is displayed using combination of 16 text and background colors. XListBox is implemented using same color numbering as CColorPickerCB class — see ColorPickerCB.cpp.
  3. You can optionally write listbox strings to log file. Note that strings are always appended to end of file, even when InsertString() is used.
  4. The Line Number Options dialog allows you to choose whether to display line numbers, and colors for gutter background and line number text:

    screenshot

  5. XListBox offers printf-style formatting combined with text and background color selection.
  6. Optional right-click context menu — using IDR_XLISTBOX popup menu resource — allows for copying/clearing listbox.

How To Use

To integrate XListBox into your own app, you first need to add following files to your project:

  • XListBox.cpp
  • XListBox.h
  • Clipboard.cpp
  • Clipboard.h

IDR_XLISTBOX Popup Menu Resource

IDR_XLISTBOX MENU DISCARDABLE 
BEGIN
    POPUP "XListBox"
    BEGIN
        MENUITEM "&Select All",   ID_EDIT_SELECT_ALL
        MENUITEM "&Copy",         ID_EDIT_COPY
        MENUITEM "C&lear",        ID_EDIT_CLEAR
    END
END

You will also need IDR_XLISTBOX popup menu resource (if you want context menu). You can add popup menu by calling SetContextMenuId() like this:

    m_List.SetContextMenuId(IDR_XLISTBOX);

Next, include header file XListBox.h in dialog's .h file, and create a CXListBox variable (easiest is to let Class WIzard generate a variable for CListBox object, then rename to CXListBox). See XListBoxTestDlg.h for example.

NOTE

The listbox must have styles Owner draw fixed and Has strings.

Here are some examples of how to display text with the CXListBox class, assuming you have variable named m_List:

  • m_List.AddString(_T("This is a sample string"));
    This adds string to listbox with black text on a white background.
  • m_List.AddLine(CXListBox::White, CXListBox::Red, _T("This is a sample string"));
    This adds string to listbox with white text on a red background.
  • m_List.Printf(CXListBox::Blue, CXListBox::White, 0, _T("XListBox Version %d.%d"), nMajor, nMinor);
    This adds string to listbox with blue text on a white background, using printf formatting.

Revision History

Version 1.2 - 2008 February 24

  • Fixed problems using XListBox with VS2005.
  • Added demo project for VS2005.
  • Changed InsertString() to accept colors (defaults to black on white).
  • Changed AddLine(), AddString(), and Printf() to return index of line just added.
  • Added functions GetBackgroundColor(), GetTextColor(), SetBackgroundColor(), and SetTextColor().
  • Added option to display line numbers.
  • Added option to log to file.

Version 1.0 - 2002 March 20

  • Initial public release

Acknowledgments

The XListBox demo uses color picker combobox written by James R. Twine, which may be found here, and the CClipboard class written by David Terracino, which may be found here.

Usage

This software is released into the public domain. You are free to use it in any way you like, except that you may not sell this source code. If you modify it or extend it, please to consider posting new code here for everyone to share. This software is provided "as is" with no expressed or implied warranty. I accept no liability for any damage or loss of business that this software may cause.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

About the Author

Hans Dietrich
Software Developer (Senior) Hans Dietrich Software
United States United States
I attended St. Michael's College of the University of Toronto, with the intention of becoming a priest. A friend in the University's Computer Science Department got me interested in programming, and I have been hooked ever since.
 
Recently, I have moved to Los Angeles where I am doing consulting and development work.
 
For consulting and custom software development, please see www.hdsoft.org.






Comments and Discussions

 
GeneralMy vote of 5 PinmemberDohwan8-Dec-11 15:41 
QuestionC# version? PinmemberJim Turner4-Mar-10 15:09 
AnswerRe: C# version? PinmentorHans Dietrich15-Apr-11 3:30 
GeneralScroll lock when mouseover. Pinmembermensfort4-Dec-09 3:56 
Questionhow can set font,I set font but not have effec Pinmemberituse1-Jul-08 23:32 
AnswerRe: how can set font,I set font but not have effec PinmvpHans Dietrich2-Jul-08 0:02 
QuestionListbox background color in Forms.Net PinmemberJanBorup8-Feb-07 21:08 
AnswerRe: Listbox background color in Forms.Net PinmemberZero2Cool1-Oct-08 4:10 
QuestionCan Any Body Provide the Port for this code to EVC ++3.0 Pinmembernaveenkm8421-Aug-06 22:24 
NewsOk in .NET, minor tweaks PinmemberDanJL23-Nov-05 4:09 
GeneralRe: Ok in .NET, minor tweaks PinmemberHans Dietrich23-Nov-05 5:24 
QuestionHow to get the text color of the listbox item Pinmembero2129-Aug-05 22:44 
QuestionHow2use CXListBox not as CDialog member ? Pinmemberronen_w17-Jul-05 3:05 
GeneralOK... but..! Pinmemberhw7704120-May-05 13:49 
GeneralRe: OK... but..! PinmemberShaojiang2-Jun-05 6:53 
GeneralHandling context menu PinsussAnonymous3-May-05 14:48 
Generalinserting at a specified postion PinsussAnonymous16-Feb-05 19:56 
GeneralRe: inserting at a specified postion PinsussAnonymous17-Feb-05 16:25 
GeneralSubclassing ListBox so as to provide functionality of both single selection and multiple selection list box PinmemberNice Özgürce18-Jan-05 6:49 
GeneralRe: Subclassing ListBox so as to provide functionality of both single selection and multiple selection list box PinmemberHans Dietrich18-Jan-05 7:39 
GeneralRe: Subclassing ListBox so as to provide functionality of both single selection and multiple selection list box PinmemberNice Özgürce18-Jan-05 13:08 
GeneralRe: Subclassing ListBox so as to provide functionality of both single selection and multiple selection list box PinmemberHans Dietrich18-Jan-05 13:41 
GeneralRe: Subclassing ListBox so as to provide functionality of both single selection and multiple selection list box PinmemberNice Özgürce18-Jan-05 20:38 
GeneralRe: Subclassing ListBox so as to provide functionality of both single selection and multiple selection list box PinmemberNice Özgürce26-Jan-05 23:25 
GeneralListbox not updated PinmemberDarthVeda16-Jun-04 2:29 
GeneralRe: Listbox not updated PinmemberHans Dietrich16-Jun-04 3:26 
GeneralRe: Listbox not updated PinmemberDarthVeda16-Jun-04 4:09 
GeneralRe: Listbox not updated PinmemberHans Dietrich16-Jun-04 11:43 
GeneralRe: Listbox not updated PinmemberDarthVeda16-Jun-04 20:31 
GeneralRe: Listbox not updated PinmemberHans Dietrich16-Jun-04 22:46 
GeneralRe: Listbox not updated PinmemberDarthVeda17-Jun-04 0:46 
GeneralASSERT in Winhand.cpp line: 229 Pinsussmbeutner30-Apr-04 4:57 
GeneralRe: ASSERT in Winhand.cpp line: 229 PinmemberHans Dietrich30-Apr-04 5:25 
GeneralRe: ASSERT in Winhand.cpp line: 229 PinsussJesse Chisholm4-Aug-04 20:29 
QuestionWhy add IDR_XLISTBOX popup menu? Pinmemberbtorrey14-Jan-04 14:50 
AnswerRe: Why add IDR_XLISTBOX popup menu? PinmemberHans Dietrich15-Jan-04 0:37 
GeneralAbout time PinmemberShay Harel21-Jul-03 8:28 
GeneralThank you very much Pinmembercpf2-Jun-03 17:38 
GeneralSetitemimage PinmemberAlex Evans30-Dec-03 13:14 
GeneralDoes not work on Doc/View project !!! Pinmemberkortebi24-Apr-02 1:33 
GeneralRe: Does not work on Doc/View project !!! Pinmemberkortebi24-Apr-02 1:56 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

| Advertise | Privacy | Mobile
Web03 | 2.8.140721.1 | Last Updated 27 Feb 2008
Article Copyright 2002 by Hans Dietrich
Everything else Copyright © CodeProject, 1999-2014
Terms of Service
Layout: fixed | fluid