VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 446|回复: 4

关于MFC自绘按钮控件调用DrawItem的问题

[复制链接]
05_avatar_middle
最佳答案
1 
donate_vip 发表于 2024-5-6 16:45:34 | 显示全部楼层 |阅读模式
我的项目里有一个继承了CButton类的CShadeButton,项目程序运行了几个小时后就崩了,我抓到了异常后写了MiniDump,dump文件里的异常断在DrawItem里,这个函数是这样的void CShadeButton::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) ;
看到这个参数其他的成员是有值的,但这个lpDrawItemStruct里面的hDC是个NULL
导致我后面调用
pRealDC = CDC::FromHandle(lpDrawItemStruct->hDC);  
CDC hdcMem;
hdcMem.CreateCompatibleDC(pRealDC);
CDC* pDC = &hdcMem;
CBitmap hBitmap;
hBitmap.CreateCompatibleBitmap(pRealDC,cx,cy);
CBitmap* pOldBitmap = hdcMem.SelectObject(&hBitmap); //select the destination for MemDC
.........
从pRealDC是个NULL开始就不对劲了,然后进行操作的时候软件闪退了。我想问下有什么解决方法吗?还有这个hDC怎么会是个NULL

我后面使用了
CDC* pRealDC = NULL;

if (!lpDrawItemStruct->hDC)
{
        HDC hDC = ::GetDC(lpDrawItemStruct->hwndItem);
        pRealDC = CDC::FromHandle(hDC);
}
else
{
        pRealDC = CDC::FromHandle(lpDrawItemStruct->hDC);
}
结果还是会出现NULL的情况,一般都是在点击按钮后出现的
打印了下lpDrawItemStruct->itemAction,发现itemAction是1,也可以这么说明了。
不知道要怎么处理了,有大佬能说下吗?




上一篇:GetClientRect相当于GetWindowRect与ScreenToClient二者结合吗?
下一篇:关于纯win32窗口编程的问题
63_avatar_middle
最佳答案
0 
在线会员 发表于 2024-5-8 10:02:23 | 显示全部楼层
自己用WIN32窗口封装一个即可
05_avatar_middle
最佳答案
1 
ico_lz  楼主| 发表于 2024-5-14 10:11:11 | 显示全部楼层
我感觉是之前删除了控件,然后新创建的控件ID跟删除过的控件ID号重复了,但是ID名不一样,我重新改了下ID号,目前还没发现问题,准备运行一段时间观察下看看
12_avatar_middle
最佳答案
0 
在线会员 发表于 2024-5-14 21:13:54 | 显示全部楼层

祝vc驿站越办越好
05_avatar_middle
最佳答案
1 
ico_lz  楼主| 发表于 2024-5-15 09:15:34 | 显示全部楼层
看来应该是跟我想的一样了。但是为什么删掉了控件后,没用到那个对应名字的ID号也会出现这个情况,如果只是ID号一样,名字不一样的话不应该也有区分吗?
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2024-5-25 15:46

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表