Click here to Skip to main content
15,881,715 members
Articles / Desktop Programming / MFC
Article

Editable Multi-line ListBox

Rate me:
Please Sign up or sign in to vote.
4.25/5 (19 votes)
25 Mar 2003 131.1K   2.5K   41   14
A ListBox control providing multi-line support.

Screenshot of ListBoxXP

Introduction

If you take a look at the snapshot and run the .exe file you`ll realise that there`s nothing I need to say here. I needed this control with item editing, insertion, deletion, and moving capabilities and I asked, "why not share it with people?"

Using the Code

It`s very easy to use just add a variable based on the class and that`s all. You work with it like a normal listbox.

//
// powered by NetControl.ro
//
// .............
void CListBoxXP::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
{
    CString szBuf="";
    COLORREF col;
    if(((int)lpDrawItemStruct->itemID==edited)&&(IsWindow(hHelper)))
        return;
    {
        GetText(lpDrawItemStruct->itemID,szBuf);
         SetTextColor(lpDrawItemStruct->hDC,RGB(0,0,0));
         RECT r;
         memcpy((void*)&r,&lpDrawItemStruct->rcItem,sizeof(RECT));
         if(itm==(int)lpDrawItemStruct->itemID)
         {
            HBRUSH br;
            br=::CreateSolidBrush(LightenColor(<BR>                GetSysColor(COLOR_HIGHLIGHT),0.9));
            ::FillRect(lpDrawItemStruct->hDC,<BR>                &lpDrawItemStruct-&gt;rcItem,br);
            ::DeleteObject(br);
         }
         else
         {
             FillRect(lpDrawItemStruct-&gt;hDC,<BR>                &lpDrawItemStruct->rcItem,<BR>                (HBRUSH)GetStockObject(WHITE_BRUSH));
         }<BR>
         r.left+=5;
         r.top+=2;
         col=RGB(255,255,255);
         if(lpDrawItemStruct->itemState & ODS_SELECTED)
         {
            col=RGB(220,220,220);
            HBRUSH br;
            br=::CreateSolidBrush(LightenColor(<BR>                GetSysColor(COLOR_HIGHLIGHT),0.75));
            ::FillRect(lpDrawItemStruct->hDC,<BR>                &lpDrawItemStruct->rcItem,br);
            ::DeleteObject(br);
         }
         if(lpDrawItemStruct-&gt;itemState & ODS_FOCUS)
         {
            HBRUSH br;
            br = ::CreateSolidBrush(LightenColor(<BR>                GetSysColor(COLOR_HIGHLIGHT),0.5));
            ::FrameRect(lpDrawItemStruct->hDC,<BR>                &lpDrawItemStruct->rcItem,br);
            ::DeleteObject(br);
         }
         SetBkMode(lpDrawItemStruct->hDC,TRANSPARENT);<BR>
         r.left-=3;
         r.top-=2;
         if(CountLines(szBuf) > 1)
             DrawText(lpDrawItemStruct->hDC,szBuf,<BR>                strlen(szBuf),&r,<BR>                DT_LEFT|DT_TOP|DT_WORDBREAK);
         else
             DrawText(lpDrawItemStruct->hDC,szBuf,<BR>                strlen(szBuf),&r,<BR>                DT_LEFT|DT_VCENTER|DT_SINGLELINE);
    }
}

void CListBoxXP::MeasureItem(LPMEASUREITEMSTRUCT lpMeasureItemStruct) 
{
    HDC hDC;
    TEXTMETRIC tm;
    char szBuf[512]="";
    ::SendMessage(this->m_hWnd, LB_GETTEXT,<BR>        (WPARAM)lpMeasureItemStruct->itemID,(LPARAM)szBuf);<BR>
    hDC = ::GetDC(this->m_hWnd);
    CRect r;
    GetClientRect(r);
    ::GetTextMetrics(hDC, &tm);
    lpMeasureItemStruct->itemHeight=(tm.tmHeight)*CountLines(szBuf);
    ::ReleaseDC(this->m_hWnd, hDC);
}
// ...<BR>

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Web Developer
Romania Romania
I have been programming for the past 6 years in VBasic, Delphi, C, C++ .
I also have extended knowledge of webdesign (HTML, CSS, JavaScript, VBScript), webprogramming (PHP, ASP, ASP.NET (C#)) and database integration (mySql, MSSQL Server).
And when I`m not programming I`m working out or working on some personal projects .
Last but not least I`m looking for a project-based job in programming or webdesign .

Comments and Discussions

 
GeneralGet The edited text in User class Pin
jayart26-Jan-06 2:25
jayart26-Jan-06 2:25 
Hi!
I am using the editable listboxXP class.
I need to save the changes done to the edit box after user clicks a "save" button.
I am using GetText to retreive the edited data from the list box

::onsave()
{
UpdateData(true);
CString strRemarks;
mRemarksListBox.GetText(0, strRemarks);
// save remarks
}

the text still shows the original text and not the updated text. Any idea how to get th edited text in my user class.
Also I have problem with font settings. The text in the editable edit box seems too small. I want to increase the font size.
Please help me.

Thanks and Regards,
Arti Gujare
GeneralIssues with the control with Japanese Windows Pin
cdesylva27-Sep-04 15:57
cdesylva27-Sep-04 15:57 
GeneralRe: Issues with the control with Japanese Windows Pin
cdesylva27-Sep-04 15:58
cdesylva27-Sep-04 15:58 
Generalneed help please Pin
Heex8-Jul-04 10:43
Heex8-Jul-04 10:43 
GeneralRe: need help please Pin
TomKat8-Jul-04 23:07
TomKat8-Jul-04 23:07 
GeneralBug on first addition Pin
Karthik Murugan21-Mar-04 17:15
Karthik Murugan21-Mar-04 17:15 
Generalbug! Pin
AchillesTangYan12-Mar-04 21:44
AchillesTangYan12-Mar-04 21:44 
Generalcan't found CNetControl.dsp Pin
AchillesTangYan12-Mar-04 21:13
AchillesTangYan12-Mar-04 21:13 
GeneralRe: can't found CNetControl.dsp Pin
Manir Uzzaman19-Jul-05 20:48
Manir Uzzaman19-Jul-05 20:48 
Generaldebug assertions Pin
Bjarne Jørgensen4-Jun-03 0:41
Bjarne Jørgensen4-Jun-03 0:41 
QuestionSave and Load data? Pin
chen27-Mar-03 19:42
chen27-Mar-03 19:42 
AnswerRe: Save and Load data? Pin
TomKat28-Mar-03 10:17
TomKat28-Mar-03 10:17 
GeneralNice! Pin
Ernest Laurentin26-Mar-03 16:52
Ernest Laurentin26-Mar-03 16:52 
GeneralCool! Pin
Wayzer26-Mar-03 7:01
Wayzer26-Mar-03 7:01 

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

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