各位大虾帮帮忙;画不规则窗体,弹出窗体过多时出错,“Canvas do es not allow drawing”和"System Error, code 87"

  • 主题发起人 主题发起人 不知道_0909
  • 开始时间 开始时间

不知道_0909

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大虾帮帮忙;画不规则窗体,弹出窗体过多时出错,“Canvas does not allow drawing”和"System Error, code 87" (100分)<br />如题
 
仅仅是资源不足的问题
 
才生成25个窗体,有什么解决办法吗
 
这是画窗体的代码,从别的窗体创建此窗体,可在生成25个以后,就会报错
procedure TmyForm.FormCreate(Sender: TObject);
var
w1: TBitmap;
w2: TColor;
rgn: HRGN;
begin
isTime := false;
image1.BringToFront;
image1.Left := 273;
image1.Top := 53;
atime := 0;
w1 :=TBitmap.Create;
w1.LoadFromFile('./skin3.bmp');
w2 := image2.Canvas.Pixels[0,0];
rgn := CreateRegion(w1, w2, Handle);
if rgn<>0 then
begin
SetWindowRgn(Handle, rgn, true);
end;
height := w1.Height ;
width := w1.Width ;
w1.Free;
SetWindowPos(self.handle,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE);
end;{myForm.FormCreate}

function TmyForm.CreateRegion(wMask: TBitmap; wColor: TColor; hControl: THandle): HRGN;
var
dc, dc_c: HDC;
Rgn, TempRgn: HRGN;
X, Y, BeginY: Integer;
line: boolean;
color: TColor;
begin
Rgn := CreateRectRgn(0, 0, 0, 0);{先初始化一个空的区域给Rgn。}
for X := 0 to wMask.Width - 1 do
begin
line := False;
for Y := 0 to wMask.Height - 1 do
begin
color := GetPixel(dc_c, X, Y);
if not (color = wColor) then
begin
if not line then
begin
line := True;
BeginY:= Y;
end;
end;
if (color = wColor) or (Y = wMask.Height-1 ) then
begin
if line then
begin
line := False;
TempRgn := CreateRectRgn(X, BeginY, X + 1, Y);
CombineRgn(Rgn, Rgn, TempRgn, RGN_OR);
{把图形以连续得线段为单位生成区域,并且合并到总的区域中}
end;
end;
end;
end;
ReleaseDC(hControl, dc);
DeleteObject(dc);
Result := Rgn;
end;{TmyForm.CreateRegion}
 
CreateRectRgn创建区域句柄后必须用DeleteObject释放.


procedure TmyForm.FormCreate(Sender: TObject);
var
w1: TBitmap;
w2: TColor;
rgn: HRGN;
begin
isTime := false;
image1.BringToFront;
image1.Left := 273;
image1.Top := 53;
atime := 0;
w1 :=TBitmap.Create;
w1.LoadFromFile('./skin3.bmp');
w2 := image2.Canvas.Pixels[0,0];
rgn := CreateRegion(w1, w2, Handle);
if rgn<>0 then
begin
SetWindowRgn(Handle, rgn, true);

///////////////////////////////////////////////////////////////////////////
DeleteObject(rgn);
///////////////////////////////////////////////////////////////////////////


end;
height := w1.Height ;
width := w1.Width ;
w1.Free;
SetWindowPos(self.handle,HWND_TOPMOST,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE);
end;{myForm.FormCreate}

function TmyForm.CreateRegion(wMask: TBitmap; wColor: TColor; hControl: THandle): HRGN;
var
dc, dc_c: HDC;
Rgn, TempRgn: HRGN;
X, Y, BeginY: Integer;
line: boolean;
color: TColor;
begin
Rgn := CreateRectRgn(0, 0, 0, 0);{先初始化一个空的区域给Rgn。}
for X := 0 to wMask.Width - 1 do
begin
line := False;
for Y := 0 to wMask.Height - 1 do
begin
color := GetPixel(dc_c, X, Y);
if not (color = wColor) then
begin
if not line then
begin
line := True;
BeginY:= Y;
end;
end;
if (color = wColor) or (Y = wMask.Height-1 ) then
begin
if line then
begin
line := False;
TempRgn := CreateRectRgn(X, BeginY, X + 1, Y);
CombineRgn(Rgn, Rgn, TempRgn, RGN_OR);
{把图形以连续得线段为单位生成区域,并且合并到总的区域中}
end;
end;
end;
end;
ReleaseDC(hControl, dc);
DeleteObject(dc);
Result := Rgn;
end;{TmyForm.CreateRegion}
 
aizb
不行
 
在CreateRegion函数里的Region被创建了但没释放吧……建议直接传址把存放结果的变量放在函数的参数中……还有那个TempRgn也没有释放,应该在CombineRgn后DeleteObject一下吧……
 
所有的区域对象都应该要DeleteObject;

if line then
begin
line := False;
TempRgn := CreateRectRgn(X, BeginY, X + 1, Y);
CombineRgn(Rgn, Rgn, TempRgn, RGN_OR);

///////////////////////////////////////////////////////////////////////////
DeleteObject(TempRgn);
///////////////////////////////////////////////////////////////////////////
{把图形以连续得线段为单位生成区域,并且合并到总的区域中}
end;
 
谢谢ShadoWind,删除以后,可以了,可是速度会越来越慢,窗口不能关闭(客户要求),有什么方法吗
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
639
import
I
I
回复
0
查看
974
import
I
后退
顶部