[MFC] ListBox

pragma once

// ListBox

class ListBox : public CListBox
{
DECLARE_DYNAMIC(ListBox)

public:
ListBox();
virtual ~ListBox();

protected:
DECLARE_MESSAGE_MAP()

public:
void ResetContent();
int AddString(LPCTSTR lpszItem);
int InsertString(int nIndex, LPCTSTR lpszItem);
int DeleteString(UINT nIndex);

protected:
int maxWidth; // 最大宽度
};

// ListBox.cpp: 实现文件
//

include "pch.h"

include "util/ListBox.h"

// ListBox

IMPLEMENT_DYNAMIC(ListBox, CListBox)

ListBox::ListBox()
{
maxWidth = 0;
}

ListBox::~ListBox()
{
}

BEGIN_MESSAGE_MAP(ListBox, CListBox)
END_MESSAGE_MAP()

// ListBox 消息处理程序

void ListBox::ResetContent()
{
CListBox::ResetContent();

maxWidth = 0;
SetHorizontalExtent(0);

}

int ListBox::AddString(LPCTSTR lpszItem)
{
int nRet = CListBox::AddString(lpszItem);

// 获取垂直滚动条得信息
SCROLLINFO   scrollInfo;
memset(&scrollInfo, 0, sizeof(SCROLLINFO));
scrollInfo.cbSize = sizeof(SCROLLINFO);
scrollInfo.fMask = SIF_ALL;
GetScrollInfo(SB_VERT, &scrollInfo, SIF_ALL);

int   nScrollWidth = 0;                                             // 垂直滚动条得宽度
if ((GetCount() > 1) && ((int)scrollInfo.nMax >= (int)scrollInfo.nPage))
{
    nScrollWidth = GetSystemMetrics(SM_CXVSCROLL);
}

SIZE        sSize;
CClientDC   myDC(this);

CFont* pListBoxFont = GetFont();
if (pListBoxFont != NULL)
{
    CFont* pOldFont = myDC.SelectObject(pListBoxFont);
    GetTextExtentPoint32(myDC.m_hDC, lpszItem, wcslen(lpszItem), &sSize);
    maxWidth = max(maxWidth, (int)sSize.cx);
    SetHorizontalExtent(maxWidth + 3);
    myDC.SelectObject(pOldFont);
}

return   nRet;

}

int ListBox::InsertString(int nIndex, LPCTSTR lpszItem)
{
int nRet = CListBox::InsertString(nIndex, lpszItem);

// 获取垂直滚动条得信息
SCROLLINFO   scrollInfo;
memset(&scrollInfo, 0, sizeof(SCROLLINFO));
scrollInfo.cbSize = sizeof(SCROLLINFO);
scrollInfo.fMask = SIF_ALL;
GetScrollInfo(SB_VERT, &scrollInfo, SIF_ALL);

int   nScrollWidth = 0;                                             // 垂直滚动条得宽度
if ((GetCount() > 1) && ((int)scrollInfo.nMax >= (int)scrollInfo.nPage))
{
    nScrollWidth = GetSystemMetrics(SM_CXVSCROLL);
}

SIZE        sSize;
CClientDC   myDC(this);

CFont* pListBoxFont = GetFont();
if (pListBoxFont != NULL)
{
    CFont* pOldFont = myDC.SelectObject(pListBoxFont);
    GetTextExtentPoint32(myDC.m_hDC, lpszItem, wcslen(lpszItem), &sSize);
    maxWidth = max(maxWidth, (int)sSize.cx);
    SetHorizontalExtent(maxWidth + 3);
    myDC.SelectObject(pOldFont);
}

return   nRet;

}

int ListBox::DeleteString(UINT nIndex)
{
RECT lRect;
GetWindowRect(&lRect);

int   nRet = CListBox::DeleteString(nIndex);

int   nBoxWidth = lRect.right - lRect.left;
maxWidth = nBoxWidth;

SIZE        sSize;
CClientDC   myDC(this);
CFont*      pListBoxFont    = GetFont();
CFont*      pOldFont        = myDC.SelectObject(pListBoxFont);
wchar_t     szEntry[2048];

for (int i = 0; i < GetCount(); i++)
{
    GetText(i, szEntry);
    GetTextExtentPoint32(myDC.m_hDC, szEntry, wcslen(szEntry), &sSize);
    maxWidth = max(maxWidth, (int)sSize.cx);
}
myDC.SelectObject(pOldFont);

if (maxWidth > nBoxWidth)   //   显示水平滚动条
{
    ShowScrollBar(SB_HORZ, TRUE);
    SetHorizontalExtent(maxWidth + 3);
}
else
{
    ShowScrollBar(SB_HORZ, FALSE);
}
return   nRet;

}

posted @ 2020-04-09 12:24  wxxujian  阅读(68)  评论(0)    收藏  举报