以下是我的代码,下面的代码是每秒30次取鼠标的坐标,一但在一个多边形内就返回TRUE,不在时就返回FALSE.
多边形是在一个链表中,
可是下面的代码运行的时候CreatePolygonRgn好象无法释放,内存在一点一点的加大,不知道是什么问题,谁能帮我解决下呢?当然也不怀疑是其它的问题.bool Node_OS::Draw_If(LPDIRECTDRAWSURFACE &P,int X,int Y)
{
Current = First;
while (Current != NULL)
{
HRGN rgn ;
HDC hdc;
if ((rgn=CreatePolygonRgn(Current->XY,Current->Current,ALTERNATE))!=0)
if (PtInRegion(rgn,X,Y))
{
P->GetDC(&hdc);
SetBkMode(hdc,TRANSPARENT);
SelectObject(hdc,CreatePen(PS_DASHDOTDOT,2,RGB(0,255,255)));
SelectObject(hdc,GetStockObject(NULL_BRUSH));
::Polyline(hdc,Current->XY,Current->Current+1);
Disp_Str1 = Current->Name;
Disp_Str2 = Current->Add;
return true;
}
Current = Current->Next_Node;
P->ReleaseDC(&hdc);
DeleteObject(&rgn);
}
return false;
}
多边形是在一个链表中,
可是下面的代码运行的时候CreatePolygonRgn好象无法释放,内存在一点一点的加大,不知道是什么问题,谁能帮我解决下呢?当然也不怀疑是其它的问题.bool Node_OS::Draw_If(LPDIRECTDRAWSURFACE &P,int X,int Y)
{
Current = First;
while (Current != NULL)
{
HRGN rgn ;
HDC hdc;
if ((rgn=CreatePolygonRgn(Current->XY,Current->Current,ALTERNATE))!=0)
if (PtInRegion(rgn,X,Y))
{
P->GetDC(&hdc);
SetBkMode(hdc,TRANSPARENT);
SelectObject(hdc,CreatePen(PS_DASHDOTDOT,2,RGB(0,255,255)));
SelectObject(hdc,GetStockObject(NULL_BRUSH));
::Polyline(hdc,Current->XY,Current->Current+1);
Disp_Str1 = Current->Name;
Disp_Str2 = Current->Add;
return true;
}
Current = Current->Next_Node;
P->ReleaseDC(&hdc);
DeleteObject(&rgn);
}
return false;
}
当PtInRegion时直接返回true,既没有DeleteObject(),也没有ReleaseDC()
bool Node_OS::Draw_If(LPDIRECTDRAWSURFACE &P,int X,int Y)
{
HRGN rgn ;
HDC hdc;
Current = First;
while (Current != NULL)
{
if ((rgn=CreatePolygonRgn(Current->XY,Current->Current,ALTERNATE))!=0)
{
if (PtInRegion(rgn,X,Y))
{
P->GetDC(&hdc);
SetBkMode(hdc,TRANSPARENT);
SelectObject(hdc,CreatePen(PS_DASHDOTDOT,2,RGB(0,255,255)));
SelectObject(hdc,GetStockObject(NULL_BRUSH));
::Polyline(hdc,Current->XY,Current->Current+1);
P->ReleaseDC(&hdc);
DeleteObject(&rgn);
Disp_Str1 = Current->Name;
Disp_Str2 = Current->Add;
return true;
}
}
else
continue;
Current = Current->Next_Node;
P->ReleaseDC(&hdc);
DeleteObject(&rgn);
}
return false;
}
当if ((rgn=CreatePolygonRgn(Current->XY,Current->Current,ALTERNATE))!=0) 通过的时候执行
if (PtInRegion(rgn,X,Y))
{
P->GetDC(&hdc);
SetBkMode(hdc,TRANSPARENT);
SelectObject(hdc,CreatePen(PS_DASHDOTDOT,2,RGB(0,255,255)));
SelectObject(hdc,GetStockObject(NULL_BRUSH));
::Polyline(hdc,Current->XY,Current->Current+1);
P->ReleaseDC(&hdc);
DeleteObject(&rgn);
Disp_Str1 = Current->Name;
Disp_Str2 = Current->Add;
return true;
}
当坐标不在中的时候if (PtInRegion(rgn,X,Y))执行以下操作
Current = Current->Next_Node;
P->ReleaseDC(&hdc);
DeleteObject(&rgn); 当if ((rgn=CreatePolygonRgn(Current->XY,Current->Current,ALTERNATE))!=0) 通过不了的时候 执行下次循环
最终只会P->ReleaseDC(&hdc); 可能无用处,但其它的代码并没有问题啊
楼上的看错了
是
Current = Current->Next_Node;
P->ReleaseDC(&hdc);
DeleteObject(&rgn);
根本执行不到
而且在我看来你的程序书写有问题吧,别把大括号省略了,你自己明白,别人还不知道怎么事呢,建议把代码重新写一下。
{
HRGN rgn = NULL;
HDC hdc;
HPEN hPen = CreatePen(PS_DASHDOTDOT,2,RGB(0,255,255));
P->GetDC(&hdc);
Current = First;
while (Current != NULL)
{
rgn=CreatePolygonRgn(Current->XY,Current->Current,ALTERNATE);
if (rgn!= NULL)
continue;
if (PtInRegion(rgn,X,Y))
{
SetBkMode(hdc,TRANSPARENT);
SelectObject(hdc,hPen);
SelectObject(hdc,GetStockObject(NULL_BRUSH));
::Polyline(hdc,Current->XY,Current->Current+1);
P->ReleaseDC(&hdc);
DeleteObject(&rgn);
DeleteObject(&hPen);
Disp_Str1 = Current->Name;
Disp_Str2 = Current->Add;
return true;
}
else
{
Current = Current->Next_Node;
DeleteObject(&rgn);
rgn = NULL;
}
}
P->ReleaseDC(&hdc);
DeleteObject(&hPen);
return false;
}
似乎你的CreatePen产生的画笔没有删除导致的问题。
bool Node_OS::Draw_If(LPDIRECTDRAWSURFACE &P,int X,int Y)
{
HRGN rgn=NULL;
Current = First;
while (Current != NULL)
{
rgn=CreatePolygonRgn(Current->XY,Current->Current,ALTERNATE);
if (rgn == NULL)
{
Current = Current->Next_Node;
continue;
} if (PtInRegion(rgn,X,Y))
{
HDC hdc;
P->GetDC(&hdc);
HPEN hPen = CreatePen(PS_DASHDOTDOT,2,RGB(0,255,255));
SelectObject(hdc,CreatePen(PS_DASHDOTDOT,2,RGB(0,255,255)));
SetBkMode(hdc,TRANSPARENT);
SelectObject(hdc,hPen);
SelectObject(hdc,GetStockObject(NULL_BRUSH));
::Polyline(hdc,Current->XY,Current->Current+1);
P->ReleaseDC(&hdc);
DeleteObject(&rgn);
DeleteObject(&hPen);
Disp_Str1 = Current->Name;
Disp_Str2 = Current->Add;
return true;
}
Current = Current->Next_Node;
continue;
}
return false;
}
/*
if (PtInRegion(rgn,X,Y))
{
HDC hdc;
P->GetDC(&hdc);
HPEN hPen = CreatePen(PS_DASHDOTDOT,2,RGB(0,255,255));
SelectObject(hdc,CreatePen(PS_DASHDOTDOT,2,RGB(0,255,255)));
SetBkMode(hdc,TRANSPARENT);
SelectObject(hdc,hPen);
SelectObject(hdc,GetStockObject(NULL_BRUSH));
::Polyline(hdc,Current->XY,Current->Current+1);
P->ReleaseDC(&hdc);
DeleteObject(&rgn);
DeleteObject(&hPen);
/*
Disp_Str1 = Current->Name;
Disp_Str2 = Current->Add; return true;
} */
{
HRGN rgn=NULL;
Current = First;
while (Current != NULL)
{
rgn=CreatePolygonRgn(Current->XY,Current->Current,ALTERNATE);
if (rgn == NULL)
{
Current = Current->Next_Node;
continue;
} if (PtInRegion(rgn,X,Y))
{
HDC hdc;
P->GetDC(&hdc);
P->ReleaseDC(&hdc);
/*
HPEN hPen = CreatePen(PS_DASHDOTDOT,2,RGB(0,255,255));
SelectObject(hdc,CreatePen(PS_DASHDOTDOT,2,RGB(0,255,255)));
SetBkMode(hdc,TRANSPARENT);
SelectObject(hdc,hPen);
SelectObject(hdc,GetStockObject(NULL_BRUSH));
::Polyline(hdc,Current->XY,Current->Current+1); DeleteObject(&rgn);
DeleteObject(&hPen);
/*
Disp_Str1 = Current->Name;
Disp_Str2 = Current->Add; return true; */
}
Current = Current->Next_Node;
continue;
}
return false;
}这样一样的内存会自己慢慢的加上来,难道是HDC问题?
SelectObject(hdc,CreatePen(PS_DASHDOTDOT,2,RGB(0,255,255))); ==有没有搞错啊?怎么还CreatePen???不都已经有hPen了么。
这里的GetDC函数是什么样的?