重绘listbox遇到个有关问题向大家请问
重绘listbox遇到个问题向大家请教
问题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会导致颜色越来越深,如果是黑色的字,最终会被覆盖,刷新就好了。
------解决方案--------------------
dc.StretchBlt看各rect的位置对不
2 绘完后刷新下,Invalidate什么的
- C/C++ code
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会导致颜色越来越深,如果是黑色的字,最终会被覆盖,刷新就好了。
------解决方案--------------------
dc.StretchBlt看各rect的位置对不
2 绘完后刷新下,Invalidate什么的