基于他人代码修改,不闪,以做备忘。

与SendMessage EM_SETCUEBANNER消息相比,它能改变字体绘制颜色,EM_SETCUEBANNER只限定了DimGray颜色,太深

  1. //与SendMessage EM_SETCUEBANNER消息相比,它能改变字体绘制颜色,EM_SETCUEBANNER只限定了DimGray颜色,太深
  2. [ToolboxBitmap(typeof(TextBox))]
  3. public class TextBoxEx : TextBox
  4. {
  5. private const int WM_PAINT = 0xF;
  6. private Color placeHolderColor = Color.Gray;
  7. private string placeHolderText;
  8.  
  9. [DefaultValue("")]
  10. [Localizable(true)]
  11. [Editor("System.ComponentModel.Design.MultilineStringEditor, System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a", typeof(UITypeEditor))]
  12. public string PlaceHolderText
  13. {
  14. get { return this.placeHolderText; }
  15. set
  16. {
  17. this.placeHolderText = value;
  18. Invalidate();
  19. }
  20. }
  21.  
  22. protected override void WndProc(ref Message m)
  23. {
  24. base.WndProc(ref m);
  25. if (m.Msg == WM_PAINT)
  26. WmPaint(ref m);
  27. }
  28.  
  29. private void WmPaint(ref Message m)
  30. {
  31. if (!string.IsNullOrEmpty(this.Text) || string.IsNullOrEmpty(this.placeHolderText) || Focused)
  32. return;
  33.  
  34. using (var g = Graphics.FromHwnd(this.Handle))
  35. {
  36. var flag = TextFormatFlags.EndEllipsis;
  37. //它反着来
  38. if (RightToLeft == RightToLeft.Yes)
  39. {
    flag |= TextFormatFlags.RightToLeft;
  40. if (TextAlign == HorizontalAlignment.Left)
  41. flag |= TextFormatFlags.Right;
  42. else if (TextAlign == HorizontalAlignment.Right)
  43. flag |= TextFormatFlags.Left;
  44. }
  45. else
  46. {
  47. switch (TextAlign)
  48. {
  49. case HorizontalAlignment.Center:
  50. flag |= TextFormatFlags.HorizontalCenter;
  51. break;
  52. case HorizontalAlignment.Right:
  53. flag |= TextFormatFlags.Right;
  54. break;
  55. default:
  56. break;
  57. }
  58. }
  59.  
  60. var r = this.ClientRectangle;
  61. r.Offset(-, );
  62. TextRenderer.DrawText(
  63. g,
  64. this.placeHolderText,
  65. Font,
  66. r,
  67. this.placeHolderColor,
  68. flag
  69. );
  70. }
  71. }
  72. }

效果如图:

参考资料:

C# WinForm TextBox添加水印效果 - ZCoding - 博客园

c#: TextBox添加水印效果(PlaceHolderText)的更多相关文章

  1. C# WinForm TextBox添加水印效果

    1.新建项目添加WatermarkTextBox类: using System; using System.Collections.Generic; using System.Text; using ...

  2. WPF文本框密码框添加水印效果

    WPF文本框密码框添加水印效果 来源: 阅读:559 时间:2014-12-31 分享: 0 按照惯例,先看下效果 文本框水印 文本框水印相对简单,不需要重写模板,仅仅需要一个VisualBrush ...

  3. WPF 之 文本框及密码框添加水印效果

    1.文本框添加水印效果 文本框水印相对简单,不需要重写模板,仅仅需要一个 VisualBrush 和触发器验证一下Text是否为空即可. <TextBox Name="txtSerac ...

  4. WPF的TextBox水印效果详解

    一种自以为是的方式: 本来只是想简单的做个水印效果,在文本框内容为空的时候提示用户输入,这种需求挺常见.网上一搜 都是丢给你你一大段xaml代码.用c#代码实现我是不倾向了 既然用wpf就得Xaml啊 ...

  5. Java 图片添加水印效果

    package com.xiaowu.drawwater.demo; import java.awt.AlphaComposite; import java.awt.Graphics2D; impor ...

  6. WPF实现TextBox水印效果

    在日常项目中,一个TextBox需要输入用户名,我们通常的做法是先用一个TextBlock来说明,例如下面的截图: 今天将使用另外一种方式来展示,使用水印的方式.请参考下面的代码: <Windo ...

  7. WPF 文本框添加水印效果

    有的时候我们需要为我们的WPF文本框TextBox控件添加一个显示水印的效果来增强用户体验,比如登陆的时候提示输入用户名,输入密码等情形.如下图所示: 这个时候我们除了可以修改TextBox控件的控件 ...

  8. C# 处理PPT水印(一)——添加水印效果(文字水印、图片水印)

    对文档添加水印可以有效声明和保护文档,是保护重要文件的方式之一.在PPT文档中同样也可以设置水印,包括文本水印和图片水印,本文将讲述如何通过Spire.Presentation for .NET来对P ...

  9. [Xcode 实际操作]九、实用进阶-(16)给图片添加水印效果

    目录:[Swift]Xcode实际操作 本文将演示如何截取屏幕画面,并将截取图片,存入系统相册. 在项目文件夹[DemoApp]上点击鼠标右键 ->[New File]创建一个扩展文件-> ...

随机推荐

  1. 使用aliyun cli工具快速创建云主机

    参考文档: https://help.aliyun.com/document_detail/25484.html?spm=a2c4g.11186623.3.2.b57vQp 步骤 创建AccessID ...

  2. MapReduce论文学习

    MapReduce和区块链有什么相同的地方? 我的天哪,他俩还有相同的地方呢.我书读的少,你别骗我. 他俩还真有相同点,绝不忽悠. 他俩都有一个高大上的名字. 区块链就是一个分布式数据库,并不是什么神 ...

  3. 关于破解visualsvn 我这里是版本是5.2.1

    1.首先备份当前安装visualSVN文件的bin目录,万一出错还能反个水.一般默认安装路径是C:\Program Files (x86)\VisualSVN\bin 2.然后运行ildasm,Win ...

  4. 巨坑– 膜BWV543

    我不是一个喜欢膜别人的人,我从来都不擅长去夸奖.当面对巴赫的作品时,我发现我的敬佩难以用语言表达.我决定用另一种方式来表达我的欣赏,那就是分析并背下这个谱子. http://music.163.com ...

  5. VM12中CentOS7以NAT方式连接网络的方法

    解决问题:centos网络连不上,连不上主机,ifconfig等命令不能用(配完有网了,安装上就好了)等问题 前提:安装vm12,centos7(最小安装)  注意:以下以192开头的,你都要替换成自 ...

  6. rabbitmq支持.net framwork 3.5的最后版本

    方便后来人!!!经过一系列的确认!! rabbitmq支持.net framwork 3.5的最后版本是3.4.3, 安装步骤: 1.工具->Nuget程序包管理器,进入控制台 2.Instal ...

  7. windows 查看端口占用、关闭端口

    cmd打卡命令窗口 1)netstat -an 查看所有活动连接 2)netstat -aon| findstr “xxxx” 找到指定端口的连接 3)taskkill  /F /PID xxxx 终 ...

  8. java中PriorityBlockingQueue 和DelayedWorkQueue 区别

    java中PriorityBlockingQueue 和DelayedWorkQueue 区别

  9. Delphi全局热键的注册

    1.在窗启动时创建ATOM;(aatom:ATOM;定义在private中) then begin aatom:=GlobalAddAtom('ZWXhotKey'); end; ) then beg ...

  10. 函数(一.return)

    #return的用法:#return用于退出函数,选择性的返回一个表达式.def test1(a,b): total = a+b return total print(total) def test2 ...