以下是我的代码,下面的代码是每秒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;
}

解决方案 »

  1.   

    当PtInRegion时,你直接返回true了,而并没有DeleteObject(&rgn)啊
      

  2.   

    只见你SelectObject载入,没见你还原
    当PtInRegion时直接返回true,既没有DeleteObject(),也没有ReleaseDC()
      

  3.   

    Up还有 这个数组是不是用了 new
      

  4.   

    上面的代码发错了,我运行的是下面的
    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;
    }
      

  5.   

    你这程序毛病着呢。最后的那个P->ReleaseDC(&hdc)根本没有意义。如果执行到这句,那么只有PtInRegion不成立,那么P->GetDC(&hdc)根本执行不到啊。
      

  6.   

    能帮我改改吗?我的思路如下:
    当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); 可能无用处,但其它的代码并没有问题啊
      

  7.   


    楼上的看错了 
    是 
    Current = Current->Next_Node; 
              P->ReleaseDC(&hdc); 
              DeleteObject(&rgn); 
    根本执行不到
      

  8.   

    建议楼主自己找原因,Debug下设立断点,逐步查找,学会解决问题的能力。
    而且在我看来你的程序书写有问题吧,别把大括号省略了,你自己明白,别人还不知道怎么事呢,建议把代码重新写一下。
      

  9.   

    bool Node_OS::Draw_If(LPDIRECTDRAWSURFACE &P,int X,int Y) 

        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产生的画笔没有删除导致的问题。
      

  10.   

    谁说执行不到?当PtInRegion不成立时就会执行到。
      

  11.   

    我现在的代码如下,虽然短时间好象没什么问题,但从任务管理器中可以看到,这个程序的内存在一点一点的往上涨.如果把这个函数注解掉的话就不涨了,这是什么问题呢?
    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;
    }
      

  12.   

    这一段代码去掉的话也没有任何问题,看不到内存在往上涨
    /*
              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;
              }   */
      

  13.   

    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);
                  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问题?
      

  14.   

    HPEN hPen = CreatePen(PS_DASHDOTDOT,2,RGB(0,255,255)); 
                  SelectObject(hdc,CreatePen(PS_DASHDOTDOT,2,RGB(0,255,255))); ==有没有搞错啊?怎么还CreatePen???不都已经有hPen了么。
      

  15.   

    P->GetDC(&hdc); 
    这里的GetDC函数是什么样的?