绘图时修改,pen,brush等的属性,绘制完毕时想恢复原先的值,我不想用变量保存再恢复,就用savedc,restoredc函数,可是不管用,请大侠们帮看看。
procedure TForm1.Button1Click(Sender: TObject);
var
orgdc:integer;
begin
orgdc:=savedc(self.Canvas.Handle);
self.Canvas.Pen.Color:=clred;
self.Canvas.LineTo(100,100);
if not restoredc(self.Canvas.Handle,orgdc ) then
showmessage('error');
end;procedure TForm1.Button2Click(Sender: TObject);
begin
self.Canvas.LineTo(200,300);
end;
procedure TForm1.Button1Click(Sender: TObject);
var
orgdc:integer;
begin
orgdc:=savedc(self.Canvas.Handle);
self.Canvas.Pen.Color:=clred;
self.Canvas.LineTo(100,100);
if not restoredc(self.Canvas.Handle,orgdc ) then
showmessage('error');
end;procedure TForm1.Button2Click(Sender: TObject);
begin
self.Canvas.LineTo(200,300);
end;
我觉得如果用winapi来画线就能成功。
orgdc:integer;
begin
self.Canvas.Pen.Color:=clBlue;
//ShowMessage(IntToStr(self.Canvas.Pen.Color));
orgdc:=savedc(self.Canvas.Handle);
refresh; /// 我加的....
self.Canvas.Pen.Color:=clred;
//ShowMessage(IntToStr(self.Canvas.Pen.Color));
self.Canvas.LineTo(100,100);
if not restoredc(self.Canvas.Handle, orgDC) then
showmessage('error')
else begin
ShowMessage(IntToStr(self.Canvas.Pen.Color));
refresh;
end;
begin
Changing;
RequiredState(csAllValid);
Result := FHandle;
end;procedure TCanvas.RequiredState(ReqState: TCanvasState);
var
NeededState: TCanvasState;
begin
NeededState := ReqState - State;
if NeededState <> [] then
begin
if csHandleValid in NeededState then
begin
CreateHandle;
if FHandle = 0 then
raise EInvalidOperation.CreateRes(@SNoCanvasHandle);
end;
if csFontValid in NeededState then CreateFont;
if csPenValid in NeededState then CreatePen;
if csBrushValid in NeededState then CreateBrush;
State := State + NeededState;
end;
end;procedure TCanvas.CreateFont;
begin
SelectObject(FHandle, Font.GetHandle);
SetTextColor(FHandle, ColorToRGB(Font.Color));
end;
或者用变量,或者用另外一个设备句柄。总之得有起暂存作用的对象来保存原来的值。