重绘listbox遇到个问题向大家请教

luckywll 2012-01-13 09:01:33

void CMyListBox::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct)
{
// TODO: 添加您的代码以绘制指定项
COLORREF clrItemText;
LPDRAWITEMSTRUCT lpDIS = lpDrawItemStruct;
switch ( lpDIS->itemAction ) //lpDIS为一个LPMEASUREITEMSTRUCT(记录控件信息)
{
case ODA_SELECT:
case ODA_DRAWENTIRE:
// Is the item selected?
if ( lpDIS->itemState & ODS_SELECTED )
{
clrItemText = GetSysColor( COLOR_HIGHLIGHTTEXT );
// Clear the rectangle
FillRect( lpDIS->hDC, &lpDIS->rcItem, (HBRUSH)(COLOR_ACTIVECAPTION+1) );
}
else
{
clrItemText = GetSysColor( COLOR_WINDOWTEXT );
// Clear the rectangle
FillRect( lpDIS->hDC, &lpDIS->rcItem, (HBRUSH)(COLOR_WINDOW+1) );
}
}

CDC dc;
dc.Attach(lpDIS->hDC);
CRect rectFull = lpDIS->rcItem;
CRect rectName = rectFull;
rectName.left = rectFull.left + 60;
rectName.bottom = rectName.top + 30;
rectName.right = rectFull.Width() - 1;
CRect rectImage = rectFull;
rectImage.top = rectFull.top + 5;
rectImage.left = rectFull.left +5;
rectImage.bottom = rectFull.bottom -5;
rectImage.right = rectImage.left +50;
CRect rectID = rectFull;
rectID.left = rectFull.left + 60;
rectID.top = rectFull.top + 30;

UINT nIndex = lpDIS->itemID;
LPITEMDATA pItemData = (LPITEMDATA)GetItemDataPtr(nIndex);
if (nIndex != (UINT) -1)
{
if(-1 != pItemData->nImage )
{
HICON hIco = m_ImageList.ExtractIcon(pItemData->nImage);
DrawIcon(dc,rectImage.left,rectImage.top,hIco);
}

LOGFONT lf;
dc.GetCurrentFont()->GetLogFont(&lf);
CFont fontUser, fontID, *pOldFont;
//lf.lfCharSet = SHIFTJIS_CHARSET;
//lstrcpy(lf.lfFaceName,_T("MS Mincho"));

lf.lfHeight=25;
lf.lfWidth=0;
fontUser.CreateFontIndirect(&lf);
pOldFont=dc.SelectObject(&fontUser);
dc.SetBkMode(TRANSPARENT);
dc.SetTextColor(pItemData->crTextColor);
dc.DrawText(pItemData->cstrUserName,CRect(rectName.left+3,rectName.top+3, rectName.right-3,rectName.bottom+3), DT_LEFT | DT_SINGLELINE);

lf.lfHeight=20;
lf.lfWidth=0;
fontID.CreateFontIndirect(&lf);
dc.SelectObject(&fontID);
dc.SetBkMode(TRANSPARENT);
dc.SetTextColor(pItemData->crTextColor);
dc.DrawText(pItemData->cstrUserID,CRect(rectID.left+3,rectID.top+3, rectID.right-3,rectID.bottom+3), DT_LEFT | DT_SINGLELINE);

dc.SelectObject(pOldFont);
}
dc.Detach();
}


问题1:拉伸图标大小,将绘图代码改成
IMAGEINFO info;
m_ImageList.GetImageInfo(pItemData->nImage,&info);
CDC memdc;
memdc.CreateCompatibleDC(&dc);
HICON hIco = m_ImageList.ExtractIcon(pItemData->nImage);
DrawIcon(memdc,0,0,hIco);
dc.StretchBlt(rectImage.left,rectImage.top,rectImage.Width(),rectImage.Height(),&memdc,
0,0,info.rcImage.right-info.rcImage.left, info.rcImage.bottom-info.rcImage.top,SRCCOPY);

图标就显示不出来了,不知道什么原因

问题2:选中的item上文字会有背景,并且拉动scrollbar会导致颜色越来越深,如果是黑色的字,最终会被覆盖,刷新就好了。
...全文
79 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
luckywll 2012-01-13
  • 打赏
  • 举报
回复
dc.StretchBlt(rectImage.left,rectImage.top,rectImage.Width(),rectImage.Height(),&dc,
0,0,info.rcImage.right-info.rcImage.left, info.rcImage.bottom-info.rcImage.top,SRCCOPY);

就能够画出来,但是这样肯定会出现重叠,说明可以画图,memdc有问题,
第二个问题现在出不来了,代码也没动啊。

lgstudyvc 2012-01-13
  • 打赏
  • 举报
回复
dc.StretchBlt看各rect的位置对不

2 绘完后刷新下,Invalidate什么的
luckywll 2012-01-13
  • 打赏
  • 举报
回复
问题2,如果只绘制一行文字,就不会出现背景了,可是就是需要两行

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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