TEdit,TMemo背景透明
The component below works perfectly, except for the following problem:
1) Saves the component below in a file "trancomp.pas".
Then, install this component in Delphi;
2) Later, open Delphi and create a new project;
3) Adds a TImage and a TTransMemo to the form;
4) Opens any image in the "PICTURE" property of TIMAGE. Adjust the size of TIMAGE so that TTransMEMO stays on TIMAGE;
5) Changes the "TRANSPARENT" property of TTransMemo for "TRUE". Also change the "SCROLLBARS" property for "Vertical".
6) Now, executes the project and try to slide the scroll bar (Up/Down). See that the background image "shakes" when the text is rolled upward or down.
Please, could anybody repair this problem in the component so that it works correctly?
------------------START OF COMPONENT----------------------
- unit TranComp;
- interface
- uses
- Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
- StdCtrls, ComCtrls;
- type
- TCtrl = class(TWinControl);
- TTransEdit = class(TEdit)
- private
- FAlignText: TAlignment;
- FTransparent: Boolean;
- FPainting: Boolean;
- procedure SetAlignText(Value: TAlignment);
- procedure SetTransparent(Value: Boolean);
- procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
- procedure WMNCPaint (var Message: TMessage); message WM_NCPAINT;
- procedure WMEraseBkGnd(var Message: TWMEraseBkGnd); message WM_ERASEBKGND;
- procedure CNCtlColorEdit(var Message: TWMCtlColorEdit); message CN_CTLCOLOREDIT;
- procedure CNCtlColorStatic(var Message: TWMCtlColorStatic); message CN_CTLCOLORSTATIC;
- procedure CMParentColorChanged(var Message: TMessage); message CM_PARENTCOLORCHANGED;
- procedure WMSize(var Message: TWMSize); message WM_SIZE;
- procedure WMMove(var Message: TWMMove); message WM_MOVE;
- protected
- procedure RepaintWindow;
- procedure CreateParams(var Params: TCreateParams); override;
- procedure Change; override;
- procedure SetParent(AParent: TWinControl); override;
- public
- constructor Create(AOwner: TComponent); override;
- destructor Destroy; override;
- published
- property AlignText: TAlignment read FAlignText write SetAlignText default taLeftJustify;
- property Transparent: Boolean read FTransparent write SetTransparent default false;
- end;
- // Transparent Memo
- TTransMemo = class(TMemo)
- private
- FAlignText: TAlignment;
- FTransparent: Boolean;
- FPainting: Boolean;
- procedure SetAlignText(Value: TAlignment);
- procedure SetTransparent(Value: Boolean);
- procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
- procedure WMNCPaint (var Message: TMessage); message WM_NCPAINT;
- procedure WMEraseBkGnd(var Message: TWMEraseBkGnd); message WM_ERASEBKGND;
- procedure CNCtlColorEdit(var Message: TWMCtlColorEdit); message CN_CTLCOLOREDIT;
- procedure CNCtlColorStatic(var Message: TWMCtlColorStatic); message CN_CTLCOLORSTATIC;
- procedure CMParentColorChanged(var Message: TMessage); message CM_PARENTCOLORCHANGED;
- procedure WMSize(var Message: TWMSize); message WM_SIZE;
- procedure WMMove(var Message: TWMMove); message WM_MOVE;
- protected
- procedure RepaintWindow;
- procedure CreateParams(var Params: TCreateParams); override;
- procedure Change; override;
- procedure SetParent(AParent: TWinControl); override;
- public
- constructor Create(AOwner: TComponent); override;
- destructor Destroy; override;
- published
- property AlignText: TAlignment read FAlignText write SetAlignText default taLeftJustify;
- property Transparent: Boolean read FTransparent write SetTransparent default false;
- end;
- procedure Register;
- implementation
- const
- BorderRec: array[TBorderStyle] of Integer = (, -);
- procedure Register;
- begin
- RegisterComponents('Transparent Components', [TTransEdit, TTransMemo]);
- end;
- function GetScreenClient(Control: TControl): TPoint;
- var
- p: TPoint;
- begin
- p := Control.ClientOrigin;
- ScreenToClient(Control.Parent.Handle, p);
- Result := p;
- end;
- constructor TTransEdit.Create(AOwner: TComponent);
- begin
- inherited Create(AOwner);
- FAlignText := taLeftJustify;
- FTransparent := false;
- FPainting := false;
- end;
- destructor TTransEdit.Destroy;
- begin
- inherited Destroy;
- end;
- procedure TTransEdit.SetAlignText(Value: TAlignment);
- begin
- if FAlignText <> Value then
- begin
- FAlignText := Value;
- RecreateWnd;
- Invalidate;
- end;
- end;
- procedure TTransEdit.SetTransparent(Value: Boolean);
- begin
- if FTransparent <> Value then
- begin
- FTransparent := Value;
- Invalidate;
- end;
- end;
- procedure TTransEdit.WMEraseBkGnd(var Message: TWMEraseBkGnd);
- var
- DC: hDC;
- i: integer;
- p: TPoint;
- begin
- if FTransparent then
- begin
- if Assigned(Parent) then
- begin
- DC := Message.DC;
- i := SaveDC(DC);
- p := GetScreenClient(self);
- p.x := -p.x;
- p.y := -p.y;
- MoveWindowOrg(DC, p.x, p.y);
- SendMessage(Parent.Handle, $, DC, );
- TCtrl(Parent).PaintControls(DC, nil);
- RestoreDC(DC, i);
- end;
- end else inherited;
- end;
- procedure TTransEdit.WMPaint(var Message: TWMPaint);
- begin
- inherited;
- if FTransparent then
- if not FPainting then
- RepaintWindow;
- end;
- procedure TTransEdit.WMNCPaint(var Message: TMessage);
- begin
- inherited;
- end;
- procedure TTransEdit.CNCtlColorEdit(var Message: TWMCtlColorEdit);
- begin
- inherited;
- if FTransparent then
- SetBkMode(Message.ChildDC, );
- end;
- procedure TTransEdit.CNCtlColorStatic(var Message: TWMCtlColorStatic);
- begin
- inherited;
- if FTransparent then
- SetBkMode(Message.ChildDC, );
- end;
- procedure TTransEdit.CMParentColorChanged(var Message: TMessage);
- begin
- inherited;
- if FTransparent then
- Invalidate;
- end;
- procedure TTransEdit.WMSize(var Message: TWMSize);
- begin
- inherited;
- Invalidate;
- end;
- procedure TTransEdit.WMMove(var Message: TWMMove);
- begin
- inherited;
- Invalidate;
- end;
- procedure TTransEdit.RepaintWindow;
- var
- DC: hDC;
- TmpBitmap, Bitmap: hBitmap;
- begin
- if FTransparent then
- begin
- FPainting := true;
- HideCaret(Handle);
- DC := CreateCompatibleDC(GetDC(Handle));
- TmpBitmap := CreateCompatibleBitmap(GetDC(Handle), Succ(ClientWidth), Succ(ClientHeight));
- Bitmap := SelectObject(DC, TmpBitmap);
- PaintTo(DC, , );
- BitBlt(GetDC(Handle), BorderRec[BorderStyle], BorderRec[BorderStyle], ClientWidth, ClientHeight, DC, , , SRCCOPY);
- SelectObject(DC, Bitmap);
- DeleteDC(DC);
- ReleaseDC(Handle, GetDC(Handle));
- DeleteObject(TmpBitmap);
- ShowCaret(Handle);
- FPainting := false;
- end;
- end;
- procedure TTransEdit.CreateParams(var Params: TCreateParams);
- const
- Alignments: array [TAlignment] of DWord = (ES_LEFT, ES_RIGHT, ES_CENTER);
- begin
- inherited CreateParams(Params);
- Params.Style := Params.Style or ES_MULTILINE or Alignments[FAlignText];
- end;
- procedure TTransEdit.Change;
- begin
- RepaintWindow;
- inherited Change;
- end;
- procedure TTransEdit.SetParent(AParent: TWinControl);
- begin
- inherited SetParent(AParent);
- end;
- // Transparent Memo
- constructor TTransMemo.Create(AOwner: TComponent);
- begin
- inherited Create(AOwner);
- FAlignText := taLeftJustify;
- FTransparent := false;
- FPainting := false;
- end;
- destructor TTransMemo.Destroy;
- begin
- inherited Destroy;
- end;
- procedure TTransMemo.SetAlignText(Value: TAlignment);
- begin
- if FAlignText <> Value then
- begin
- FAlignText := Value;
- RecreateWnd;
- Invalidate;
- end;
- end;
- procedure TTransMemo.SetTransparent(Value: Boolean);
- begin
- if FTransparent <> Value then
- begin
- FTransparent := Value;
- Invalidate;
- end;
- end;
- procedure TTransMemo.WMEraseBkGnd(var Message: TWMEraseBkGnd);
- var
- DC: hDC;
- i: integer;
- p: TPoint;
- begin
- if FTransparent then
- begin
- if Assigned(Parent) then
- begin
- DC := Message.DC;
- i := SaveDC(DC);
- p := GetScreenClient(self);
- p.x := -p.x;
- p.y := -p.y;
- MoveWindowOrg(DC, p.x, p.y);
- SendMessage(Parent.Handle, $, DC, );
- TCtrl(Parent).PaintControls(DC, nil);
- RestoreDC(DC, i);
- end;
- end else inherited;
- end;
- procedure TTransMemo.WMPaint(var Message: TWMPaint);
- begin
- inherited;
- if FTransparent then
- if not FPainting then
- RepaintWindow;
- end;
- procedure TTransMemo.WMNCPaint(var Message: TMessage);
- begin
- inherited;
- end;
- procedure TTransMemo.CNCtlColorEdit(var Message: TWMCtlColorEdit);
- begin
- inherited;
- if FTransparent then
- SetBkMode(Message.ChildDC, );
- end;
- procedure TTransMemo.CNCtlColorStatic(var Message: TWMCtlColorStatic);
- begin
- inherited;
- if FTransparent then
- SetBkMode(Message.ChildDC, );
- end;
- procedure TTransMemo.CMParentColorChanged(var Message: TMessage);
- begin
- inherited;
- if FTransparent then
- Invalidate;
- end;
- procedure TTransMemo.WMSize(var Message: TWMSize);
- begin
- inherited;
- Invalidate;
- end;
- procedure TTransMemo.WMMove(var Message: TWMMove);
- begin
- inherited;
- Invalidate;
- end;
- procedure TTransMemo.RepaintWindow;
- var
- DC: hDC;
- TmpBitmap, Bitmap: hBitmap;
- begin
- if FTransparent then
- begin
- FPainting := true;
- HideCaret(Handle);
- DC := CreateCompatibleDC(GetDC(Handle));
- TmpBitmap := CreateCompatibleBitmap(GetDC(Handle), Succ(ClientWidth), Succ(ClientHeight));
- Bitmap := SelectObject(DC, TmpBitmap);
- PaintTo(DC, , );
- BitBlt(GetDC(Handle), BorderRec[BorderStyle], BorderRec[BorderStyle], ClientWidth, ClientHeight, DC, , , SRCCOPY);
- SelectObject(DC, Bitmap);
- DeleteDC(DC);
- ReleaseDC(Handle, GetDC(Handle));
- DeleteObject(TmpBitmap);
- ShowCaret(Handle);
- FPainting := false;
- end;
- end;
- procedure TTransMemo.CreateParams(var Params: TCreateParams);
- const
- Alignments: array [TAlignment] of DWord = (ES_LEFT, ES_RIGHT, ES_CENTER);
- begin
- inherited CreateParams(Params);
- Params.Style := Params.Style or ES_MULTILINE or Alignments[FAlignText];
- end;
- procedure TTransMemo.Change;
- begin
- RepaintWindow;
- inherited Change;
- end;
- procedure TTransMemo.SetParent(AParent: TWinControl);
- begin
- inherited SetParent(AParent);
- end;
- end.
下面的代码如果memo已有内容,回到已有内容中间处修改,旧的文本笔画会和新的文本笔画混合。文本笔画背景未完全檫除。效果不好
- type
- TForm1 =class(TForm)
- private
- { Private declarations }
- FBitmap: TBitmap;
- FBrush: HBRUSH;
- Edit1: TEdit;
- Memo1: TMemo;
- Image2:TImage;//背景图片
- protected
- procedure WndProc(var Message: TMessage); override;
- end;
- procedure TForm1.FormCreate(Sender: TObject);
- begin
- FBitmap := TBitmap.Create;
- FBitmap.SetSize(Memo1.Width,Memo1.Height);
- FBitMap.Canvas.CopyRect(
- types.Rect(,,FBitmap.Width,FBitmap.Height),
- Image2.Canvas,
- types.Rect(memo1.Left,memo1.Top,memo1.Left+Memo1.Width,memo1.Top+Memo1.Height));
- FBrush := CreateSolidBrush(FBitmap.Handle);
- SetWindowLong(Edit1.Handle,GWL_EXSTYLE,GetWindowLong(Edit1.Handle,GWL_EXSTYLE) or WS_EX_TRANSPARENT); // 增加透明风格
- SetWindowLong(Memo1.Handle,GWL_EXSTYLE,GetWindowLong(Memo1.Handle,GWL_EXSTYLE) or WS_EX_TRANSPARENT);
- end;
- procedure TForm1.FormPaint(Sender: TObject);
- begin
- Canvas.Brush.Handle:=FBrush;
- Canvas.Rectangle(,,width,height);
- end;
- procedure TForm1.WndProc(var Message: TMessage);
- begin
- inherited;
- case Message.Msg of
- WM_CTLCOLOREDIT, WM_CTLCOLORSTATIC:
- SetBkMode(Message.WParam, TRANSPARENT);
- Message.Result := FBrush;//GetStockObject(NULL_BRUSH);
- end;
- end;
TEdit,TMemo背景透明的更多相关文章
- TEdit,TMemo背景透明(SetWindowLong(WS_EX_TRANSPARENT)增加透明风格)
The component below works perfectly, except for the following problem: 1) Saves the component below ...
- 【原】CSS实现背景透明,文字不透明,兼容所有浏览器
11.11是公司成立的日子,16岁啦,我呢3岁半,感谢公司给了这样一个平台,让我得以学习和成长,这里祝愿公司发展越来越好~ 进入主题,每年11月11号是光棍节,产生于校园,本来只是一流传于年轻人的娱乐 ...
- CSS实现背景透明,文字不透明(兼容各浏览器)
在 FF/Chrome 等较新的浏览器中可以使用css属性background- color的rgba轻松实现背景透明,而文字保持不透明.而IE6/7/8浏览器不支持rgba,只有使用IE的专属滤镜f ...
- CSS实现背景透明,文字不透明,兼容所有浏览器
11.11是公司成立的日子,16岁啦,我呢3岁半,感谢公司给了这样一个平台,让我得以学习和成长,这里祝愿公司发展越来越好~ 进入主题,每年11月11号是光棍节,产生于校园,本来只是一流传于年轻人的娱乐 ...
- css 背景透明文字(内容)不透明三种实现方法
好久没写博客了.以前还想着最少一个月抽空写几篇.结果没做到O(∩_∩)O~~.好吧.现在努力,继续坚持. 看着以前写的东西,感觉自己在逐渐成长. 先上图: 本文主要记录如上图一样的.文字或内容不透明, ...
- VC++ CStatic控件背景透明且改变其文本时,文字重叠解决方法
最近在项目中将CStatic控件设置为背景透明且在一个定时器函数改变其文本,结果CStatic的文字重叠了.解决该问题的方案是:从CStatic类派生自己的静态文本控件. 其实设置背景透明,也就是在C ...
- 用Photoshop处理图片使背景透明
用Photoshop处理图片使背景透明 打开一张图片 双击背景或者右键背景图层,新建一个图层, 选择魔棒工具,单击图片, 会自动选择颜色相近的范围 按下键盘的delete键,就可以删除魔棒所选择的区域 ...
- android 自定义Dialog背景透明及显示位置设置
先贴一下显示效果图,仅作参考: 代码如下: 1.自定义Dialog public class SelectDialog extends AlertDialog{ public SelectDialog ...
- <select>在chrome浏览器下背景透明问题
在上篇文章<只用CSS美化选择框>运用了背景透明的技巧来美化选择框,但在chrome浏览器下遇到了跟ie.ff不一样的透明效果,下面重现一下: 在一个大的div(背景红色)内放置一个sel ...
随机推荐
- 装有Win7系统的电脑在局域网不能共享的解决方案
Win7系统的网络功能比XP有了进一步的增强,使用起来也相对清晰.但是由于做了很多表面优化的工作,使得底层的网络设置对于习惯了XP系统的人来说变得很不适应,其中局域网组建就是一个很大的问题.默认安装系 ...
- WebService学习笔记系列(一)
webservice主要是解决两个系统或者两个应用程序之间的远程调用,它提供了一种通过web方式访问的api,调用是跨语言.跨平台的. webservice的客户端与服务端进行交互的时候使用xml来传 ...
- linux下实现tomcat定时自动重启
tomcat自带的脚本中没有提供直接restart的模式,但是有start和shutdown两种模式.要实现restart模式,实际上只需要判断是否已经启动tomcat,若已经启动则限制性shutdo ...
- Linq分页
/// <summary> /// Linq分页 /// </summary> ;//每页条数 ;//总条数 ;//当前第几页 public static string con ...
- C#将DataTable导出Execl、Word、Xml
/// <summary> /// 将DT转换为Execl的方法 /// </summary> /// <param name=" ...
- 二分图的判定hihocoder1121 and hdu3478
这两个题目都是二分图的判定,用dfs染色比较容易写. 算法流程: 选取一个没有染色的点,然后将这个点染色,那么跟他相连的所有点一定是不同颜色的,所以,如果存在已经染过颜色的,如果和这个颜色相同的话,就 ...
- Spring AOP体系学习总结:
二.Spring AOP体系学习总结: 要理解AOP整体的逻辑需要理解一下Advice,Pointcut,Advisor的概念以及他们的关系. Advice是为Spring Bean提供增强逻辑的接口 ...
- Mac Zip命令
mac终端命令 zip -[parameter] [yourName].zip someFileOrDiectory -q 表示不显示压缩进度状态 -r 表示子目录子文件全部压缩为zip //这部比较 ...
- ERROR ITMS-90167: "No .app bundles found in the package"
http://stackoverflow.com/questions/37838487/error-itms-90167-no-app-bundles-found-in-the-package 简单说 ...
- _BLOCK_TYPE_IS_VALID 问题解析及处理
直接原因: 释放内存时,内存已经被修改或释放. 产生可能: 1.内存越界操作,踩了待释放指针头信息. 2.重复释放指针. 处理: 采用排除法,逐步屏蔽掉一些代码,当屏蔽某些代码时,不抛此异常,说明问题 ...