如何使memo的白底色透明,以便让显示在memo里的文字的背景图片为form的底图片???? 如何使memo的白底色透明,以便让显示在memo里的文字的背景图片为form的底图片???? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 就不要用memo了。直接在图上画个框框多好。 sixgj(轰炸机) 说的对顶~ 自已写一个Memo类,从TMemo继承,在WM_PAINT消息中使用下面函数处理透明,然后自已绘制文字,文字的Brush要设为bsClear.procedure DoTrans(Canvas : TCanvas; Control : TWinControl);var DC : HDC; SaveIndex : HDC; Position: TPoint;begin if Control.Parent <> nil then begin DC := Canvas.Handle; SaveIndex := SaveDC(DC); GetViewportOrgEx(DC, Position); SetViewportOrgEx(DC, Position.X - Control.Left, Position.Y - Control.Top, nil); IntersectClipRect(DC, 0, 0, Control.Parent.ClientWidth, Control.Parent.ClientHeight); Control.Parent.Perform(WM_ERASEBKGND, DC, 0); Control.Parent.Perform(WM_PAINT, DC, 0); RestoreDC(DC, SaveIndex); end;end;// 下面是在程序中的例子,只是说明如何用上面的函数而已;// 下面代码由于不是在类里写的,文字不是自绘的,所以有文字的地方不会透明,// 你参考一下写到你的Memo类里就行了。procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG; var Handled: Boolean);var Canvas:TCanvas;begin if Msg.hwnd = Memo1.Handle then begin if Msg.message = WM_PAINT then begin Canvas:=TCanvas.Create; Canvas.Handle := GetWindowDC(Memo1.Handle); DoTrans(Canvas,Memo1); Canvas.Free; end; end;end; 组件我帮你写出来了,不过有个缺陷,如果出现滚动条的话,会有点偏差,还有当选中文本时无法透明,你自已改进吧unit TranslateMemo;interfaceuses Windows, Messages, SysUtils, Classes, Controls, StdCtrls,Graphics;type TTranslateMemo = class(TMemo) private { Private declarations } procedure WMPaint(var Message: TWMSetFont); message WM_PAINT; protected { Protected declarations } public { Public declarations } published { Published declarations } end;procedure Register;procedure DoTrans(Canvas : TCanvas; Control : TWinControl);implementationprocedure Register;begin RegisterComponents('Lvyin', [TTranslateMemo]);end;procedure DoTrans(Canvas : TCanvas; Control : TWinControl);var DC : HDC; SaveIndex : HDC; Position: TPoint;begin if Control.Parent <> nil then begin DC := Canvas.Handle; SaveIndex := SaveDC(DC); GetViewportOrgEx(DC, Position); SetViewportOrgEx(DC, Position.X - Control.Left, Position.Y - Control.Top, nil); IntersectClipRect(DC, 0, 0, Control.Parent.ClientWidth, Control.Parent.ClientHeight); Control.Parent.Perform(WM_ERASEBKGND, DC, 0); Control.Parent.Perform(WM_PAINT, DC, 0); RestoreDC(DC, SaveIndex); end;end;procedure TTranslateMemo.WMPaint(var Message: TWMSetFont);const Offset=4; // 离边框的偏移量var Canvas:TCanvas; i:integer;begin inherited; Canvas:=TCanvas.Create; Canvas.Handle := GetWindowDC(Self.Handle); DoTrans(Canvas,Self); Canvas.Brush.Style := bsClear; Canvas.Rectangle(Self.ClientRect); Canvas.Font.Assign(Font); Canvas.Brush.Style := bsClear; for i:=0 to Self.Lines.Count -1 do Canvas.TextOut(Offset,i*Canvas.TextHeight(Self.Lines.Strings[i])+Offset,Self.Lines.Strings[i]); Canvas.Free;end;end. 一个最简单的方法就是将那个Memo控件窗口的属性设置增加一个:WS_EX_TRANSPARENT调用这个函数:SetWindowLong(Memo1.handle, GWL_EXSTYLE, WS_EX_TRANSPARENT);就可以了。上面这些人脑袋需要灵活点,别人楼主头昏。 回复人: smalltalk(老徐) ( ) 信誉:100 2003-11-26 23:01:00 得分:0 一个最简单的方法就是将那个Memo控件窗口的属性设置增加一个:WS_EX_TRANSPARENT调用这个函数:SetWindowLong(Memo1.handle, GWL_EXSTYLE, WS_EX_TRANSPARENT);就可以了。上面这些人脑袋需要灵活点,别人楼主头昏。=====呵呵,你这方法对Edit类的控件无用的。 我的原意:在带有背景图片的form显示一些文本文件的资料,并保持文字的背景为form的背景图片,我们以前的做法是直接把这些文字form的背景图片做成一张图片,但这样每次文字修改是很麻烦的。 我想通过memo读出来,但memo挡住了背景色。 不知各位还有什么方法可以进行处理。 dbgridEH控件 给个delphi2010下载地址 【奇文共赏】中国历史上曾经发动过的侵日战争【真实醒目】 关于拨号上网,连通后弹出广告的问题?急呀. Rave报表问题 两个TStringList A和B 我想在A中去除B中的所有相同的字段,怎么去除 如何当鼠标放置在BUTTON控件上时,改变Button控件的外观? Delphi和access数据库的问题,急,200分相送,解决后另送200分 dephi的弊端 我有一个问题亟待解决,向专家求教! 有关ProxyDesigner编程的问题,请高手,老手进!!!!!!! 急需.bmp .ico图标
顶~
procedure DoTrans(Canvas : TCanvas; Control : TWinControl);
var
DC : HDC;
SaveIndex : HDC;
Position: TPoint;
begin
if Control.Parent <> nil then
begin
DC := Canvas.Handle;
SaveIndex := SaveDC(DC);
GetViewportOrgEx(DC, Position);
SetViewportOrgEx(DC, Position.X - Control.Left, Position.Y - Control.Top, nil);
IntersectClipRect(DC, 0, 0, Control.Parent.ClientWidth, Control.Parent.ClientHeight);
Control.Parent.Perform(WM_ERASEBKGND, DC, 0);
Control.Parent.Perform(WM_PAINT, DC, 0);
RestoreDC(DC, SaveIndex);
end;
end;
// 下面是在程序中的例子,只是说明如何用上面的函数而已;
// 下面代码由于不是在类里写的,文字不是自绘的,所以有文字的地方不会透明,
// 你参考一下写到你的Memo类里就行了。
procedure TForm1.ApplicationEvents1Message(var Msg: tagMSG;
var Handled: Boolean);
var
Canvas:TCanvas;
begin
if Msg.hwnd = Memo1.Handle then
begin
if Msg.message = WM_PAINT then
begin
Canvas:=TCanvas.Create;
Canvas.Handle := GetWindowDC(Memo1.Handle);
DoTrans(Canvas,Memo1);
Canvas.Free;
end;
end;
end;
还有当选中文本时无法透明,你自已改进吧unit TranslateMemo;interfaceuses
Windows, Messages, SysUtils, Classes, Controls, StdCtrls,Graphics;type
TTranslateMemo = class(TMemo)
private
{ Private declarations }
procedure WMPaint(var Message: TWMSetFont); message WM_PAINT;
protected
{ Protected declarations }
public
{ Public declarations }
published
{ Published declarations }
end;procedure Register;
procedure DoTrans(Canvas : TCanvas; Control : TWinControl);implementationprocedure Register;
begin
RegisterComponents('Lvyin', [TTranslateMemo]);
end;procedure DoTrans(Canvas : TCanvas; Control : TWinControl);
var
DC : HDC;
SaveIndex : HDC;
Position: TPoint;
begin
if Control.Parent <> nil then
begin
DC := Canvas.Handle;
SaveIndex := SaveDC(DC);
GetViewportOrgEx(DC, Position);
SetViewportOrgEx(DC, Position.X - Control.Left, Position.Y - Control.Top, nil);
IntersectClipRect(DC, 0, 0, Control.Parent.ClientWidth, Control.Parent.ClientHeight);
Control.Parent.Perform(WM_ERASEBKGND, DC, 0);
Control.Parent.Perform(WM_PAINT, DC, 0);
RestoreDC(DC, SaveIndex);
end;
end;procedure TTranslateMemo.WMPaint(var Message: TWMSetFont);
const Offset=4; // 离边框的偏移量
var
Canvas:TCanvas;
i:integer;
begin
inherited;
Canvas:=TCanvas.Create;
Canvas.Handle := GetWindowDC(Self.Handle);
DoTrans(Canvas,Self);
Canvas.Brush.Style := bsClear;
Canvas.Rectangle(Self.ClientRect);
Canvas.Font.Assign(Font);
Canvas.Brush.Style := bsClear;
for i:=0 to Self.Lines.Count -1 do
Canvas.TextOut(Offset,i*Canvas.TextHeight(Self.Lines.Strings[i])+Offset,Self.Lines.Strings[i]);
Canvas.Free;
end;end.
调用这个函数:
SetWindowLong(Memo1.handle, GWL_EXSTYLE, WS_EX_TRANSPARENT);
就可以了。上面这些人脑袋需要灵活点,别人楼主头昏。
一个最简单的方法就是将那个Memo控件窗口的属性设置增加一个:WS_EX_TRANSPARENT
调用这个函数:
SetWindowLong(Memo1.handle, GWL_EXSTYLE, WS_EX_TRANSPARENT);
就可以了。上面这些人脑袋需要灵活点,别人楼主头昏。=====
呵呵,你这方法对Edit类的控件无用的。