把CDC设置成全局变量时出现程序崩溃

qjgdftxmu 2012-12-11 11:05:00
在写一个用于实现绘图功能的类的时候,为了省事,我把CDC *pDC设置成全局变量,然后在类调用之前把DC的指针传进去,这样做在在VC6.0的时候不会有问题,可是一到2005的时候程序就会崩溃。。。

但是现在现在把这个类用在VC6.0的另一个工程时时候也出现了这个错误,让我感觉头大,我想,是不是设置里有某个安全级别的选项可以避免这个错误。


文笔不好,怕讲不清楚,再用代码描述一下。

void CXXXX::SetDC(CDC *inDC)
{
pDC = inDC;
}
void CXXXX::DrawLine()
{
pDC->MoveTo(0,0);
pDC->LineTo(100,100);
}


就是这样,pDC是全局变量,先调用SetDC传入指针,之后的绘制就可以不用把CDC作为输入参数了。

这种方法我最早是在VC6.0下用的,不过移植到VC2005的时候程序会崩溃。。。。。
然后这一次呢,是用在同一程序下的另一个工程里,也崩溃了,于是我想是不是工程的某个选项设置导致安全级别的检查所以报错呢。。。。
...全文
232 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
傻X 2012-12-13
  • 打赏
  • 举报
回复
不上很具体的代码, 我们三观也会受影响。
schlafenhamster 2012-12-13
  • 打赏
  • 举报
回复
我有个微软的例子“定制控件(旋转立方体).rar” 里面是用 CS_OWNDC的。0分 http://download.csdn.net/detail/schlafenhamster/4244076 只是参考
qjgdftxmu 2012-12-13
  • 打赏
  • 举报
回复
引用 9 楼 VisualEleven 的回复:
引用 7 楼 qjgdftxmu 的回复:自己顶一下吧。 各位有兴趣的朋友,可以试着在一个视图类里这样做。 声明一个CDC *m_pDC的成员变量。 在MouseDown消息响应中获得DC,m_pDC=GetDC();然后在MouseMove中用m_pDC绘图。 这在VC2005中会崩溃的。 你没看MSDN吧 CWnd::GetDC() Iden……
嗯,确实没有看,不过当时已经猜到原因了。 只是觉得在6.0时候不会出现,所以就想着是不是有什么可行的解决方法。
qjgdftxmu 2012-12-13
  • 打赏
  • 举报
回复
引用 10 楼 schlafenhamster 的回复:
"The pointer may be temporary and should not be stored for later use." 这就是为什么 要 CS_OWNDC (私有DC)
在PreCreateWindow中设置了之后 cs.style |= CS_OWNDC; 还是照样会崩溃,在这样下去,我的三观都会受影响了
qjgdftxmu 2012-12-13
  • 打赏
  • 举报
回复
引用 11 楼 tiger9991 的回复:
VC6.0不崩溃是不是没到你GetDC的生命周期结束呢?
应该不是,因为是同一个类,在VC6.0没有问题,而2005就崩溃了。 我想可能是因为GetDC()的在两个版本中的不同实现吧。
qjgdftxmu 2012-12-13
  • 打赏
  • 举报
回复
引用 16 楼 tiger9991 的回复:
不上很具体的代码, 我们三观也会受影响。
额,为了大家的三观,我就快些结帖吧。
schlafenhamster 2012-12-12
  • 打赏
  • 举报
回复
"The pointer may be temporary and should not be stored for later use." 这就是为什么 要 CS_OWNDC (私有DC)
Eleven 2012-12-12
  • 打赏
  • 举报
回复
引用 7 楼 qjgdftxmu 的回复:
自己顶一下吧。 各位有兴趣的朋友,可以试着在一个视图类里这样做。 声明一个CDC *m_pDC的成员变量。 在MouseDown消息响应中获得DC,m_pDC=GetDC();然后在MouseMove中用m_pDC绘图。 这在VC2005中会崩溃的。
你没看MSDN吧 CWnd::GetDC() Identifies the device context for the CWnd client area if successful; otherwise, the return value is NULL. The pointer may be temporary and should not be stored for later use.
schlafenhamster 2012-12-12
  • 打赏
  • 举报
回复
OWNERDC 打错了,是 OWNDC
qjgdftxmu 2012-12-12
  • 打赏
  • 举报
回复
自己顶一下吧。 各位有兴趣的朋友,可以试着在一个视图类里这样做。 声明一个CDC *m_pDC的成员变量。 在MouseDown消息响应中获得DC,m_pDC=GetDC();然后在MouseMove中用m_pDC绘图。 这在VC2005中会崩溃的。
傻X 2012-12-12
  • 打赏
  • 举报
回复
VC6.0不崩溃是不是没到你GetDC的生命周期结束呢?
hdg3707 2012-12-11
  • 打赏
  • 举报
回复
pDC,换个名字,好象在视图里的OnDraw函数里的参数就是这个名字
qjgdftxmu 2012-12-11
  • 打赏
  • 举报
回复
绘图用的类就是一个普通类。。。。或者说是传入CDC指针的类需要设置CS_OWNERDC,但为什么在VC6.0下面不会报错呢?
引用 1 楼 schlafenhamster 的回复:
如果类有 CS_OWNERDC 属性就可以 设为 全局变量 ,否则 临时DC 要 释放。
引用 2 楼 wyx100 的回复:
如果类有 CS_OWNERDC 属性就可以 设为 全局变量 ,否则 临时DC 要 释放。 可以调试一下,
wyx100 2012-12-11
  • 打赏
  • 举报
回复
如果类有 CS_OWNERDC 属性就可以 设为 全局变量 ,否则 临时DC 要 释放。 可以调试一下,
schlafenhamster 2012-12-11
  • 打赏
  • 举报
回复
如果类有 CS_OWNERDC 属性就可以 设为 全局变量 ,否则 临时DC 要 释放。
schlafenhamster 2012-12-11
  • 打赏
  • 举报
回复
通常取DC的代码是: CDC *pDC=GetDC();// 这是一个临时 dc ,是 系统 从 有限的 dc 堆中 给你 的。用完 要 Release CS_OWNERDC CS =Class style。 OWNERDC 表示这个 类 有一个 固定的 DC 在注册 类 时 可以用 它。
qjgdftxmu 2012-12-11
  • 打赏
  • 举报
回复
引用 1 楼 schlafenhamster 的回复:
如果类有 CS_OWNERDC 属性就可以 设为 全局变量 ,否则 临时DC 要 释放。
引用 2 楼 wyx100 的回复:
如果类有 CS_OWNERDC 属性就可以 设为 全局变量 ,否则 临时DC 要 释放。 可以调试一下,
这个。。。CS_OWNERDC这个属性是什么属性,怎么都没有找到,在哪里设置。 另外,CDC是类里的成员变量,不是全局变量。

15,979

社区成员

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

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