Delphi窗体重绘API:DrawFocusRect,SetTextColor(),GetDc,GetWindowDC,MapWindowPoints,InflateRect

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);


 

复制代码
 1 Unit uUtils;
 2 
 3 Interface
 4 
 5 Uses Windows, Forms;
 6 
 7 Const
 8   DEFAULT_FOCUSRECT_WIDTH = 3;
 9 
10 var
11   WndOrder: Integer;
12 
13 Type
14   TMsgViewType = (mvtParent, mvtChildren, mvtAllSameThread,
15     mvtAllSameProcess, mvtAll);
16   TMsgViewTypes = Set Of TMsgViewType;
17 
18 Procedure DrawWindowFocusRect(Wnd: HWND;
19   Width: Integer = DEFAULT_FOCUSRECT_WIDTH);
20 Function FindTopmostWindow(ParentWnd: HWND; Pt: TPoint): HWND;
21 
22 Implementation
23 
24 Function FindTopmostWindow(ParentWnd: HWND; Pt: TPoint): HWND;
25 Var
26   R: TRect;
27 Begin
28   Result := GetWindow(ParentWnd, GW_CHILD);
29   // 上等同Result := GetTopWindow(ParentWnd);
30   While Result <> 0 Do
31   Begin
32     GetWindowRect(Result, R);
33     If IsWindowVisible(Result) And PtInRect(R, Pt) Then
34     // PtInRect判断指定的点是否位于矩形lpRect内部
35     Begin
36       If ((Result = Application.MainForm.Handle) Or
37         (Application.MainForm.Handle = GetWindow(Result, GW_OWNER))) Then
38       Begin
39         Result := 0;
40         Exit;
41       End;
42       Result := FindTopmostWindow(Result, Pt);
43       Exit;
44     End;
45     Result := GetWindow(Result, GW_HWNDNEXT);
46   End;
47   Result := ParentWnd;
48 End;
49 
50 Procedure MyDrawFocusRect(DC: HDC; R: TRect;
51   Width: Integer = DEFAULT_FOCUSRECT_WIDTH);
52 Var
53   I: Integer;
54 Begin
55   InflateRect(R, -Width, -Width);
56   DrawFocusRect(DC, R);
57   For I := 1 To Width Do
58   Begin
59     InflateRect(R, 1, 1);
60     SetTextColor(DC, RGB(0, 255, 255)); // 边框颜色
61     DrawFocusRect(DC, R);
62   End;
63 End;
64 
65 Procedure DrawWindowFocusRect(Wnd: HWND;
66   Width: Integer = DEFAULT_FOCUSRECT_WIDTH);
67 Var
68   DC: HDC;
69   R: TRect;
70 Begin
71   DC := getwindowdc(Wnd); //返回hWnd参数所指定的窗口的设备环境,获得的设备环境覆盖了整个窗口(包括非客户区)
72   GetWindowRect(Wnd, R);
73   //该函数把相对于一个窗口的坐标空间的一组点映射成相对于另一窗口的坐标空间的一组点
74   MapWindowPoints(HWND_DESKTOP, Wnd, R, 2);
75    //OffsetRect函数将指定的矩形移动到指定的位置
76   OffsetRect(R, -R.left, -R.top);
77   MyDrawFocusRect(DC, R, Width);
78   releasedc(Wnd, DC);
79 End;
80 
81 End.
复制代码

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值