saa*_*stn 4 delphi graphics tcanvas
我正在尝试为a编写自定义绘制单元格方法TDBGridEh.问题是,当我改变笔,画笔的属性时......绘画变得混乱.那是因为控件在调用事件后会做一些额外的绘画.所以我必须保留所有道具,然后在我自己的画完成后重置它们.
我尝试创建自己的TControlCanvas并为其分配网格,但我得到一个带有消息的运行时异常:
无法将TControlCanvas分配给TControlCanvas
,表示该AssignTo方法TControlCanvas未针对其祖先实施,也未针对其祖先实施.所以我的问题是:
为什么TControlCanvas没有AssignTo方法?问题是什么?
如何保留和恢复TControlCanvas的所有属性?而我的意思的东西比创造更便捷TPen,TBrush,TFont,等.
虽然TCanvas实际上没有封装这些API函数,但可以使用SaveDC并RestoreDC执行您需要的操作.来自MSDN:
的SaveDC函数通过复制数据描述所选对象和图形模式(如位图,刷子,调色板,字体,笔,区域,绘图模式,并且映射模式)到上下文保存指定的设备上下文(DC)的当前状态堆.
[...]
所述RestoreDC函数恢复设备上下文(DC)至指定的状态.通过从早先调用SaveDC函数创建的堆栈弹出状态信息来恢复DC.
一个可能的代码示例:
uses
Winapi.Windows;
...
var
SavedDC: Integer;
begin
SavedDC := SaveDC(Canvas.Handle);
try
// Painting code
finally
RestoreDC(Canvas.Handle, SavedDC);
end;
end;
Run Code Online (Sandbox Code Playgroud)
编辑:
我意识到仅此一点可能不是答案.这将处理Windows端的设备上下文,该设备上下文由Delphi的VCL端的TCanvas/ TControlCanvasobject 表示.但它不会改变任何的TFont,TBrush或TPen该持有VCL对象.从测试看起来就像那样,例如每当Delphi使用Canvas Brush.GetHandle(FillRect,FrameRect)时,它仍然是改变的Brush.
因此,最好的选择是使用SaveDC并RestoreDC与存储和恢复相结合Pen,Font并Brush在Uwe Raabe的答案中使用.
不知道这是否符合您的期望,但是有TPenRecall,TBrushRecall并且TFontRecall以半自动方式保存和恢复这三个属性的设置。
处理非常简单:使用相应的属性作为参数创建这些类的实例,然后使用Pen,Brush和Font进行任何操作。最后释放这些实例,这将恢复设置。
结合使用a TObjectList和一些内部参考,可以将保存和恢复这些画布属性所需的工作减少到一个衬里。
type
TCanvasSaver = class(TInterfacedObject)
private
FStorage: TObjectList<TRecall>;
public
constructor Create(ACanvas: TCanvas);
destructor Destroy; override;
class function SaveCanvas(ACanvas: TCanvas): IInterface;
end;
constructor TCanvasSaver.Create(ACanvas: TCanvas);
begin
inherited Create;
FStorage := TObjectList<TRecall>.Create(True);
FStorage.Add(TFontRecall.Create(ACanvas.Font));
FStorage.Add(TBrushRecall.Create(ACanvas.Brush));
FStorage.Add(TPenRecall.Create(ACanvas.Pen));
end;
destructor TCanvasSaver.Destroy;
begin
FStorage.Free;
inherited;
end;
class function TCanvasSaver.SaveCanvas(ACanvas: TCanvas): IInterface;
begin
Result := Self.Create(ACanvas);
end;
Run Code Online (Sandbox Code Playgroud)
用法:
procedure TForm274.DoYourDrawing(ACanvas: TCanvas);
begin
TCanvasSaver.SaveCanvas(ACanvas);
{ Change Pen, Brush and Font of ACanvas and do whatever you need to do.
Make sure that ACanvas is still valid and the same instance as at the entry of this method. }
end;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
285 次 |
| 最近记录: |