ListBox控件-高亮显示一个条目<48小时结贴>

极深研几 2004-07-06 09:43:52
通常单击一个列表框控件,如果鼠标下有条目,则高亮显示为选中状态。
某些时候,我希望能独立控制搞亮显示,比如,程序运行到当前条目(播放列表)。
可以采用发送单击消息,设置相应参数。求其他思路!!
...全文
526 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
极深研几 2004-07-07
  • 打赏
  • 举报
回复
谢谢,很详细,结贴了!
sohou 2004-07-06
  • 打赏
  • 举报
回复
先让你的LIST得到焦点,再设置SetSel(int indext);就可以了,用我上面的那个派生类还可以带不同的彩色的哦
sohou 2004-07-06
  • 打赏
  • 举报
回复
还带彩的了
sohou 2004-07-06
  • 打赏
  • 举报
回复
自画,自画
#include "stdafx.h"
#include "ColorLB.h"
#include "ColorListBox.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CColorListBox

CColorListBox::CColorListBox()
{
m_cyText = 0;
}

CColorListBox::~CColorListBox()
{
}


BEGIN_MESSAGE_MAP(CColorListBox, CListBox)
//{{AFX_MSG_MAP(CColorListBox)
ON_WM_CREATE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()

int CColorListBox::AddStringColor(LPCTSTR pstrString, COLORREF rgb)
{
int nRet = AddString(pstrString);
if (nRet != LB_ERR)
SetItemData(nRet, rgb);

return nRet;
}


//SAMPLE: most of this code is stolen from MFC's own CCheckListBox
// implementation. The code is slightly changed so it doesn't draw
// checkboxes and instead uses the item data to indicate a foreground
// color for the item. Note that I didn't take the step of setting up
// an extra item structure--so the item data for each item isn't usable
// for other purposes than the color information.

/////////////////////////////////////////////////////////////////////////////
// CColorListBox message handlers

void CColorListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// You must override DrawItem and MeasureItem for LBS_OWNERDRAWVARIABLE
ASSERT((GetStyle() & (LBS_OWNERDRAWFIXED | LBS_HASSTRINGS)) ==
(LBS_OWNERDRAWFIXED | LBS_HASSTRINGS));

CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);

if (((LONG)(lpDrawItemStruct->itemID) >= 0) &&
(lpDrawItemStruct->itemAction & (ODA_DRAWENTIRE | ODA_SELECT)))
{
int cyItem = GetItemHeight(lpDrawItemStruct->itemID);
BOOL fDisabled = !IsWindowEnabled();

COLORREF colorUser = (COLORREF) GetItemData(lpDrawItemStruct->itemID);

COLORREF newTextColor = fDisabled ? RGB(0x80, 0x80, 0x80) : colorUser;
COLORREF oldTextColor = pDC->SetTextColor(newTextColor);

COLORREF newBkColor = GetSysColor(COLOR_WINDOW);
COLORREF oldBkColor = pDC->SetBkColor(newBkColor);

if (newTextColor == newBkColor)
newTextColor = RGB(0xC0, 0xC0, 0xC0); // dark gray

if (!fDisabled && ((lpDrawItemStruct->itemState & ODS_SELECTED) != 0))
{
pDC->SetTextColor(GetSysColor(COLOR_HIGHLIGHTTEXT));
pDC->SetBkColor(GetSysColor(COLOR_HIGHLIGHT));
}

if (m_cyText == 0)
VERIFY(cyItem >= CalcMinimumItemHeight());

CString strText;
GetText(lpDrawItemStruct->itemID, strText);

pDC->ExtTextOut(lpDrawItemStruct->rcItem.left,
lpDrawItemStruct->rcItem.top + max(0, (cyItem - m_cyText) / 2),
ETO_OPAQUE, &(lpDrawItemStruct->rcItem), strText, strText.GetLength(), NULL);

pDC->SetTextColor(oldTextColor);
pDC->SetBkColor(oldBkColor);
}

if ((lpDrawItemStruct->itemAction & ODA_FOCUS) != 0)
pDC->DrawFocusRect(&(lpDrawItemStruct->rcItem));
}

void CCheckListBox::MeasureItem(LPMEASUREITEMSTRUCT)
{
// You must override DrawItem and MeasureItem for LBS_OWNERDRAWVARIABLE
ASSERT((GetStyle() & (LBS_OWNERDRAWFIXED | LBS_HASSTRINGS)) ==
(LBS_OWNERDRAWFIXED | LBS_HASSTRINGS));
}

/*
void CCheckListBox::PreDrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
_AFX_CHECKLIST_STATE* pChecklistState = _afxChecklistState;

DRAWITEMSTRUCT drawItem;
memcpy(&drawItem, lpDrawItemStruct, sizeof(DRAWITEMSTRUCT));

if ((((LONG)drawItem.itemID) >= 0) &&
((drawItem.itemAction & (ODA_DRAWENTIRE | ODA_SELECT)) != 0))
{
int cyItem = GetItemHeight(drawItem.itemID);

CDC* pDC = CDC::FromHandle(drawItem.hDC);

COLORREF newBkColor = GetSysColor(COLOR_WINDOW);

BOOL fDisabled = !IsWindowEnabled() || !IsEnabled(drawItem.itemID);
if ((drawItem.itemState & ODS_SELECTED) && !fDisabled)
newBkColor = GetSysColor(COLOR_HIGHLIGHT);

COLORREF oldBkColor = pDC->SetBkColor(newBkColor);

CDC bitmapDC;
if (bitmapDC.CreateCompatibleDC(pDC))
{
int nCheck = GetCheck(drawItem.itemID);
HBITMAP hOldBitmap = (HBITMAP)::SelectObject(bitmapDC.m_hDC, pChecklistState->m_hbitmapCheck);

CRect rectCheck = drawItem.rcItem;
rectCheck.left += 1;
rectCheck.top += 1 + max(0, (cyItem - pChecklistState->m_sizeCheck.cy) / 2);
rectCheck.right = rectCheck.left + pChecklistState->m_sizeCheck.cx;
rectCheck.bottom = rectCheck.top + pChecklistState->m_sizeCheck.cy;

CRect rectItem = drawItem.rcItem;
rectItem.right = rectItem.left + pChecklistState->m_sizeCheck.cx + 2;

CRect rectCheckBox = OnGetCheckPosition(rectItem, rectCheck);

ASSERT(rectCheck.IntersectRect(rectItem, rectCheckBox));
ASSERT((rectCheck == rectCheckBox) && (rectCheckBox.Size() == pChecklistState->m_sizeCheck));

CBrush brush(newBkColor);
pDC->FillRect(rectItem, &brush);

pDC->BitBlt(rectCheckBox.left, rectCheckBox.top,
pChecklistState->m_sizeCheck.cx, pChecklistState->m_sizeCheck.cy, &bitmapDC,
pChecklistState->m_sizeCheck.cx * nCheck, 0, SRCCOPY);

::SelectObject(bitmapDC.m_hDC, hOldBitmap);
}
pDC->SetBkColor(oldBkColor);
}

if (drawItem.itemData != 0 && drawItem.itemData != LB_ERR)
{
AFX_CHECK_DATA* pState = (AFX_CHECK_DATA*)drawItem.itemData;
drawItem.itemData = pState->m_dwUserData;
}
drawItem.rcItem.left = drawItem.rcItem.left + pChecklistState->m_sizeCheck.cx + 2;

DrawItem(&drawItem);
}

*/

int CColorListBox::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CListBox::OnCreate(lpCreateStruct) == -1)
return -1;

//SAMPLE: measure the height of each row



CClientDC dc(this);
CFont* pOldFont = dc.SelectObject(GetFont());
TEXTMETRIC tm;
VERIFY (dc.GetTextMetrics ( &tm ));
dc.SelectObject(pOldFont);

m_cyText = tm.tmHeight;

return 0;
}


#ifdef _DEBUG
void CColorListBox::PreSubclassWindow()
{
CListBox::PreSubclassWindow();

//SAMPLE: CColorListBoxes must be owner drawn. If this assertion
// trips, you haven't added LBS_OWNERDRAWFIXED and LBS_HASSTRINGS
// to the style of the control you're trying to subclass.

DWORD dwStyle = LBS_OWNERDRAWFIXED | LBS_HASSTRINGS;

ASSERT((GetStyle() & dwStyle) == dwStyle );
}
#endif


int CColorListBox::CompareItem(LPCOMPAREITEMSTRUCT lpCompareItemStruct)
{
return 0;
}


int CColorListBox::CalcMinimumItemHeight()
{
CClientDC dc(this);
CFont* pOldFont = dc.SelectObject(GetFont());
TEXTMETRIC tm;
VERIFY (dc.GetTextMetrics ( &tm ));
dc.SelectObject(pOldFont);

m_cyText = tm.tmHeight;
return m_cyText;
}
lixiaosan 2004-07-06
  • 打赏
  • 举报
回复
m_listbox.SetCurSel(0);
jink 2004-07-06
  • 打赏
  • 举报
回复
SetCurSel
cxmcqu2000 2004-07-06
  • 打赏
  • 举报
回复
好象是CListBox::SetCurItem( int );看一下msdn吧
极深研几 2004-07-06
  • 打赏
  • 举报
回复
我问的是CListBox 不是CListCtrl。
麻烦各位大虾,帮忙看看!
crescendo 2004-07-06
  • 打赏
  • 举报
回复
CListCtrl::SetHotItem(int iIndex)
iIndex是你现在播放的条目

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧