画Edit1边框颜色线? ( 积分: 50 )

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

bbscom

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure TForm1.Button1Click(Sender: TObject);
var
Acanvas:TcontrolCanvas;
begin
// Edit1.Ctl3D:=False;
Edit1.Text:='目标:画边框颜色线'; // <---这是我要的结果
Acanvas:=TcontrolCanvas.create;
Acanvas.Control:=Edit1;
Acanvas.Pen.Color:=$00B99D7F;
Acanvas.Rectangle(0,0,Edit1.width,Edit1.height);
{
需要解决的缺点:
1、画上线后变量不显示,当鼠标进入焦点时变量又显示出来了。
2、当FORM窗口最小化或切换其它窗口时,画的颜色线又变黑色了。
}
end;
 
按你的要求,就需要重载TEdit生成新的控件了
 
我继承一个新的,然后把上面的方法加到里也不行。
只要解决问题就可以了。请bjaman明示。
 
要重载 ondraw 才行。
 
请白河愁列出实例代码,ondraw怎么用呀。谢谢!!!
 
从TEdit继承一个新控件, 在它的重绘方法中画你要的边框. 否则你画完下次控件重绘的时候就会消失.
 
[red]从TEdit继承一个新控件:
constructor TLineEdit.Create(AOwner: TComponent);
var
Acanvas:TcontrolCanvas;
begin
inherited Create(AOwner);
Acanvas:=TcontrolCanvas.create;
Acanvas.Control:=Self;
Acanvas.Pen.Color:=$00B99D7F;
Acanvas.Rectangle(0,0,Self.Width,Self.Height);
end;
编译没有出现任何异常。

在Form窗口上放上面的控件就出现错误:
Control '' has no parent window.[/red]
 
告诉你个笨办法,不用那么麻烦的,直接在edit下放个shape把pen属性的color改下颜色,然后按你edit调下大小就ok了,我以前就这么做的
 
GetWindowLong
SetWindowLong
这样可以解决,但是不好
继承的好些,在Paint中绘制,相当于你自己做组件了
 
unit Unit1;

interface

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

type
TForm1 = class(TForm)
Edit1: TEdit;
procedure FormShow(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
FEditWnd: TWndMethod;
procedure EditWndProc(var Message: TMessage);
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.EditWndProc(var Message: TMessage);
var
Acanvas: TcontrolCanvas;
begin
FEditWnd(Message);
if Message.Msg = WM_PAINT then
begin
Acanvas:=TcontrolCanvas.create;
Acanvas.Control := Edit1;
Acanvas.Brush.Color:=$00B99D7F;
Acanvas.FrameRect(Edit1.ClientRect);
end;
end;

procedure TForm1.FormShow(Sender: TObject);
begin
Edit1.Ctl3D:=False;
FEditWnd := Edit1.WindowProc;
Edit1.WindowProc := EditWndProc;
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
Edit1.WindowProc := FEditWnd;
end;

end.
搞出来就是XP样式啊
 
lake_cx, 你好!
首先谢谢你。不过我在测试中也发现错误。

当下列两行为一个事件执行一次以上(N次)后,[red]关闭时 FEditWnd(Message);出错[/red]。
[blue] FEditWnd := Edit1.WindowProc;
Edit1.WindowProc := EditWndProc;[/blue]
 
[:(]
那是当然的,那是初始化,当然不能执行多次
其实是获取和设置Edit1的窗体消息处理函数,怎么能执行多次
先好好研究Windows窗体的创建及消息循环吧
 
我的控件比楼主想要的还要cool, 不但可以改边框,还可以在文本前显示图标,
显示下拉框和按钮,还可以显示图像等等,http://free.ys168.com/?kinneng
相对整套控件,边框是个小小小小小问题,还不怎么令人头痛,

边框部分是这样实现的:
protected
procedure PaintWindow(DC: HDC); override; //覆盖这个事件

constructor TEXCHNDBComboBox.Create(AOwner: TComponent);
begin
*****
FCanvas := TControlCanvas.Create;
FCanvas.Control := Self;
******
end;

procedure TEXCHNDBComboBox.PaintWindow(DC: HDC);
begin
***** 与本贴问题无关的处理
inherited;
***** 与本贴问题无关的处理

FCanvas ***** 绘边框在这里开始,自己爱怎么绘就怎么绘,不要抄我的

*****
end;
 
kinneng,你好!请发一份给我:Delphi2005@163.com

我要的最终结果是:TDBEdit + TSpeedButton 合并一个控件。
也就是说TDBEdit控件的最右边添加TSpeedButton点击控件为一体,具有两者各自相同的方法。
 
...搞了半天是要控件
随便一套Rz的不就有了。。。
 
不懂,帮顶一下
 
我做过一个 edit+speedbutton 的
就是组合控件
 
但是那个是我工作中用到的,可能和你的不一样
我做的是我需要的功能
但是很简单,不敢拿来献丑

你要是想看可以发邮件给你

qijianzhou289@sohu.com 是我的邮箱
 
已经发了,我的邮箱是:Delphi2005@163.com
 
qi_jianzhou, 谢谢你!!!
你写得很好,有些地点我也用得上。

kinneng, 你好!你可以发给我源代码试一试吗?
 
后退
顶部