社区
界面
帖子详情
奇怪的问题出现在DrawItem中的内存DC,在线等待
snaill
2003-08-20 07:23:35
为了避免界面上的闪烁,在DrawItem中使用内存DC的方法,结果出现了奇怪的问题:
重画的ListBox竟然只能显示一项!!!???
...全文
49
8
打赏
收藏
奇怪的问题出现在DrawItem中的内存DC,在线等待
为了避免界面上的闪烁,在DrawItem中使用内存DC的方法,结果出现了奇怪的问题: 重画的ListBox竟然只能显示一项!!!???
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
具体怎么回事?好好说说
菜单自绘方面的知识
1要实现漂亮的界面菜单,必须要启动菜单项的自绘功能,所谓菜单的自绘,就是让菜单自己管理自己的显示效果,为此,首先要作的就是设置菜单项的风格为MF_OWNER
DRAW
(自绘制),设置菜单的自绘功能即可以通过CMenu类的AppendMenu()函数在菜单的初始阶段实现,也可以通过ModifyMenu()函数对已存在的菜单项进行类型修改。 具体的菜单的自绘是通过重载CMenu类的
Draw
Item
()
C++之MFC学习
问题
1:stdafx.h是怎么引入进来的?define.h与stdafx.h之间的关系?为什么在MuisicPlayer.cpp
中
引入stdafx.h
问题
2:enum class的使用
问题
3:列表初始化:int window_transparency{ 100 }
问题
4:C
DC
的使用 C
DC
类定义的是设备上下文对象的类。 C
DC
对象提供处理显示器或打印机等设备上下文的成员函数,以及处理与窗口客户区对应的显示上下文的成员。 通过C
DC
对象的成员函数进行所有的绘图。 类对设备上下文操作提供了成员函
Windows Shell 编程 第七章
与所有其它Win32进程一样,Shell也有其自己的
内存
地址空间,这是其它应用完全不可知的地址空间。为了进入这个地址空间,我们必须传递一定数量的控制点,就象我们正在跨过国家边界一样。在Windows Shell这块陆地上什么是我们感兴趣的呢,它是一个伊甸园吗,它有丰富的金矿吗,它是天堂的宝库吗?不幸,它都不是。进入Shell,只是简单地允许我们编写代码执行在Shell外面不能执行的操作。通过注入代
[转]Windows Shell 编程 第七章 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7987955】...
第七章侵入Shell 与所有其它Win32进程一样,Shell也有其自己的
内存
地址空间,这是其它应用完全不可知的地址空间。为了进入这个地址空间,我们必须传递一定数量的控制点,就象我们正在跨过国家边界一样。在Windows Shell这块陆地上什么是我们感兴趣的呢,它是一个伊甸园吗,它有丰富的金矿吗,它是天堂的宝库吗?不幸,它都不是。进入Shell,只是简单地允...
Windows Shell编程-第七章.侵入Shell
第七章 侵入Shell 与所有其它Win32进程一样,Shell也有其自己的
内存
地址空间,这是其它应用完全不可知的地址空间。为了进入这个地址空间,我们必须传递一定数量的控制点,就象我们正在跨过国家边界一样。在Windows Shell这块陆地上什么是我们感兴趣的呢,它是一个伊甸园吗,它有丰富的金矿吗,它是天堂的宝库吗?不幸,它都不是。进入Shell,只是简单地允许我们编写代
界面
15,979
社区成员
115,896
社区内容
发帖
与我相关
我的任务
界面
VC/MFC 界面
复制链接
扫一扫
分享
社区描述
VC/MFC 界面
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章