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----------------------

  1. unit TranComp;
  2.  
  3. interface
  4.  
  5. uses
  6. Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  7. StdCtrls, ComCtrls;
  8.  
  9. type
  10. TCtrl = class(TWinControl);
  11.  
  12. TTransEdit = class(TEdit)
  13. private
  14. FAlignText: TAlignment;
  15. FTransparent: Boolean;
  16. FPainting: Boolean;
  17. procedure SetAlignText(Value: TAlignment);
  18. procedure SetTransparent(Value: Boolean);
  19. procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  20. procedure WMNCPaint (var Message: TMessage); message WM_NCPAINT;
  21. procedure WMEraseBkGnd(var Message: TWMEraseBkGnd); message WM_ERASEBKGND;
  22. procedure CNCtlColorEdit(var Message: TWMCtlColorEdit); message CN_CTLCOLOREDIT;
  23. procedure CNCtlColorStatic(var Message: TWMCtlColorStatic); message CN_CTLCOLORSTATIC;
  24. procedure CMParentColorChanged(var Message: TMessage); message CM_PARENTCOLORCHANGED;
  25. procedure WMSize(var Message: TWMSize); message WM_SIZE;
  26. procedure WMMove(var Message: TWMMove); message WM_MOVE;
  27. protected
  28. procedure RepaintWindow;
  29. procedure CreateParams(var Params: TCreateParams); override;
  30. procedure Change; override;
  31. procedure SetParent(AParent: TWinControl); override;
  32. public
  33. constructor Create(AOwner: TComponent); override;
  34. destructor Destroy; override;
  35. published
  36. property AlignText: TAlignment read FAlignText write SetAlignText default taLeftJustify;
  37. property Transparent: Boolean read FTransparent write SetTransparent default false;
  38. end;
  39.  
  40. // Transparent Memo
  41. TTransMemo = class(TMemo)
  42. private
  43. FAlignText: TAlignment;
  44. FTransparent: Boolean;
  45. FPainting: Boolean;
  46. procedure SetAlignText(Value: TAlignment);
  47. procedure SetTransparent(Value: Boolean);
  48. procedure WMPaint(var Message: TWMPaint); message WM_PAINT;
  49. procedure WMNCPaint (var Message: TMessage); message WM_NCPAINT;
  50. procedure WMEraseBkGnd(var Message: TWMEraseBkGnd); message WM_ERASEBKGND;
  51. procedure CNCtlColorEdit(var Message: TWMCtlColorEdit); message CN_CTLCOLOREDIT;
  52. procedure CNCtlColorStatic(var Message: TWMCtlColorStatic); message CN_CTLCOLORSTATIC;
  53. procedure CMParentColorChanged(var Message: TMessage); message CM_PARENTCOLORCHANGED;
  54. procedure WMSize(var Message: TWMSize); message WM_SIZE;
  55. procedure WMMove(var Message: TWMMove); message WM_MOVE;
  56. protected
  57. procedure RepaintWindow;
  58. procedure CreateParams(var Params: TCreateParams); override;
  59. procedure Change; override;
  60. procedure SetParent(AParent: TWinControl); override;
  61. public
  62. constructor Create(AOwner: TComponent); override;
  63. destructor Destroy; override;
  64. published
  65. property AlignText: TAlignment read FAlignText write SetAlignText default taLeftJustify;
  66. property Transparent: Boolean read FTransparent write SetTransparent default false;
  67. end;
  68.  
  69. procedure Register;
  70.  
  71. implementation
  72.  
  73. const
  74. BorderRec: array[TBorderStyle] of Integer = (, -);
  75.  
  76. procedure Register;
  77. begin
  78. RegisterComponents('Transparent Components', [TTransEdit, TTransMemo]);
  79. end;
  80.  
  81. function GetScreenClient(Control: TControl): TPoint;
  82. var
  83. p: TPoint;
  84. begin
  85. p := Control.ClientOrigin;
  86. ScreenToClient(Control.Parent.Handle, p);
  87. Result := p;
  88. end;
  89.  
  90. constructor TTransEdit.Create(AOwner: TComponent);
  91. begin
  92. inherited Create(AOwner);
  93. FAlignText := taLeftJustify;
  94. FTransparent := false;
  95. FPainting := false;
  96. end;
  97.  
  98. destructor TTransEdit.Destroy;
  99. begin
  100. inherited Destroy;
  101. end;
  102.  
  103. procedure TTransEdit.SetAlignText(Value: TAlignment);
  104. begin
  105. if FAlignText <> Value then
  106. begin
  107. FAlignText := Value;
  108. RecreateWnd;
  109. Invalidate;
  110. end;
  111. end;
  112.  
  113. procedure TTransEdit.SetTransparent(Value: Boolean);
  114. begin
  115. if FTransparent <> Value then
  116. begin
  117. FTransparent := Value;
  118. Invalidate;
  119. end;
  120. end;
  121.  
  122. procedure TTransEdit.WMEraseBkGnd(var Message: TWMEraseBkGnd);
  123. var
  124. DC: hDC;
  125. i: integer;
  126. p: TPoint;
  127. begin
  128. if FTransparent then
  129. begin
  130. if Assigned(Parent) then
  131. begin
  132. DC := Message.DC;
  133. i := SaveDC(DC);
  134. p := GetScreenClient(self);
  135. p.x := -p.x;
  136. p.y := -p.y;
  137. MoveWindowOrg(DC, p.x, p.y);
  138. SendMessage(Parent.Handle, $, DC, );
  139. TCtrl(Parent).PaintControls(DC, nil);
  140. RestoreDC(DC, i);
  141. end;
  142. end else inherited;
  143. end;
  144.  
  145. procedure TTransEdit.WMPaint(var Message: TWMPaint);
  146. begin
  147. inherited;
  148. if FTransparent then
  149. if not FPainting then
  150. RepaintWindow;
  151. end;
  152.  
  153. procedure TTransEdit.WMNCPaint(var Message: TMessage);
  154. begin
  155. inherited;
  156. end;
  157.  
  158. procedure TTransEdit.CNCtlColorEdit(var Message: TWMCtlColorEdit);
  159. begin
  160. inherited;
  161. if FTransparent then
  162. SetBkMode(Message.ChildDC, );
  163. end;
  164.  
  165. procedure TTransEdit.CNCtlColorStatic(var Message: TWMCtlColorStatic);
  166. begin
  167. inherited;
  168. if FTransparent then
  169. SetBkMode(Message.ChildDC, );
  170. end;
  171.  
  172. procedure TTransEdit.CMParentColorChanged(var Message: TMessage);
  173. begin
  174. inherited;
  175. if FTransparent then
  176. Invalidate;
  177. end;
  178.  
  179. procedure TTransEdit.WMSize(var Message: TWMSize);
  180. begin
  181. inherited;
  182. Invalidate;
  183. end;
  184.  
  185. procedure TTransEdit.WMMove(var Message: TWMMove);
  186. begin
  187. inherited;
  188. Invalidate;
  189. end;
  190.  
  191. procedure TTransEdit.RepaintWindow;
  192. var
  193. DC: hDC;
  194. TmpBitmap, Bitmap: hBitmap;
  195. begin
  196. if FTransparent then
  197. begin
  198. FPainting := true;
  199. HideCaret(Handle);
  200. DC := CreateCompatibleDC(GetDC(Handle));
  201. TmpBitmap := CreateCompatibleBitmap(GetDC(Handle), Succ(ClientWidth), Succ(ClientHeight));
  202. Bitmap := SelectObject(DC, TmpBitmap);
  203. PaintTo(DC, , );
  204. BitBlt(GetDC(Handle), BorderRec[BorderStyle], BorderRec[BorderStyle], ClientWidth, ClientHeight, DC, , , SRCCOPY);
  205. SelectObject(DC, Bitmap);
  206. DeleteDC(DC);
  207. ReleaseDC(Handle, GetDC(Handle));
  208. DeleteObject(TmpBitmap);
  209. ShowCaret(Handle);
  210. FPainting := false;
  211. end;
  212. end;
  213.  
  214. procedure TTransEdit.CreateParams(var Params: TCreateParams);
  215. const
  216. Alignments: array [TAlignment] of DWord = (ES_LEFT, ES_RIGHT, ES_CENTER);
  217. begin
  218. inherited CreateParams(Params);
  219. Params.Style := Params.Style or ES_MULTILINE or Alignments[FAlignText];
  220. end;
  221.  
  222. procedure TTransEdit.Change;
  223. begin
  224. RepaintWindow;
  225. inherited Change;
  226. end;
  227.  
  228. procedure TTransEdit.SetParent(AParent: TWinControl);
  229. begin
  230. inherited SetParent(AParent);
  231. end;
  232.  
  233. // Transparent Memo
  234. constructor TTransMemo.Create(AOwner: TComponent);
  235. begin
  236. inherited Create(AOwner);
  237. FAlignText := taLeftJustify;
  238. FTransparent := false;
  239. FPainting := false;
  240. end;
  241.  
  242. destructor TTransMemo.Destroy;
  243. begin
  244. inherited Destroy;
  245. end;
  246.  
  247. procedure TTransMemo.SetAlignText(Value: TAlignment);
  248. begin
  249. if FAlignText <> Value then
  250. begin
  251. FAlignText := Value;
  252. RecreateWnd;
  253. Invalidate;
  254. end;
  255. end;
  256.  
  257. procedure TTransMemo.SetTransparent(Value: Boolean);
  258. begin
  259. if FTransparent <> Value then
  260. begin
  261. FTransparent := Value;
  262. Invalidate;
  263. end;
  264. end;
  265.  
  266. procedure TTransMemo.WMEraseBkGnd(var Message: TWMEraseBkGnd);
  267. var
  268. DC: hDC;
  269. i: integer;
  270. p: TPoint;
  271. begin
  272. if FTransparent then
  273. begin
  274. if Assigned(Parent) then
  275. begin
  276. DC := Message.DC;
  277. i := SaveDC(DC);
  278. p := GetScreenClient(self);
  279. p.x := -p.x;
  280. p.y := -p.y;
  281. MoveWindowOrg(DC, p.x, p.y);
  282. SendMessage(Parent.Handle, $, DC, );
  283. TCtrl(Parent).PaintControls(DC, nil);
  284. RestoreDC(DC, i);
  285. end;
  286. end else inherited;
  287. end;
  288.  
  289. procedure TTransMemo.WMPaint(var Message: TWMPaint);
  290. begin
  291. inherited;
  292. if FTransparent then
  293. if not FPainting then
  294. RepaintWindow;
  295. end;
  296.  
  297. procedure TTransMemo.WMNCPaint(var Message: TMessage);
  298. begin
  299. inherited;
  300. end;
  301.  
  302. procedure TTransMemo.CNCtlColorEdit(var Message: TWMCtlColorEdit);
  303. begin
  304. inherited;
  305. if FTransparent then
  306. SetBkMode(Message.ChildDC, );
  307. end;
  308.  
  309. procedure TTransMemo.CNCtlColorStatic(var Message: TWMCtlColorStatic);
  310. begin
  311. inherited;
  312. if FTransparent then
  313. SetBkMode(Message.ChildDC, );
  314. end;
  315.  
  316. procedure TTransMemo.CMParentColorChanged(var Message: TMessage);
  317. begin
  318. inherited;
  319. if FTransparent then
  320. Invalidate;
  321. end;
  322.  
  323. procedure TTransMemo.WMSize(var Message: TWMSize);
  324. begin
  325. inherited;
  326. Invalidate;
  327. end;
  328.  
  329. procedure TTransMemo.WMMove(var Message: TWMMove);
  330. begin
  331. inherited;
  332. Invalidate;
  333. end;
  334.  
  335. procedure TTransMemo.RepaintWindow;
  336. var
  337. DC: hDC;
  338. TmpBitmap, Bitmap: hBitmap;
  339. begin
  340. if FTransparent then
  341. begin
  342. FPainting := true;
  343. HideCaret(Handle);
  344. DC := CreateCompatibleDC(GetDC(Handle));
  345. TmpBitmap := CreateCompatibleBitmap(GetDC(Handle), Succ(ClientWidth), Succ(ClientHeight));
  346. Bitmap := SelectObject(DC, TmpBitmap);
  347. PaintTo(DC, , );
  348. BitBlt(GetDC(Handle), BorderRec[BorderStyle], BorderRec[BorderStyle], ClientWidth, ClientHeight, DC, , , SRCCOPY);
  349. SelectObject(DC, Bitmap);
  350. DeleteDC(DC);
  351. ReleaseDC(Handle, GetDC(Handle));
  352. DeleteObject(TmpBitmap);
  353. ShowCaret(Handle);
  354. FPainting := false;
  355. end;
  356. end;
  357.  
  358. procedure TTransMemo.CreateParams(var Params: TCreateParams);
  359. const
  360. Alignments: array [TAlignment] of DWord = (ES_LEFT, ES_RIGHT, ES_CENTER);
  361. begin
  362. inherited CreateParams(Params);
  363. Params.Style := Params.Style or ES_MULTILINE or Alignments[FAlignText];
  364. end;
  365.  
  366. procedure TTransMemo.Change;
  367. begin
  368. RepaintWindow;
  369. inherited Change;
  370. end;
  371.  
  372. procedure TTransMemo.SetParent(AParent: TWinControl);
  373. begin
  374. inherited SetParent(AParent);
  375. end;
  376.  
  377. end.

下面的代码如果memo已有内容,回到已有内容中间处修改,旧的文本笔画会和新的文本笔画混合。文本笔画背景未完全檫除。效果不好

  1. type
  2. TForm1 =class(TForm)
  3. private
  4. { Private declarations }
  5. FBitmap: TBitmap;
  6. FBrush: HBRUSH;
  7. Edit1: TEdit;
  8. Memo1: TMemo;
  9. Image2:TImage;//背景图片
  10. protected
  11. procedure WndProc(var Message: TMessage); override;
  12.  
  13. end;
  14. procedure TForm1.FormCreate(Sender: TObject);
  15. begin
  16. FBitmap := TBitmap.Create;
  17. FBitmap.SetSize(Memo1.Width,Memo1.Height);
  18. FBitMap.Canvas.CopyRect(
  19. types.Rect(,,FBitmap.Width,FBitmap.Height),
  20. Image2.Canvas,
  21. types.Rect(memo1.Left,memo1.Top,memo1.Left+Memo1.Width,memo1.Top+Memo1.Height));
  22. FBrush := CreateSolidBrush(FBitmap.Handle);
  23.  
  24. SetWindowLong(Edit1.Handle,GWL_EXSTYLE,GetWindowLong(Edit1.Handle,GWL_EXSTYLE) or WS_EX_TRANSPARENT); // 增加透明风格
  25. SetWindowLong(Memo1.Handle,GWL_EXSTYLE,GetWindowLong(Memo1.Handle,GWL_EXSTYLE) or WS_EX_TRANSPARENT);
  26. end;
  27.  
  28. procedure TForm1.FormPaint(Sender: TObject);
  29. begin
  30. Canvas.Brush.Handle:=FBrush;
  31. Canvas.Rectangle(,,width,height);
  32. end;
  33. procedure TForm1.WndProc(var Message: TMessage);
  34. begin
  35. inherited;
  36. case Message.Msg of
  37. WM_CTLCOLOREDIT, WM_CTLCOLORSTATIC:
  38. SetBkMode(Message.WParam, TRANSPARENT);
  39. Message.Result := FBrush;//GetStockObject(NULL_BRUSH);
  40. end;
  41. end;

TEdit,TMemo背景透明的更多相关文章

  1. TEdit,TMemo背景透明(SetWindowLong(WS_EX_TRANSPARENT)增加透明风格)

    The component below works perfectly, except for the following problem: 1) Saves the component below ...

  2. 【原】CSS实现背景透明,文字不透明,兼容所有浏览器

    11.11是公司成立的日子,16岁啦,我呢3岁半,感谢公司给了这样一个平台,让我得以学习和成长,这里祝愿公司发展越来越好~ 进入主题,每年11月11号是光棍节,产生于校园,本来只是一流传于年轻人的娱乐 ...

  3. CSS实现背景透明,文字不透明(兼容各浏览器)

    在 FF/Chrome 等较新的浏览器中可以使用css属性background- color的rgba轻松实现背景透明,而文字保持不透明.而IE6/7/8浏览器不支持rgba,只有使用IE的专属滤镜f ...

  4. CSS实现背景透明,文字不透明,兼容所有浏览器

    11.11是公司成立的日子,16岁啦,我呢3岁半,感谢公司给了这样一个平台,让我得以学习和成长,这里祝愿公司发展越来越好~ 进入主题,每年11月11号是光棍节,产生于校园,本来只是一流传于年轻人的娱乐 ...

  5. css 背景透明文字(内容)不透明三种实现方法

    好久没写博客了.以前还想着最少一个月抽空写几篇.结果没做到O(∩_∩)O~~.好吧.现在努力,继续坚持. 看着以前写的东西,感觉自己在逐渐成长. 先上图: 本文主要记录如上图一样的.文字或内容不透明, ...

  6. VC++ CStatic控件背景透明且改变其文本时,文字重叠解决方法

    最近在项目中将CStatic控件设置为背景透明且在一个定时器函数改变其文本,结果CStatic的文字重叠了.解决该问题的方案是:从CStatic类派生自己的静态文本控件. 其实设置背景透明,也就是在C ...

  7. 用Photoshop处理图片使背景透明

    用Photoshop处理图片使背景透明 打开一张图片 双击背景或者右键背景图层,新建一个图层, 选择魔棒工具,单击图片, 会自动选择颜色相近的范围 按下键盘的delete键,就可以删除魔棒所选择的区域 ...

  8. android 自定义Dialog背景透明及显示位置设置

    先贴一下显示效果图,仅作参考: 代码如下: 1.自定义Dialog public class SelectDialog extends AlertDialog{ public SelectDialog ...

  9. <select>在chrome浏览器下背景透明问题

    在上篇文章<只用CSS美化选择框>运用了背景透明的技巧来美化选择框,但在chrome浏览器下遇到了跟ie.ff不一样的透明效果,下面重现一下: 在一个大的div(背景红色)内放置一个sel ...

随机推荐

  1. 装有Win7系统的电脑在局域网不能共享的解决方案

    Win7系统的网络功能比XP有了进一步的增强,使用起来也相对清晰.但是由于做了很多表面优化的工作,使得底层的网络设置对于习惯了XP系统的人来说变得很不适应,其中局域网组建就是一个很大的问题.默认安装系 ...

  2. WebService学习笔记系列(一)

    webservice主要是解决两个系统或者两个应用程序之间的远程调用,它提供了一种通过web方式访问的api,调用是跨语言.跨平台的. webservice的客户端与服务端进行交互的时候使用xml来传 ...

  3. linux下实现tomcat定时自动重启

    tomcat自带的脚本中没有提供直接restart的模式,但是有start和shutdown两种模式.要实现restart模式,实际上只需要判断是否已经启动tomcat,若已经启动则限制性shutdo ...

  4. Linq分页

    /// <summary> /// Linq分页 /// </summary> ;//每页条数 ;//总条数 ;//当前第几页 public static string con ...

  5. C#将DataTable导出Execl、Word、Xml

        /// <summary>     /// 将DT转换为Execl的方法     /// </summary>     /// <param name=" ...

  6. 二分图的判定hihocoder1121 and hdu3478

    这两个题目都是二分图的判定,用dfs染色比较容易写. 算法流程: 选取一个没有染色的点,然后将这个点染色,那么跟他相连的所有点一定是不同颜色的,所以,如果存在已经染过颜色的,如果和这个颜色相同的话,就 ...

  7. Spring AOP体系学习总结:

    二.Spring AOP体系学习总结: 要理解AOP整体的逻辑需要理解一下Advice,Pointcut,Advisor的概念以及他们的关系. Advice是为Spring Bean提供增强逻辑的接口 ...

  8. Mac Zip命令

    mac终端命令 zip -[parameter] [yourName].zip someFileOrDiectory -q 表示不显示压缩进度状态 -r 表示子目录子文件全部压缩为zip //这部比较 ...

  9. 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 简单说 ...

  10. _BLOCK_TYPE_IS_VALID 问题解析及处理

    直接原因: 释放内存时,内存已经被修改或释放. 产生可能: 1.内存越界操作,踩了待释放指针头信息. 2.重复释放指针. 处理: 采用排除法,逐步屏蔽掉一些代码,当屏蔽某些代码时,不抛此异常,说明问题 ...