紧急求救,再弄不出来我想跳楼了。GetDC问题。

xjwanglb 2003-08-25 02:55:24
我把代码贴出来,大家看看这样可不可以。如果如可以请告诉我原因。最好是有力的根据。
CDrawPen g_clDrawPen;
CDrawLine g_clDrawLine;
CDrawPolyline g_clDrarPolyline;
CDrawRectangle g_clDrawRect;
CDrawEllipse g_clDrawEllipse;
CDrawRoundRect g_clDrawRoundRect;
CDrawText g_clDrawText;
CDrawPick g_clDrawPick;
CDrawSelect g_clDrawSelect;
CDrawEraser g_clDrawErase;
CDrawMove g_clDrawMove;
CDrawFill g_clDrawFill;

CDrawTool* g_aDrawObject[] =
{

& g_clDrawPen,
& g_clDrawLine,
& g_clDrarPolyline,
& g_clDrawRect,
& g_clDrawEllipse,
& g_clDrawRoundRect,
& g_clDrawText,
& g_clDrawPick,
& g_clDrawSelect,
& g_clDrawErase,
& g_clDrawMove,
& g_clDrawFill
};
注明:所有的DrawFill等都是从DrawTool派生而来。DrawTool有一个成员函数是用来获取DC的:
bool CDrawTool::SetWnd(CWnd* pclWnd)
{
if (pclWnd == NULL)
{
return false;
}

m_hWnd = pclWnd;
m_hDC = pclWnd->GetDC()->m_hDC;
return true;
}
我在CMyView里面初始化。
void CMyView::OnShowWindow(BOOL bShow,
UINT nStatus)
{
CView::OnShowWindow(bShow, nStatus);
int iDrawObjectNum = sizeof(g_aDrawObject) / sizeof(g_aDrawObject[0]);
for (int i = 0; i < iDrawObjectNum; i++)
{
g_aDrawObject[i]->SetWnd(this);
}

}
然后我在
void CMyView::OnLButtonDown(UINT nFlags,
CPoint point)
{
g_aDrawObject[m_uiCurrToolId]->OnLButtonDown(point, rcDspRgn);
CView::OnLButtonDown(nFlags, point);
}
和OnLButtonUp和OnMouseMove里面调用每一个实例相应的函数来执行画图。
这样子在Win2000上没有任何问题,在win98上就有问题。

请教了,给出强有力的理由。分数不够可以再给。
...全文
102 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Powerdix 2003-08-26
  • 打赏
  • 举报
回复
Win2000下运行正常并不意味着没有GDI资源泄露,只不过Win2000相对比较健壮而已

原因:
1、m_hDC已经无效
2、所有DC都是动态分配的,不适用于“储存以备后用”这样的场合

建议:
SetWnd()只设置m_pWnd = pclWnd,不调用GetDC(),每个需要画图的函数里m_pWnd->GetDc()画图,画完调用m_pWnd->ReleaseDC().

关于所有DC都是动态分配的可作调试验证,在CViewr OnDraw(CDC* pDC)中设置断点,查看pDC->m_hDC的值,同一个CView每次传入pDC->m_hDC的值不一定都相同(有的相隔几次后相同),意味着你所保存的m_hDC有可能画到我的屏幕上来了。

MSDN参考原文:

CDC* GetDC( );

The Rreturn Value 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.

sdlwvillager 2003-08-26
  • 打赏
  • 举报
回复
Unless the device context belongs to a window class, the ReleaseDC member function must be called to release the context after painting. Since only five common device contexts are available at any given time, failure to release a device context can prevent other applications from accessing a device context
思危 2003-08-26
  • 打赏
  • 举报
回复
你GetDC为什么没有掉ReleaseDC
wangxjlb 2003-08-26
  • 打赏
  • 举报
回复
那样应该是由问题的,没有释放,而是一次12个,看微软官方的Msdn
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/devcons_4esj.asp

Windows 95/98/Me: There are only 5 common DCs available per thread, thus failure to release a DC can prevent other applications from accessing one.

xjwanglb 2003-08-26
  • 打赏
  • 举报
回复
解决了,谢谢。
xjwanglb 2003-08-25
  • 打赏
  • 举报
回复
绘图的时候有时候出不来。
Anikan 2003-08-25
  • 打赏
  • 举报
回复
有什么问题,描述以下好吗?
karlson0211 2003-08-25
  • 打赏
  • 举报
回复
同样,帮你up
vanhui 2003-08-25
  • 打赏
  • 举报
回复
系统问题,不知道具体原因,我更菜

19,468

社区成员

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

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