绘图时修改,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;

解决方案 »

  1.   

    难道是delphi的canvas封装了dc,所以不成功。
    我觉得如果用winapi来画线就能成功。
      

  2.   

    晕,SaveDC只是保存DC设置,又不是保存位图
      

  3.   

    看错了,你后面调用的Canvas绘图,不是直接调GDI
      

  4.   

    直接操作DC,和Canvas对象耦合不是好的做法
      

  5.   

    并没有正确恢复, 提示错误. 把窗体刷新后.原因还不清楚.明天再搞var
    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;
      

  6.   

    兄弟,如果有空看一看TCanvas类的原代码,就知道原因,呵呵,我以前也和你一样天真,以为直接用SaveDC就可以了function TCanvas.GetHandle: HDC;
    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;
      

  7.   

    SAVEDC就如同保存一个指针吧。楼主并没把另外一个设备句柄替换过来,仍然操作的是原来的设备,所以所有的修改就保存下来了。
    或者用变量,或者用另外一个设备句柄。总之得有起暂存作用的对象来保存原来的值。