谁有带源码的透明edit控件,或者详细的制作方法.(200分)

  • 主题发起人 主题发起人 popeye
  • 开始时间 开始时间
P

popeye

Unregistered / Unconfirmed
GUEST, unregistred user!
1.在深度历险中没有找到透明的edit.

2.本论坛按'透明'搜索,结果是有的大虾说有这个东东;有的大虾说很容易;
有的大虾给出了一些制作思路,如:
透明的Edit没见过, 不过可以自己做一个. 两种方法做透明的TControl, 一个是无背
景的, 另外一个是有背景的. 无背景是指一个TControl不带有自己的背景全部透明,
有背景的是说一个TControl需要用paint将背景画上去.

做一个无背景的十分简单, 只需继承一个TEdit, 当Create时候将csOpaque从它的
ControlStyle中去掉. 但是有一个问题, 那就是Delphi不能过自动刷新他(paint),
每次更新的以后可以用ReCreateWnd刷新.

做一个有背景的也不难, 只需在paint时候先将他背后的图像复制过来作为它的背景,
然后在画它的前景. 记得那位大虾做过一个透明的 hintWindow.

可是我去掉了csopaque也不行

3.我不想要控件包里的某一个控件,而是单独的一个.关键是源码.我想知道如何才能做
出来.

4.我的最终目的是想让dbgrid的cell在编辑状态下去掉白色背景成为透明,有这方面的
建议也可以.

本人愚钝,请各位大虾不吝赐教.在此先行谢过了.
 
参照一下FlatStyle,或者对你有用。
http://www.flatstyle.de (带源码)
 
手头有一个透明Memo,极短,才100行。把Memo替换成Edit,应是透明Edit。
作者似乎是 CoolForm 的作者,贴在此供参考。
unit TrMemo;
{$R-}
interface

uses
Windows, Messages, Controls, StdCtrls, Classes;

const
TMWM__SpecialInvalidate = WM_USER + 1111;

type
TTransparentMemo = class(TMemo)
private
procedure SpecialInvalidate(var Message:TMessage); message TMWM__SpecialInvalidate;
procedure WMHScroll(var Message: TWMHScroll); message WM_HSCROLL;
procedure WMVScroll(var Message: TWMVScroll); message WM_VSCROLL;
procedure WMSetText(var Message:TWMSetText); message WM_SETTEXT;
procedure CNCTLCOLOREDIT(var Message:TWMCTLCOLOREDIT); message CN_CTLCOLOREDIT;
procedure WMKeyDown(var Message: TWMKeyDown); message WM_KEYDOWN;
procedure WMEraseBkgnd(var Message: TWMEraseBkgnd); message WM_ERASEBKGND;
protected
procedure CreateParams(var Params: TCreateParams); override;
public
constructor Create(AOwner: TComponent); override;
end;

procedure Register;

implementation

{ TTransparentMemo }
procedure TTransparentMemo.WMHScroll(var Message: TWMHScroll);
begin
inherited;
PostMessage(Handle,TMWM__SpecialInvalidate,0,0);
end;

procedure TTransparentMemo.WMVScroll(var Message: TWMVScroll);
begin
SendMessage(Handle,TMWM__SpecialInvalidate,0,0);
inherited;
PostMessage(Handle,TMWM__SpecialInvalidate,0,0);
end;

procedure TTransparentMemo.CNCTLCOLOREDIT(var Message:TWMCTLCOLOREDIT);
begin
with Message do
begin
SetBkMode(ChildDC,TRANSPARENT);
Result:=GetStockObject(HOLLOW_BRUSH)
end
end;

procedure TTransparentMemo.WMSetText(var Message:TWMSetText);
begin
inherited;
if not (csDesigning in ComponentState) then
PostMessage(Handle,TMWM__SpecialInvalidate,0,0)
end;

procedure TTransparentMemo.SpecialInvalidate(var Message:TMessage);
var r:TRect;
begin
if Parent<>nil then
begin
r:=ClientRect;
r.TopLeft:=Parent.ScreenToClient(ClientToScreen(r.TopLeft));
r.BottomRight:=Parent.ScreenToClient(ClientToScreen(r.BottomRight));
InvalidateRect(Parent.Handle,@r,true);
RedrawWindow(Handle,nil,0,RDW_FRAME+RDW_INVALIDATE)
end;
end;

procedure TTransparentMemo.WMKeyDown(var Message: TWMKeyDown);
begin
SendMessage(Handle,TMWM__SpecialInvalidate,0,0);
inherited;
PostMessage(Handle,TMWM__SpecialInvalidate,0,0);
end;

procedure TTransparentMemo.WMEraseBkgnd(var Message: TWMEraseBkgnd);
begin
Message.Result := 1;
end;

constructor TTransparentMemo.Create(AOwner: TComponent);
begin
inherited;
ControlStyle := [csCaptureMouse, csDesignInteractive, csClickEvents,
csSetCaption, csOpaque, csDoubleClicks, csReplicatable, csNoStdEvents];
end;

procedure TTransparentMemo.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
with Params do
begin
ExStyle:=ExStyle or WS_EX_TRANSPARENT and not WS_EX_WINDOWEDGE
and not WS_EX_STATICEDGE and not WS_EX_DLGMODALFRAME and not WS_EX_CLIENTEDGE;
end;
end;

procedure Register;
begin
RegisterComponents('cool!', [tTransparentMemo]);
end;

end.
 
太简单了,用CoolControls控件包就行了,里面的控件都可以设置墙纸或
透明效果,主要都在特性的Option或ExOption里面,一看就懂。ftp://my.szptt.net.cn/JGK8DXS9XFUCP/delphivcl/0418/
 
Calvin: 我下载了,这套控件挺不错,但是其中的edit控件不支持透明.

Croco: 很好!真的可以透明.把TMemo改成TEdit就可以让TEdit透明.但是我发现
不论字体的颜色如何,显示出来的都是黑色.看了一下源码,觉得和
procedure CNCTLCOLOREDIT(var Message:TWMCTLCOLOREDIT);
message CN_CTLCOLOREDIT;有关.去掉这个过程颜色就正常了;可是这个
过程的begin和end之间什么都不做字体也是黑色.它给TWMCTLCOLOREDIT
消息返回一个用于绘制edit控件的brush.怎么会把字体换掉了呢?
cch_b: coolcontrols控件打包文件的后缀是ace,用什么解压缩?winzip不行.
 
www.csdn.net/delphi
 
我在DSP中按'透明'搜索到一个fusion.zip,其中有一个透明的Edit
和Croco贴出来的一样的.字体的颜色也总是黑色.
 
Woll2Woll 公司的两项产品(InfoPower、1stClass)均可以设成Transparent为True,均包含Source Code。
 
procedure TTransparentMemo.CNCTLCOLOREDIT(var Message:TWMCTLCOLOREDIT);
begin
with Message do
begin
SetBkMode(ChildDC,TRANSPARENT);
Result:=GetStockObject(HOLLOW_BRUSH)
end
end;

可能是这一句的毛病,总是HOLLOW_BRUSH, 改一下试试。
 
hollow_brush=null brush 空的刷子,该怎么改呢?
 
多人接受答案了。
 

Similar threads

回复
0
查看
1K
不得闲
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
911
SUNSTONE的Delphi笔记
S
后退
顶部