TControl.GetDeviceContext会给图形控件建立新的坐标原点和建立新的剪裁区域

这是取得DC句柄的其中一种方法(会重定义原点和建立新的剪裁区):

function TControl.GetDeviceContext(var WindowHandle: HWnd): HDC;
begin
  if Parent = nil then
    raise EInvalidOperation.CreateFmt(SParentRequired, [Name]);
  Result := Parent.GetDeviceContext(WindowHandle);
  SetViewportOrgEx(Result, Left, Top, nil);       // 注意,根据当前图形控件的坐标建立新的原点
  IntersectClipRect(Result, 0, 0, Width, Height); // 注意,只针对当前图形控件的区域建立新的剪裁区
end;

function TWinControl.GetDeviceContext(var WindowHandle: HWnd): HDC;
begin
  if csDesigning in ComponentState then
    Result := GetDCEx(Handle, 0, DCX_CACHE or DCX_CLIPSIBLINGS)
  else
    Result := GetDC(Handle);
  if Result = 0 then raise EOutOfResources.CreateRes(@SWindowDCError);
  WindowHandle := FHandle;
end;

--------------------- 在两个地方会调用GetDeviceContext函数 -----------------
注意,只有TCanvas.RequiredState会调用TControlCanvas.CreateHandle函数

procedure TControlCanvas.CreateHandle;
begin
  if FControl = nil then inherited CreateHandle else
  begin
    if FDeviceContext = 0 then
    begin
      with CanvasList.LockList do
      try
        if Count >= CanvasListCacheSize then FreeDeviceContext;
        FDeviceContext := FControl.GetDeviceContext(FWindowHandle);
        Add(Self);
      finally
        CanvasList.UnlockList;
      end;
    end;
    Handle := FDeviceContext;
    UpdateTextFlags;
  end;
end;

function TControl.PaletteChanged(Foreground: Boolean): Boolean;
var
  OldPalette, Palette: HPALETTE;
  WindowHandle: HWnd;
  DC: HDC;
begin
  Result := False;
  if not Visible then Exit;
  Palette := GetPalette;
  if Palette <> 0 then
  begin
    DC := GetDeviceContext(WindowHandle);
    OldPalette := SelectPalette(DC, Palette, not Foreground);
    if RealizePalette(DC) <> 0 then Invalidate;
    SelectPalette(DC, OldPalette, True);
    ReleaseDC(WindowHandle, DC);
    Result := True;
  end;
end;

--------------------- 调用调色板变化的5个函数 -----------------

procedure TControl.SetZOrderPosition(Position: Integer);
var
  I, Count: Integer;
  ParentForm: TCustomForm;
begin
  TControl(ParentForm).PaletteChanged(True);
end;

procedure TWinControl.WMPaletteChanged(var Message: TMessage);
begin
  Message.Result := Longint(PaletteChanged(False));
end;

procedure TWinControl.WMSysColorChange(var Message: TWMSysColorChange);
begin
  Graphics.PaletteChanged;
  Perform(CM_SYSCOLORCHANGE, 0, 0);
end;

function TWinControl.PaletteChanged(Foreground: Boolean): Boolean;
var
  I: Integer;
begin
  Result := inherited PaletteChanged(Foreground);
  if Visible then
    for I := ControlCount - 1 downto 0 do
    begin
      if Foreground and Result then Exit;
      Result := Controls[I].PaletteChanged(Foreground) or Result;
    end;
end;

procedure TWinControl.WMQueryNewPalette(var Message: TMessage);
begin
  Include(FControlState, csPalette);
  Message.Result := Longint(PaletteChanged(True));
end;

procedure TWinControl.WMPaletteChanged(var Message: TMessage);
begin
  Message.Result := Longint(PaletteChanged(False));
end;
时间: 2024-10-12 12:05:40

TControl.GetDeviceContext会给图形控件建立新的坐标原点和建立新的剪裁区域的相关文章

FireMonkey图形控件继承关系

FireMonkey 的控件都是自己绘制的(而不是基于系统组件), 我想它们应该是基于一些基本图形; 就从基本图形开始吧. FMX.Objects 单元给出的类: TShape //基本图形的基类 TLine TRectangle TRoundRect TCalloutRectangle TEllipse TCircle TPie TArc TPath TText TImage TPaintBox TSelection TSelectionPoint 添加一个 TRectangle, 先纵观一下

cad动态的2D/3D图形控件VectorDraw Developer Framework (VDF)

VectorDraw Developer Framework (VDF)为您的应用程序增加动态的2D/3D图形.是一个可轻松创建爱你和管理及打印2D和3D图形的构件. 其对象可显示与大多数公共矢量格式和其他CAD对象兼容的方法和属性. 支持10多种矢量格式和多种离散格式.VectorDraw Developer Framework (VDF) 是完全基于对象的和支持 .NET 2的. 此构件是用.NET 2005 C# 代码写成的. 同时还提供了一个ActiveX组件. 此ActiveX组件为旧

在MFC程序中使用AnyCAD图形控件

AnyCAD图形控件有.Net版本和C++两个版本,使用C++要比C#稍微繁杂一点.SDK中提供了针对MFC的文档视图的封装,只需改一下几个基类即可. 准备 VS2010 下载C++版本的AnyCAD图形控件:http://pan.baidu.com/s/1c06hmPa 项目设置 $(AnyCADSDK)替换为您的工程相对于AnyCAD C++ SDK的位置,您也可以把AnyCADSDK加到环境变量中. 头文件 $(AnyCADSDK)\inc Lib查找目录 $(AnyCADSDK)\lib

多比(SVG/VML)图形控件多比(SVG/VML)图形控件免费下载

多比图形控件是一款基于Web(VML和SVG技术)的矢量图形控件, 类似于网页上的Visio控件,是目前国内外最佳的基于web的工作流设计器.工作流流程监视器解决方案. 可广泛应用于包括:电力.军工.煤炭.化工.科研.能源等各种监控软件.web工作流设计器.asp.net工作流设计器.电力.化工.煤炭.工控组态软件.仿真.地理信息系统.工作流.复杂报表 工业SCADA系统.ERP流程设计系统.图形管理.图形拓扑分析.GIS地理信息系统系统.工程制图等领域.目前已经为全球20多个国家的数千家客户采

多比(SVG/VML)图形控件多比(SVG/VML)图形拓扑图控件免费下载地址

多比图形控件是一款基于Web(VML和SVG技术)的矢量图形控件, 类似于网页上的Visio控件拓扑图软件,是目前国内外最佳的基于web的工作流设计器.工作流流程监视器解决方案. 可广泛应用于包括:电力.军工.煤炭.化工.科研.能源等各种监控软件.web工作流设计器.asp.net工作流设计器.电力.化工.煤炭.工控组态软件.仿真.地理信息系统.工作流.复杂报表 工业SCADA系统.ERP流程设计系统.图形管理.图形拓扑分析.GIS地理信息系统系统.工程制图等领域.目前已经为全球20多个国家的数

多比(SVG/VML)图形控件拓扑图控件免费下载

多比图形控件是一款基于Web(VML和SVG技术)的矢量图形拓扑图控件, 类似于网页上的Visio控件,是目前国内外最佳的基于web的工作流设计器.工作流流程监视器解决方案. 可广泛应用于包括:电力.军工.煤炭.化工.科研.能源等各种监控软件.web工作流设计器.asp.net工作流设计器.电力.化工.煤炭.工控组态软件.仿真.地理信息系统.工作流.复杂报表 工业SCADA系统.ERP流程设计系统.图形管理.图形拓扑分析.GIS地理信息系统系统.工程制图等领域.目前已经为全球20多个国家的数千家

LightningChart 图形控件 被应用于光学项目当中

LightningChart图形控件彻底发挥了GPU加速和性能优化的最大效应,能够实时呈现超过10亿数据点的庞大数据.广泛应用于科研.工程.医疗.航空.贸易.金融.能源和许多其他领域的实时测量和分析应用等等. 原文地址:https://www.cnblogs.com/highcharts/p/9322618.html

ActiveReports 报表控件官方中文入门教程 (3)-如何选择页面报表和区域报表

原文:ActiveReports 报表控件官方中文入门教程 (3)-如何选择页面报表和区域报表 本篇文章将介绍区域报表和页面报表的常见使用场景.区别和选择报表类型的一些建议,两种报表的模板设计.数据源(设计时和运行时)设置.和浏览报表的区别. ActiveReports 报表控件官方中文入门教程 (1)-安装.激活以及产品资源 ActiveReports 报表控件官方中文入门教程 (2)-创建.数据源.浏览以及发布 本篇文章包括以下部分: 1.区域报表和页面报表的区别 两种报表的具体应用场景 区

DevExpress控件使用之多重坐标图形的绘制 z

有时候,基于对一些年份.月份的统计,需要集成多个数值指标进行分析,因此就需要把多种数据放到一个图形里面展现,也成为多重坐标轴,多重坐标轴可以是多个X轴,也可以是Y轴,它们的处理方式类似.本文通过一个例子对这个方面进行介绍,希望给大家有一个很好的参考. 首先我们先来看一个图形例子,我们可以从里面图形的右边看到有多个Y轴,一个Y轴代表一个指标分析,X轴为月份. 上图是采用了DevExpress的ChartControl图表控件来实现的,这个控件提供了SecondaryAxisY对象来处理多重坐标的问