关于一个画边框和清除所画边框的问题!(225分)

  • 主题发起人 主题发起人 Luis Pater
  • 开始时间 开始时间
L

Luis Pater

Unregistered / Unconfirmed
GUEST, unregistred user!
我用以下的方法给任意句柄的窗体(包括控件)画了个边框,但是由于程序的需要,当鼠标
移动以后,需要清除此边框,我查阅了一些资料,用了XOR的方法,但是总是不行,希望
有高手能给一个满意的回答,回答请包括详细的源代码,谢谢!
以下代码是我所写的画边框的代码,如果可以,请把这段程序也优化一下!谢谢![:)]
procedure TForm1.Move(Sender: TObject);
var
DC : hDc;
begin
DC := GetWindowDC(Handle);
Canvas.Handle:=dc;
Canvas.Pen.Color:=RGB(255, 100, 0);
Canvas.Pen.Width:=3;
Canvas.Brush.Style:=bsClear;
Canvas.Rectangle(0,0,Width,Height);
end;
 
Form1.RecreateWnd;//可以擦除,但要闪烁一下;
 
解决了

unit Unit1;

interface

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

type
TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);

private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
rc:Trect;
implementation

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
rc:=rect(0,0,width,height);

end;

procedure TForm1.Button1Click(Sender: TObject);//画框
var
DC : hDc;
begin
DC := GetWindowDC(Handle);
Canvas.Handle:=dc;
Canvas.Pen.Color:=RGB(255, 100, 0);
Canvas.Pen.Width:=3;
Canvas.Brush.Style:=bsClear;
canvas.pen.Mode:=pmXor;//这要加上一句
canvas.Rectangle(rc);
end;

procedure TForm1.Button2Click(Sender: TObject);//擦掉
begin
canvas.pen.Mode:=pmXor;
canvas.Rectangle(rc);
end;
 
不好意思,颜色变了,你自己再想想吧:)
 
上面的方法好像闪了一下。
顶顶
 
我曾经看到过一些VC的代码!很完美,我要的功能是那种类似 Spy++ 的那个画边框的
功能……
真的研究了很久,但还是没能找到一个完美的方法……我实在是没办法了!请大家帮帮
忙,分数不够的话以后还可以补,真是谢谢大家了![:)][:)]
 
to Luis Pater,如果你查以前的帖子,会发现,我也问过同事的问题。

但在这里都没有很好的回复。

是的,用Xor可以画,并且也可以做到无闪烁清除。但这不是你和我想要的。我们想要的是
可以任意指定色彩的,对吧?

另外,在用SPY时,会发现他好像就是用XOR做的,因为,在有色的地方XOR后的色彩不一定
是原来的本色!

但这个问题在VB下却没有,并且可以画出任何色彩的方块。这说明,还是应该有相应的API可以
完成这个工作的。所以,最后把工作就放在局部涮新上了,因为只有这样才能避免闪烁。

不知道老兄有的“研究”结果是什么呢?
 
一年前就想利用这个功能,试了很多方法,不是无法清除边框就是无法还原到正确的颜
色,要不就是有闪烁,没办法,那个程序我也只能就这样放弃了……
我重新试验了一下!Spy++ 好像也并不是我需要的功能,我想自己在窗体的边框上画一
层可以自定义的颜色……
一年前我写那个程序的时候我甚至试验过创建窗体包在窗体外框的方法,但是实验以后
效果并不是很好!
 
to Luis Pater,有QQ或MSN吗?我们上面聊吧!

我还是感觉,应该把问题放在局部涮新上!
 
To Luis Pater

把canvas.pen.Mode:=pmXor; 改成canvas.pen.Mode:=pmNotXor;
这样左边框和上边框的颜色就是对的了,可不知为什么下边和右边还是错的,再试试

听说WINAPI有个函数可以让指定的区域透明,能否将这个框指定会透明,具体函数我也不清楚

你说见过VC的代码,为何不拿来参考参考
 
又有办法啦:
受:doll_paul的启发,应该弄点代码引起窗体局部(边框)刷新, 我将擦除
画框的代码修改如下,不知是否能满足你的要求:

procedure TForm1.Button1Click(Sender: TObject);//画框不变,和你的一样
var
DC : hDc;
begin
DC := GetWindowDC(Handle);
Canvas.Handle:=dc;
Canvas.Pen.Color:=RGB(255, 100, 0);
Canvas.Pen.Width:=3; //我上面加上的canvas.pen.Mode:=pmNotXor;去掉
Canvas.Brush.Style:=bsClear;
canvas.Rectangle(rc);
end;

procedure TForm1.Button2Click(Sender: TObject);//擦框
begin
form1.BorderWidth:=1; //引起局部重绘
form1.BorderWidth:=0;
end;
 
to beyondair,这个方法,看上去可行,但也只能画在自己的窗体上,我们要的是画在
其它窗体或控件上。

并且,如果不用XOR方法画的话,在清除原先画的方框时,会有明显的闪烁,
我感觉,是不是用局部涮新就可以了呢?但我查了相关API,都没有得到好的结果!
 
能不能说的清楚一点,下面的代码我又改一下,点击BUTTON1在BUTTON1边缘画个框
而用同样的擦除代码一样可以擦除这个框,你试试。
另外你说的闪烁问题,当窗体边缘由两种色彩交替时,必然会有这种视觉差异吧,
你用XOR也是闪的,只是因为只是不明显罢了,你可以观察边界,肯定闪,色彩交替必
然有这种感觉,这个例子用的红色,还原后颜色差异很大,所以明显
同样的,我这样做,就是你所说的局部刷新,如果是别的情况,你也可以改变这种
边界属性试试

procedure TForm1.Button1Click(Sender: TObject);//画框
var
DC : hDc;
begin
rc:=button1.ClientRect;
DC := GetWindowDC(button1.Handle);
Canvas.Handle:=dc;
Canvas.Pen.Color:=clblue;
Canvas.Pen.Width:=3;
Canvas.Brush.Style:=bsClear;
canvas.Rectangle(rc);
end;

procedure TForm1.Button2Click(Sender: TObject);//擦掉
begin
form1.BorderWidth:=1;//也能擦掉BUTTON1边缘的框
form1.BorderWidth:=0;
end;
 
OK,我没有对你的代码有任何意见。我是说,你的代码只能在画在自己的窗体上!

比如,我要画在桌面,或其它程序的控件上。。。。你总不能也改变其它程序的窗体大小,
来引发局部涮新吧?

我说的局部涮新,是用API做,但我一直没搞定~
 
原来是这样,再想想~~
 
我试过将 Canvas.Pen.Mode:=pmXor; 改为 Canvas.Pen.Mode:=pmNotXor; 但是由于下边
框和右边框的效果非常不理想,我画的是红色的框,他的结果是蓝色的……
beyondair 的方法只能用于自己的窗体上,那对我来说就意义不大了!我很明显在问题的
现住部分就标明了[red]任意句柄的窗体(包括控件)画了个边框[/red],对于自己的边框
的确可以清除,但是对于其他窗体呢??[:(]
 
to 2位,这个问题并不像看上去的那么简单,不然,我上次问,就早解决了,呵呵~~

大家好好查查局部涮新的API吧!

2位的QQ和MSN是否能说一下?
 
画在屏幕上是没什么问题的,就是在画框那句代码和擦框的那句代码前都加上
Acanvas.Pen.Mode:=pmnotxor;
这个方法本来应该可以擦除的,但是窗体边框上有两部分颜色,而画框时只能一次画一种
颜色,我想这才会有左边和上边是对的,右边和下边是错的,我想这样,能这两部分分开
画,应该能搞得定了。
另外我不是很清楚,二位要怎么样把画在另外的窗体(或控件上),因为出在画布上的框,
窗体重画就会消失,Luis Pater给出的那段代码,我弄了一会也没法在第二个窗体上画框,
能不能再给说说,
 
笨方法:
DELPHI中的窗体外框难画,主要是左边和上边的最外一条线为白色,右边和下边的最外
一条线是黑色。
想到了一个笨方法,左边和上边的还按以前的画,右边和下边的线,画法如下:
如果本来画的线宽为3
1,先画最外一根线,把pen.mode设为pmblack,设线宽为1,画最外一条线
2,再将最外一根线的项点向里面移,再把pen.color设成clwindowFrame,
线宽为2
3,这样就把你原来画的线给覆盖了
 
干脆这样吧,我们用PmNotXor,画线,画四次直线,不就完了?

谁去试试啊?哈哈~~
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
900
SUNSTONE的Delphi笔记
S
后退
顶部