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

  1. function TControl.GetDeviceContext(var WindowHandle: HWnd): HDC;
  2. begin
  3. if Parent = nil then
  4. raise EInvalidOperation.CreateFmt(SParentRequired, [Name]);
  5. Result := Parent.GetDeviceContext(WindowHandle);
  6. SetViewportOrgEx(Result, Left, Top, nil); // 注意,根据当前图形控件的坐标建立新的原点
  7. IntersectClipRect(Result, , , Width, Height); // 注意,只针对当前图形控件的区域建立新的剪裁区
  8. end;
  9.  
  10. function TWinControl.GetDeviceContext(var WindowHandle: HWnd): HDC;
  11. begin
  12. if csDesigning in ComponentState then
  13. Result := GetDCEx(Handle, , DCX_CACHE or DCX_CLIPSIBLINGS)
  14. else
  15. Result := GetDC(Handle);
  16. if Result = then raise EOutOfResources.CreateRes(@SWindowDCError);
  17. WindowHandle := FHandle;
  18. end;

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

  1. procedure TControlCanvas.CreateHandle;
  2. begin
  3. if FControl = nil then inherited CreateHandle else
  4. begin
  5. if FDeviceContext = then
  6. begin
  7. with CanvasList.LockList do
  8. try
  9. if Count >= CanvasListCacheSize then FreeDeviceContext;
  10. FDeviceContext := FControl.GetDeviceContext(FWindowHandle);
  11. Add(Self);
  12. finally
  13. CanvasList.UnlockList;
  14. end;
  15. end;
  16. Handle := FDeviceContext;
  17. UpdateTextFlags;
  18. end;
  19. end;
  20.  
  21. function TControl.PaletteChanged(Foreground: Boolean): Boolean;
  22. var
  23. OldPalette, Palette: HPALETTE;
  24. WindowHandle: HWnd;
  25. DC: HDC;
  26. begin
  27. Result := False;
  28. if not Visible then Exit;
  29. Palette := GetPalette;
  30. if Palette <> then
  31. begin
  32. DC := GetDeviceContext(WindowHandle);
  33. OldPalette := SelectPalette(DC, Palette, not Foreground);
  34. if RealizePalette(DC) <> then Invalidate;
  35. SelectPalette(DC, OldPalette, True);
  36. ReleaseDC(WindowHandle, DC);
  37. Result := True;
  38. end;
  39. end;

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

  1. procedure TControl.SetZOrderPosition(Position: Integer);
  2. var
  3. I, Count: Integer;
  4. ParentForm: TCustomForm;
  5. begin
  6. TControl(ParentForm).PaletteChanged(True);
  7. end;
  8.  
  9. procedure TWinControl.WMPaletteChanged(var Message: TMessage);
  10. begin
  11. Message.Result := Longint(PaletteChanged(False));
  12. end;
  13.  
  14. procedure TWinControl.WMSysColorChange(var Message: TWMSysColorChange);
  15. begin
  16. Graphics.PaletteChanged;
  17. Perform(CM_SYSCOLORCHANGE, , );
  18. end;
  19.  
  20. function TWinControl.PaletteChanged(Foreground: Boolean): Boolean;
  21. var
  22. I: Integer;
  23. begin
  24. Result := inherited PaletteChanged(Foreground);
  25. if Visible then
  26. for I := ControlCount - downto do
  27. begin
  28. if Foreground and Result then Exit;
  29. Result := Controls[I].PaletteChanged(Foreground) or Result;
  30. end;
  31. end;
  32.  
  33. procedure TWinControl.WMQueryNewPalette(var Message: TMessage);
  34. begin
  35. Include(FControlState, csPalette);
  36. Message.Result := Longint(PaletteChanged(True));
  37. end;
  38.  
  39. procedure TWinControl.WMPaletteChanged(var Message: TMessage);
  40. begin
  41. Message.Result := Longint(PaletteChanged(False));
  42. end;

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

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

    多比图形控件是一款基于Web(VML和SVG技术)的矢量图形控件, 类似于网页上的Visio控件拓扑图软件,是目前国内外最佳的基于web的工作流设计器.工作流流程监视器解决方案. 可广泛应用于包括:电 ...

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

    AnyCAD图形控件有.Net版本和C++两个版本,使用C++要比C#稍微繁杂一点.SDK中提供了针对MFC的文档视图的封装,只需改一下几个基类即可. 准备 VS2010 下载C++版本的AnyCAD ...

  3. 使用C#三维图形控件进行曲线曲面分析

    使用AnyCAD.Net三维图图形控件能够计算曲线的切线.法线.曲率.长度等,能够计算曲面的uv切线.法线.面积等. 代码示例一:曲线分析 Platform.LineStyle lineStyle = ...

  4. 老李推荐:第14章1节《MonkeyRunner源码剖析》 HierarchyViewer实现原理-面向控件编程VS面向坐标编程

    老李推荐:第14章1节<MonkeyRunner源码剖析> HierarchyViewer实现原理-面向控件编程VS面向坐标编程   poptest是国内唯一一家培养测试开发工程师的培训机 ...

  5. pentaho cde 封装自定义图形控件,动态传参

    在实际项目中经常会用到将经常用到的图形表格组成一个控件,其他地方直接调用,类似于服务器开发的接口,而现在就需要将一些常用的图形做封装,这样就不必重复多次创建相同的内容. 下面就简单的定义一个自定义柱形 ...

  6. GTK图形控件中的rc文件使用心得

    转载自: 1.http://blog.csdn.net/saintwinona/article/details/6972754 2. (1).GTK 主题指南 1.Widgets         GT ...

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

    有时候,基于对一些年份.月份的统计,需要集成多个数值指标进行分析,因此就需要把多种数据放到一个图形里面展现,也成为多重坐标轴,多重坐标轴可以是多个X轴,也可以是Y轴,它们的处理方式类似.本文通过一个例 ...

  8. EasyMvc入门教程-图形控件说明(21)线形图+柱状图+饼形图

    本章将介绍一些基本但常用的图形:线型图,柱状图和饼形图. 以上三种图形对于的数据都是键值对数组,请参考第一个例子: @{ var data = new List<LineItem>(); ...

  9. chartcontrol(统计坐标图形控件)

    统计图形 把控件拖放到界面会弹出下图 图形共分八系列:Bar Series,Point and line Series,pie Series,Funnel Series,Area  Series,Ra ...

随机推荐

  1. Python 第十二篇:HTML基础

    一:基础知识: HTML是英文Hyper Text Mark-up Language(超文本标记语言)的缩写,他是一种制作万维网页面标准语言(标记).相当于定义统一的一套规则,大家都来遵守他,这样就可 ...

  2. zk mysql 主从自动切换

    zookeeper测试: DBI 版本: /DBI-1.616# zjtest7-redis:/root/DBD-mysql-4.031# perl Makefile.PL Can't exec &q ...

  3. Sereja and Bottles

    http://codeforces.com/problemset/problem/315/A 题目意思是第ai的瓶子能开bi的瓶子.给你相应的数据,求无法用其他瓶子打开的数量(即需要外力). 一开始看 ...

  4. 高级UIKit-02(文件操作)

    [day3_1_Sandbox]:沙箱的介绍 snadbox沙箱沙盒 沙箱根目录下的几个文件夹: 1.应用名称.app存放应用程序的素材 2.Documents:存放应用运行时需要用到的数据(关键性数 ...

  5. SDK Hello world(直接使用SDK封装)

    前言 将代码拆分了一下, 如果处理更多的消息也不怕看的眼花 SDK编程就是对各种Windows消息的处理 实验工程 /// @file exam_1.cpp /// @brief 查阅本地MSDN,  ...

  6. WPF Multi-Touch 开发:基础触屏操作(Raw Touch)

    原文 WPF Multi-Touch 开发:基础触屏操作(Raw Touch) 多点触控(Multi-Touch)就是通过与触屏设备的接触达到人与应用程序交互的操作过程.例如,生活中经常使用的触屏手机 ...

  7. Android开发10.1:UI组件适配器AdapterView(创建ListView,Adapter接口)

    @version:Android4.3 API18 @author:liuxinming 概述               AdapterView继承了ViewGroup,它的本质是容器       ...

  8. 浅谈初次搭建nginx+php+mysql遇到的问题

    先说明下我linux上的环境: nginx + php(5.5.10) + mysql 開始的源代码已经在本地写好,并调试成功(本地的环境是用XAMPP的默认配置).在把代码上传至linux上时,出现 ...

  9. 有关android工程的构建脚本(build.xml)的学习

    学习[android-sdk-linux根目录]/tools/ant/build.xml,觉得如下几点很有用,记录之 1)ant脚本中属性值是于前置定义优化的原则,即属性发生重复定义时,前面定义的值不 ...

  10. jQuery 3.0 的 Data

    jQuery 3.0 的 Data Snandy If you cannot hear the sound of the genuine in you, you will all of your li ...