奇怪的问题出现在DrawItem中的内存DC,在线等待

snaill 2003-08-20 07:23:35
为了避免界面上的闪烁,在DrawItem中使用内存DC的方法,结果出现了奇怪的问题:
重画的ListBox竟然只能显示一项!!!???
...全文
48 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Phourm 2003-08-21
  • 打赏
  • 举报
回复
注意到你的CMemDC和真的CDC的坐标问题
在CMemDC里你CreateCompatibleBitmap的大小只有一行大,然后你又对整个CMemDC的区域TEXTOUT,FILLRECT...其实只画了一点点,而你最后还犯了个错误m_pDC->BitBlt(m_rcBounds.left, m_rcBounds.top,m_rcBounds.Width(), m_rcBounds.Height...)
注意这里你认为图的大小是CRect(0,0,m_rcBounds.right,m_rcBounds.bottom)
....
snaill 2003-08-21
  • 打赏
  • 举报
回复
上面是原码,CMemDC是一个自定义的内存DC类,在不使用CMemDC的时候显示没有问题,一添加就玩完,只能显示出一项

CMemDC在别的地方使用也没有什么问题

CMemDC得原码:
void CMemDC::Create(CDC *pDC, const CRect &rcBounds)
{
CreateCompatibleDC(pDC);
m_bitmap = new CBitmap;
m_bitmap->CreateCompatibleBitmap(pDC, rcBounds.Width(), rcBounds.Height());

m_oldbitmap = SelectObject(m_bitmap);
m_pDC = pDC;
m_rcBounds = rcBounds;
}

void CMemDC::Destory()
{
m_pDC->BitBlt(m_rcBounds.left, m_rcBounds.top,
m_rcBounds.Width(), m_rcBounds.Height(),
this,
m_rcBounds.left, m_rcBounds.top,SRCCOPY);
SelectObject(m_oldbitmap);

if (m_bitmap != NULL)
delete m_bitmap;
}
snaill 2003-08-21
  • 打赏
  • 举报
回复
void CFileList::DrawItem(LPDRAWITEMSTRUCT lpdis)
{
// TODO: Add your message handler code here
CDC dcWnd;
CMemDC dc;
CRect rcItem;
CString strText;

rcItem = lpdis->rcItem;
GetText(lpdis->itemID, strText);

dcWnd.Attach(lpdis->hDC);
dc.Create(&dcWnd, rcItem);

if (lpdis->itemAction & ODA_SELECT ||
lpdis->itemAction & ODA_DRAWENTIRE)
{
CBrush brush;
if (lpdis->itemState & ODS_SELECTED ||
lpdis->itemState & ODS_FOCUS)
{
brush.CreateSolidBrush(RGB(49, 106, 197));
dc.FillRect(&rcItem, &brush);
}
else
{
brush.CreateSolidBrush(RGB(255, 255, 255));
dc.FillRect(&rcItem, &brush);
}
}

if (m_hImgList)
{
CPoint pt;

pt.x = rcItem.left + 2;
pt.y = rcItem.top + 2;

LPLISTDATA lpData = (LPLISTDATA)lpdis->itemData;
CImageList imagelist;
IMAGEINFO ii;

imagelist.Attach(m_hImgList);
imagelist.Draw(&dc, lpData->nIcon, pt, ILD_TRANSPARENT);

imagelist.GetImageInfo(lpData->nIcon, &ii);
rcItem.left += 2 + ii.rcImage.right - ii.rcImage.left + 2;
imagelist.Detach();
}

dc.SetBkMode(TRANSPARENT);
dc.DrawText(strText, &rcItem, DT_SINGLELINE | DT_LEFT | DT_VCENTER);
dc.Destory();
dcWnd.Detach();
}
wuxfBrave 2003-08-21
  • 打赏
  • 举报
回复
给出你的源代码看看
snaill 2003-08-21
  • 打赏
  • 举报
回复
有道理,我看看,先谢了
snaill 2003-08-20
  • 打赏
  • 举报
回复
我重载了ListBox得DrawItem,然后在里面使用MemDC
结果就只有一项被显示出来,很奇怪
syscookies 2003-08-20
  • 打赏
  • 举报
回复
不明白你的意思
是不是你重载了DrawItem,不会啊
dawndu 2003-08-20
  • 打赏
  • 举报
回复
具体怎么回事?好好说说

15,979

社区成员

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

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