function  MouseInPicRegion(...): MOUSE_POS;  //鼠标位置
var
  RectHRGN: HRGN;
begin
  ...
  RectHRGN := CreateRgn(ACanvas);
  ...
end;function  CreatePicRgn(ACanvas:TCanvas): HRGN;  //产生图元区域的句柄
begin
  ...
  Result := CreateRectRgn(mRect.Left, mRect.Top, mRect.Right, mRect.Bottom);//返回HRGN的一个类型值
end;
现在问题是不停地调用CreateRectRgn而占用大量的系统资源最终导致系统崩溃。我用MemProof测试过,就是因为
CreateRectRgn这个函数不停的调用占成的,会造成GDI的Region疯狂的往上涨。
但是我在CreatePicRgn这个函数里又没办法用DeleteObject来释放,我原来也试过在CreatePicRgn这个函数里改成
function  CreatePicRgn(ACanvas:TCanvas): HRGN;  //产生图元区域的句柄
var
  RectRGN : HRGN;
begin
  ...
  try
    RectRGN := CreateRectRgn(mRect.Left, mRect.Top, mRect.Right, mRect.Bottom);//返回HRGN的一个类型值
    Result := RectRGN;
  finally
    DeleteObject(RectRGN);
  end;
end;
但是这样调用后会造成我调用MouseInPicRegion这个函数取不到句柄。这要怎么释放这些资源呢?

解决方案 »

  1.   

    我说了,如果我创建一个之后就释放会造成我调用MouseInPicRegion这个函数取不到句柄function  CreatePicRgn(ACanvas:TCanvas): HRGN;  //产生图元区域的句柄 
    var 
      RectRGN : HRGN; 
    begin 
      ... 
      try 
        RectRGN := CreateRectRgn(mRect.Left, mRect.Top, mRect.Right, mRect.Bottom);//返回HRGN的一个类型值 
        Result := RectRGN; 
      finally 
        DeleteObject(RectRGN); //这里释放
      end; 
    end; 
      

  2.   

    你真天才,创建了就马上释放!
    那你创建它干嘛,占cpu玩儿么?
      

  3.   

    这段代码不是我写的,是以前他们写的。我现在查出是这里产生的问题。
    这是一个函数,它要返回CreateRectRgn所产生的HRGN值
      

  4.   


    这个代码很明显的错误,CreateRectRgn完了又DeleteObject,你说那返回结果是什么
      

  5.   

    在MouseInPicRegion中释放RectHRGNfunction  MouseInPicRegion(...): MOUSE_POS;  //鼠标位置 
    var 
      RectHRGN: HRGN; 
    begin
      ... 
      try
        RectHRGN := CreateRgn(ACanvas);
        ... 
      finally
        DeleteObject(RectHRGN );
      end;  
    end;