WinAPI: DrawFocusRect - 绘制焦点矩形

用SetTextColor()设置颜色 
功能 设置指定设备环境(HDC)的字体颜色
原型 WINGDIAPI COLORREF WINAPI SetTextColor (HDC, COLORREF)
也可以理解成 DWORD SetTextColor (HDC, DWORD),其中DWORD是关于颜色的参数,常用RGB()获取,如:SetTextColor(HDC,RGB(255,0,0));

//声明: 
DrawFocusRect( 
 hDC: HDC;     {设备环境句柄} 
 const lprc: TRect {矩形结构} 
): BOOL; 
//举例: 
procedure TForm1.FormPaint(Sender: TObject); 
var 
 MyRect: TRect; 
begin 
 MyRect := Rect(20,20, 180,100); 
 DrawFocusRect(Canvas.Handle, MyRect); 
end; 


GetDc该函数检索一指定窗口的客户区域或整个屏幕的显示设备上下文环境的句柄,以后可以在GDI函数中使用该句柄来在设备上下文环境中绘图。函数用于获得hWnd参数所指定窗口的客户区域的一个设备环境。所获得的设备环境可以是通用、类或者私有类型,具体由指定窗口的类风格决定。对于通用设备环境GetDc函数每次获取一个设备环境时都会用默认属性对它进行初始化。该函数获得的类和私有设备环境会与它们最后一次的设置保持一致。当设备环境不再需要时,应该调用ReleaseDC函数将其释放,典型和特有设备上下文环境不需要释放,设备上下文环境的个数仅受有效内存的限制。

GetWindowDC函数返回hWnd参数所指定的窗口的设备环境。获得的设备环境覆盖了整个窗口(包括非客户区),例如标题栏、菜单、滚动条,以及边框。这使得程序能够在非客户区域实现自定义图形,例如自定义标题或者边框。当不再需要该设备环境时,需要调用ReleaseDC函数释放设备环境。注意,该函数只获得通用设备环境,该设备环境的任何属性改变都不会反映到窗口的私有或者类设备环境中(如果窗口有的话)

----------摘自《Delphi   Win32核心API参考》


MapWindowPoints
函数功能:该函数把相对于一个窗口的坐标空间的一组点映射成相对于另一窗口的坐标空 的一组点。
函数原型:int MapWindowPoints(HWND hWndFrom, HWND hWndTo,LPPOINT lpPoints, UINT cPoints);
参数:
hWndfrom:转换点所在窗口的句柄,如果此参数为NULL或HWND_DESETOP则假定这些点在屏幕坐标上。
hWndTo:转换到的窗口的句柄,如果此参数为NULL或HWND_DESKTOP,这些点被转换为屏幕坐标。
lpPoints:指向POINT结构数组的指针,此结构数组包含要转换的点,此参数也可指向RECT结构,在此情况下,Cpoints参数应设置为2。
cPoints:指定LpPoints参数指向的数组中POINT结构的数目。
返回值:如果函数调用成功,返回值的低位字是每一个源点的水平坐标的像素数目,以便计算每个目标点的水平坐标;高位字是每一个源点的垂直坐标的像素的数目,以便计算每个目标点的垂直坐标,如果函数调用失败,返回值为零。
Windows NT:若想获得更多错误信息,请调用GetLastError函数。


InflateRect

InflateRect函数增大或减小指定矩形的宽和高。InflateRect函数在矩形的左和右增加dx,在矩形的上下增加dy。 dx和dy参数是有符号值。正数增加宽和高,负数减小。

BOOL InflateRect( LPRECT lprc, //矩形

        int dx, // amount to adjust width

        int dy // amount to adjust height);

Unit uUtils;
 
Interface
 
Uses Windows, Forms;
 
Const
  DEFAULT_FOCUSRECT_WIDTH = 3;
 
var
  WndOrder: Integer;
 
Type
  TMsgViewType = (mvtParent, mvtChildren, mvtAllSameThread,
    mvtAllSameProcess, mvtAll);
  TMsgViewTypes = Set Of TMsgViewType;
 
Procedure DrawWindowFocusRect(Wnd: HWND;
  Width: Integer = DEFAULT_FOCUSRECT_WIDTH);
Function FindTopmostWindow(ParentWnd: HWND; Pt: TPoint): HWND;
 
Implementation
 
Function FindTopmostWindow(ParentWnd: HWND; Pt: TPoint): HWND;
Var
  R: TRect;
Begin
  Result := GetWindow(ParentWnd, GW_CHILD);
  // 上等同Result := GetTopWindow(ParentWnd);
  While Result <> 0 Do
  Begin
    GetWindowRect(Result, R);
    If IsWindowVisible(Result) And PtInRect(R, Pt) Then
    // PtInRect判断指定的点是否位于矩形lpRect内部
    Begin
      If ((Result = Application.MainForm.Handle) Or
        (Application.MainForm.Handle = GetWindow(Result, GW_OWNER))) Then
      Begin
        Result := 0;
        Exit;
      End;
      Result := FindTopmostWindow(Result, Pt);
      Exit;
    End;
    Result := GetWindow(Result, GW_HWNDNEXT);
  End;
  Result := ParentWnd;
End;
 
Procedure MyDrawFocusRect(DC: HDC; R: TRect;
  Width: Integer = DEFAULT_FOCUSRECT_WIDTH);
Var
  I: Integer;
Begin
  InflateRect(R, -Width, -Width);
  DrawFocusRect(DC, R);
  For I := 1 To Width Do
  Begin
    InflateRect(R, 1, 1);
    SetTextColor(DC, RGB(0, 255, 255)); // 边框颜色
    DrawFocusRect(DC, R);
  End;
End;
 
Procedure DrawWindowFocusRect(Wnd: HWND;
  Width: Integer = DEFAULT_FOCUSRECT_WIDTH);
Var
  DC: HDC;
  R: TRect;
Begin
  DC := getwindowdc(Wnd); //返回hWnd参数所指定的窗口的设备环境,获得的设备环境覆盖了整个窗口(包括非客户区)
  GetWindowRect(Wnd, R);
  //该函数把相对于一个窗口的坐标空间的一组点映射成相对于另一窗口的坐标空间的一组点
  MapWindowPoints(HWND_DESKTOP, Wnd, R, 2);
   //OffsetRect函数将指定的矩形移动到指定的位置
  OffsetRect(R, -R.left, -R.top);
  MyDrawFocusRect(DC, R, Width);
  releasedc(Wnd, DC);
End;
 
End.

Delphi窗体重绘API的更多相关文章

  1. 非常出色的一款WinForm窗体重绘GUI类库源码

    基本控件的演示 ScrollBar滚动条 各种圆形进度条 ProgressBar进度条 Mdi演示,仿谷歌浏览器 多种皮肤可供选择 一套专业级别的GUI控件,目前包含了窗体.进度条.滚动条以及MDI多 ...

  2. (Delphi) Windows 32 API程序设计目录

    这里所有程序均使用Delphi调用Windows 32 API方式实现,并不是使用VCL已经封装好的类实现的! (一)第一个窗口程序 01 创建第一个窗口.

  3. 浅议Delphi中的Windows API调用(举的两个例子分别是String和API,都不错,挺具有代表性)

    浅议Delphi中的Windows API调用http://tech.163.com/school • 2005-08-15 10:57:41 • 来源: 天极网为了能在Windows下快速开发应用程 ...

  4. delphi 调用百度地图api

    一.调用javascript的方法 两种: 第一种:采用自编函数的方法 function ExecuteJavaScript(WebBrowser:TWebBrowser; Code: string) ...

  5. Delphi的Win32的API调用简单介绍

    1.     介绍Win32 API和Win32系统.还要讨论Win32系统的功能以及它与16位系统在功能上的几个主要区别.只是让对Win32系统有一个基本的了解.当已经基本了解Win32操作后,就可 ...

  6. Delphi XE6 通过JavaScript API调用百度地图

    参考昨天的内容,有朋友还是问如何调用百度地图,也是,谁让咱都在国内呢,没办法,你懂的. 首先去申请个Key,然后看一下百度JavaScript的第一个例子:http://developer.baidu ...

  7. 教程-Delphi调用百度地图API(XE8+WIN7)

    unit U_map; interface //---------------------------------------------------// //----------COPY BY 无言 ...

  8. Delphi 实现 图灵机器人API(IDHTTP POST )

    此功能所需的 Key及接口文档,都可以在图灵机器人的官网下载, 小伙伴们需要申请自己的图灵机器人账号. 申请方法请自行百度“图灵机器人”  . 登录账号后,在左侧的[机器人接入],获取需要的信息,记得 ...

  9. 如何将JPEG缩略图放到LISTVIEW中(delphi listview自绘图形)

    http://www.docin.com/p-567657457.html?qq-pf-to=pcqq.c2c http://www.cnblogs.com/snow001x/archive/2008 ...

随机推荐

  1. rest framework之过滤组件

    一.普通过滤 (一)get_queryset get_queryset方法是GenericAPIView提供的一个方法,旨在返回queryset数据集,而过滤就是要在这个方法返回数据集之前对数据进行筛 ...

  2. CSIC_716_20191209【并发编程---GIL和协程】

    GIL   Global Interpreter Lock 全局解释锁 GIL对含IO的任务来说,会出现不能保证数据安全的情况.如下: from threading import Thread fro ...

  3. spring 结合 redis 例子 (转)

    好了费话不多说了,介绍下spring 结合redis是怎么操作数据的 这里我用了maven管理,由于简单嘛,依赖下包就行了..不用单独去依赖包,成了我的习惯 好了,下面是pom的代码 <proj ...

  4. sql 投影查询

    使用SELECT * FROM <表名> WHERE <条件>可以选出表中的若干条记录.我们注意到返回的二维表结构和原表是相同的,即结果集的所有列与原表的所有列都一一对应. 如 ...

  5. NX二次开发CreateDialog函数在UI.hxx文件和WinUser.h中的冲突【转载】

    文章出自https://blog.csdn.net/qq_41843732/article/details/91422764 在UG二次开发中,若使用MFC库,一旦加上#include<Afx. ...

  6. goroutine 需要注意的一个小细节

    虽然goroutine 是并发执行的,但是它们并不是并行运行的.如果不告诉Go 额外的东西,同一时刻只会有一个goroutine 执行.利用runtime.GOMAXPROCS(n) 可以设置goro ...

  7. jmter 5.1 中文

    一.jmeter5.0下载解压后,默认的界面是英文版的,许多人觉得不方便,想要汉化,jmeter是不需要安装汉化包的,通过修改配置文件即可:1.找到jmeter解压后的文件夹,例如我是安装在D:\De ...

  8. Application.GetOpenFilename 使用说明

    Application.GetOpenFilename(FileFilter, FilterIndex, Title, ButtonText, MultiSelect) 语法: 名称         ...

  9. C++ 操作json文件

    一.环境搭建: 参考文章:https://blog.csdn.net/fakine/article/details/79272090 二.创建实例: #include <stdio.h> ...

  10. NIO 源码分析(02-1) BIO 源码分析

    目录 一.BIO 最简使用姿势 二.ServerSocket 源码分析 2.1 相关类图 2.2 主要属性 2.3 构造函数 2.4 bind 方法 2.5 accept 方法 2.6 总结 NIO ...