我给一个窗体画了一个边框,但如何将这个边框再删除呢?(就是恢复成默认)(50分)

  • 主题发起人 主题发起人 biku
  • 开始时间 开始时间
B

biku

Unregistered / Unconfirmed
GUEST, unregistred user!
这是一个可以设置窗体边框颜色的函数,大家能帮忙设计一个可以删除该窗体边框颜色的函数吗?
function HighlightWindow(pl_hwnd: Hwnd;cor:tColor):bool;
var
ll_hDC : HDC;
lu_RECT : TRECT;
begin
GetWindowRect(pl_hWnd,lu_RECT);
ll_hDC := GetWindowDC(pl_hWnd);
ll_Pen := CreatePen(ps_solid, 2, cor);
SelectObject(ll_hDC, ll_Pen); //设置新笔
SelectObject(ll_hDC, GetStockObject(HOLLOW_BRUSH));
Rectangle(ll_hDC, 0, 0, lu_RECT.Right - lu_RECT.Left, lu_RECT.Bottom - lu_RECT.Top);
DeleteObject(ll_Pen);
ReleaseDC(pl_hWnd, ll_hDC);
result:=true;
end;
 
再用同样的算法,把画框的颜色改回成原来底色就可以了吧
 
其实问题就是怎样获得原来窗口边框的(默认)颜色呢?您能告诉我吗?谢谢!
 
顶!!!!!!!!!!!!!!!
 
form1.repaint!
 
function HighlightWindow(pl_hwnd: Hwnd;cor:tColor):bool;
var
ll_hDC : HDC;
lu_RECT : TRECT;
ll_Pen : HPEN;
begin
GetWindowRect(pl_hWnd,lu_RECT);
ll_hDC := GetWindowDC(pl_hWnd);

SetROP2(ll_hDC, R2_NOTXORPEN); <<<<<<<

ll_Pen := CreatePen(ps_solid, 1, cor); <<<<<<<画笔大小改了点0, 1差不多
SelectObject(ll_hDC, ll_Pen); //设置新笔
SelectObject(ll_hDC, GetStockObject(HOLLOW_BRUSH));
Rectangle(ll_hDC, 0, 0, lu_RECT.Right - lu_RECT.Left, lu_RECT.Bottom - lu_RECT.Top);
DeleteObject(ll_Pen);
ReleaseDC(pl_hWnd, ll_hDC);
result:=true;
end;
 
非常感谢hwljerry,不过这个边框被别的窗体挡住后就消失了,能不能让它不消失,直到我们让它消失为止(即再次调用该函数)?
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1235742
 
在窗体的ONPAINT事件里加入你的代码试试
 
谢谢“啊啊啊啊啊”,我在这里找了很久相关的问题老是找不到。
 
上面两位的回答综合起来可以解决你的问题的。用了一个简单的方法。
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
btn1: TButton;
Button1: TButton;
Button2: TButton;
btn2: TButton;
procedure FormPaint(Sender: TObject);
procedure btn1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure btn2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation

{$R *.dfm}

var
ReDraw: Boolean;

function HighlightWindow(pl_hwnd: Hwnd;cor:tColor):bool;
var
ll_hDC : HDC;
lu_RECT : TRECT;
ll_Pen : HPEN;
begin
GetWindowRect(pl_hWnd,lu_RECT);
ll_hDC := GetWindowDC(pl_hWnd);
ll_Pen := CreatePen(ps_solid, 2, cor);
SelectObject(ll_hDC, ll_Pen); //设置新笔
SelectObject(ll_hDC, GetStockObject(HOLLOW_BRUSH));
Rectangle(ll_hDC, 0, 0, lu_RECT.Right - lu_RECT.Left, lu_RECT.Bottom - lu_RECT.Top);
DeleteObject(ll_Pen);
ReleaseDC(pl_hWnd, ll_hDC);
result:=true;
end;

function HighlightWindow2(pl_hwnd: Hwnd;cor:tColor):bool;
var
ll_hDC : HDC;
lu_RECT : TRECT;
ll_Pen : HPEN;
begin
GetWindowRect(pl_hWnd,lu_RECT);
ll_hDC := GetWindowDC(pl_hWnd);

SetROP2(ll_hDC, R2_NOTXORPEN); //<<<<<<<

ll_Pen := CreatePen(ps_solid, 1, cor); //<<<<<<<画笔大小改了点0, 1差不多
SelectObject(ll_hDC, ll_Pen); //设置新笔
SelectObject(ll_hDC, GetStockObject(HOLLOW_BRUSH));
Rectangle(ll_hDC, 0, 0, lu_RECT.Right - lu_RECT.Left, lu_RECT.Bottom - lu_RECT.Top);
DeleteObject(ll_Pen);
ReleaseDC(pl_hWnd, ll_hDC);
result:=true;
end;

procedure TForm1.FormPaint(Sender: TObject);
begin
if ReDraw then
HighlightWindow(Self.Handle, clBlack);
end;

procedure TForm1.btn1Click(Sender: TObject);
begin
ReDraw := False;
HighlightWindow2(Self.Handle, clBlack);
form1.BorderWidth:=1; //引起局部重绘
form1.BorderWidth:=0;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
ReDraw := True;
end;

procedure TForm1.btn2Click(Sender: TObject);
begin
HighlightWindow(Self.Handle, clBlack)
end;

end.
 
procedure ResetDrawWindow(HCtrl: HWND);
begin
Windows.RedrawWindow(HCtrl, nil, 0, RDW_INVALIDATE or RDW_FRAME or RDW_ERASE);
end;
 
还是这里的人气旺啊,谢谢大家。
最后的解决办法还是用hwljerry的方法,调用第一次画边框,再次调用则删除边框。

晚上结帖。
不过又发现新问题要请教大家啦。
如何给任意一个窗体画边框,且能让这个边框保持恒久。http://www.delphibbs.com/delphibbs/dispq.asp?lid=3344418
 
如何给任意一个窗体画边框
>>>>>>>>>>>这个在”啊啊啊啊啊“提供的连接里面都有啊。
且能让这个边框保持恒久
>>>>>>>>>>>>>这个可能要保存取得的句柄再定时绘制应该可以
 
呵呵,就是“且能让这个边框保持恒久”成了一个新的问题!不知道如何解决?
 
多人接受答案了。
 
后退
顶部