我实在是没有招数了。为什么相同的用法,::Ellipse,而::Rectangle会出问题。300分!

lbIlj 2003-08-19 05:10:40
::Ellipse可以,无论在什么情况下,都不会出什么问题,但是::Rectangle在我的计算机上也可以。在win2000上也没有问题。为什么在别人的win98上就要出问题。有时候第一次画::Rectangle不出来。执行2,3次后就可以了。
//class of draw Ellipse
CDrawEllipse::CDrawEllipse()
{
m_IsMouseLKeyUp = true;
m_IsDrawEllipse = false;
m_IsDownPointIn = false;
}

CDrawEllipse::~CDrawEllipse()
{
}

void CDrawEllipse::OnLButtonDown(CPoint point,
CRect rRect)
{
m_hWnd->SetCapture();
if (rRect.PtInRect(point))
{
m_IsMouseLKeyUp = false;
m_IsDownPointIn = true;//标志点击的点是否在范围内
m_EllipseUpleftPoint = point;
}
}

bool CDrawEllipse::OnLButtonUp(CPoint point,
CRect rRect)
{
::ReleaseCapture();
m_IsMouseLKeyUp = true;
if (m_IsDrawEllipse && m_IsDownPointIn)
{
m_EllipseBottomRightPoint = point;
m_IsDownPointIn = false;
return true;
}
else
{
return false;
}
}

void CDrawEllipse::OnMouseMove(CPoint point,
CRect rRect)
{
::SetROP2(m_hDC, R2_NOTXORPEN);
HBRUSH hBrush;
hBrush = (HBRUSH) ::SelectObject(m_hDC, GetStockObject(NULL_BRUSH));
if (m_IsMouseLKeyUp == false)
{
m_IsDrawEllipse = true;
::Ellipse(m_hDC,
m_EllipseUpleftPoint.x,
m_EllipseUpleftPoint.y,
m_OldEndPoint.x,
m_OldEndPoint.y);
::Ellipse(m_hDC,
m_EllipseUpleftPoint.x,
m_EllipseUpleftPoint.y,
point.x,
point.y);
}
m_OldEndPoint = point;
::SelectObject(m_hDC, hBrush);
::DeleteObject(hBrush);
}
但是::Rectangle
//class of draw rectangle
CDrawRectangle::CDrawRectangle()
{
m_IsMouseLKeyUp = true;
m_IsDrawRect = false;
m_IsDownPointIn = false;
}

CDrawRectangle::~CDrawRectangle()
{
}

void CDrawRectangle::OnLButtonDown(CPoint point,
CRect rRect)
{
m_hWnd->SetCapture();
if (rRect.PtInRect(point))
{
m_IsMouseLKeyUp = false;
m_RectUpleftPoint = point;
m_IsDownPointIn = true;//标志点击的点是否在范围内
}
m_OldBRPoint = point;
}

bool CDrawRectangle::OnLButtonUp(CPoint point,
CRect rRect)
{
::ReleaseCapture();
m_IsMouseLKeyUp = true;
if (m_IsDrawRect && m_IsDownPointIn)
{
m_RectBottomRightPoint = point;
m_IsDownPointIn = false;
return true;
}
else
{
return false;
}

return false;
}

void CDrawRectangle::OnMouseMove(CPoint point,
CRect rRect)
{
::SetROP2(m_hDC, R2_NOTXORPEN);
HBRUSH hBrush;
hBrush = (HBRUSH) ::SelectObject(m_hDC, GetStockObject(NULL_BRUSH));

if (m_IsMouseLKeyUp == false)
{
m_IsDrawRect = true;

::Rectangle(m_hDC,
m_RectUpleftPoint.x,
m_RectUpleftPoint.y,
m_OldBRPoint.x,
m_OldBRPoint.y);
::Rectangle(m_hDC,
m_RectUpleftPoint.x,
m_RectUpleftPoint.y,
point.x,
point.y);
}
m_OldBRPoint = point;
::SelectObject(m_hDC, hBrush);
::DeleteObject(hBrush);
}
希望各位帮忙了。我实在是没有招数了。我最高给不了300!如过谁帮我解决了,我在贴,再送!绝对!
wxjlb@163.com
...全文
56 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangxjlb 2003-08-26
  • 打赏
  • 举报
回复
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/devcons_4esj.asp 微软官方网站有
wangxjlb 2003-08-26
  • 打赏
  • 举报
回复
你看一下是不是DC的问题。Win98和Win2000的DC不一样。Win98最多可以有五个公用的。
lbIlj 2003-08-26
  • 打赏
  • 举报
回复
问题已经解决谢谢wangxjlb和Powerdix
Powerdix 2003-08-26
  • 打赏
  • 举报
回复
我想你的m_hDC成员是调用GetDC()获得.
所有DC都是动态分配的,m_hDC只不能保证在永远有效,不适用于“储存以备后用”这样的场合。
解决方法是保存在其上画图的窗口CWnd* m_pWnd指针,而不是保存m_hDC,在里需要DC的地方m_pWnd->GetDc()画图,画完调用m_pWnd->ReleaseDC().

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.
lbIlj 2003-08-22
  • 打赏
  • 举报
回复
没有人能弄明白嘛?
lbIlj 2003-08-21
  • 打赏
  • 举报
回复
我真的是没有办法了,我就画一条线出来,也不对。我把所有的SelectObject(m_hDC, GetStockObject(NULL_BRUSH));屏蔽掉后我觉得画出来的肯定是填充了的,结果还是。是不是由于
m_hDC的原因。我的Rectangle和Ellipse和Pen和RountRect都是从一个DrawTool派生的。m_hDC是再DrawTool里面设置的。
lbIlj 2003-08-20
  • 打赏
  • 举报
回复
但是我在2台98上调试都有问题。我也用直线画过矩形,但是还是有问题。如果我把矩形
的代码换成Ellipse的代码,有时候也我调用画矩形,也会出现问题,但是调用画椭圆就没有问题。
MPU 2003-08-20
  • 打赏
  • 举报
回复
我可不是什么高手,还很菜!

<<Windows图形编程>> 买的书.

网上有英文版找一下.

<<Windows Graphics Programming Win32 GDI and DirectDraw>>
10M ,太大发不了.
是在美国的中国人用英文写的.

没有你的全部代码就乱说一下:

把这
SelectObject(m_hDC, GetStockObject(NULL_BRUSH));
放到
OnLButtonDown(CPoint point,CRect rRect)
中试试......

把DeleteObject()放到OnLButtonUp()中试试......

----------------------------------------------
我正在看图形学方面的书,所以想到这.

老兄是在上学还是在上班,这么激动!

如果不行就多调试一下,然后自己写个Rectangle或画个空Rectangle,
然后用
void FillGraphAPI(int xa,int ya,HDC hdc,COLORREF SourceColor,COLORREF ObjectColor)
{
HBRUSH xhbrush = CreateSolidBrush(ObjectColor);
SelectObject(hdc, xhbrush);
ExtFloodFill(hdc,xa,ya,SourceColor,FLOODFILLBORDER);
DeleteObject(xhbrush);
}
填充.

lbIlj 2003-08-20
  • 打赏
  • 举报
回复
最新发现.我觉得,现在我只要在出问题的win98上面编译一次我的程序,问题就不会在出现了.不知道这到底是什么原因.
lbIlj 2003-08-20
  • 打赏
  • 举报
回复
谢谢黑眼圈总算是遇到高手了.我是在m-hdc上画图的.我的程序中每个工具是一个类.比如画矩形,画椭圆,画圆角矩形.我每一个类都是这样写的.但是为什么就单单这个要出问题呢?我看到一本书上面说常备gdi设备不需要选出和删除.我在画矩形的当中把最后的::SelectObject()和::DeleteObject取掉还是有问题的.
还有如果你有电子版的<<Windows图形编程>> 可以给我发一份.谢谢.发到xjwang@sunplus.com.cn
MPU 2003-08-20
  • 打赏
  • 举报
回复
问题就在
::DeleteObject(hBrush);

看<<Windows图形编程>> P254

!!!!!!!!!!在删除GDI对象方面Win95/98/Me 和 WindowsNT/2000/XP不同!!!!!!!!!!!!!!

在Win95/98/me下,如果对象仍然在设备上下文中,
那么调用函数DeleteObject就不能删除它,这将导致潜在的GDI对象泄漏.

而在WindowsNT/2000/XP中,即使对象处在在设备上下文中,
调用函数DeleteObject也可以把他删除.但使用被删除GDI对象画图
会导致失败.

lbIlj 2003-08-20
  • 打赏
  • 举报
回复
我想跳楼了!
dhttg 2003-08-19
  • 打赏
  • 举报
回复
我用Win98试了一下。
禁用了if (rRect.PtInRect(point))这一句。
除了回拖鼠标会出现残影外,方框每次都能画出来呀!
看是不是你朋友的WIN98有问题。
StdAfx 2003-08-19
  • 打赏
  • 举报
回复
本来想给你解决这个问题。但我没有装win98,所以可能没有办法处理了。
作为矩形来说这么简单的作图,如果程序这么变态的话那你就别再想是怎么回事了。你直接用线条画出矩形看有问题没有。

19,468

社区成员

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

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