效果:

描述:

本来是想用GDI在左边画图片上去的,文本是居中对齐,如果文本是左对齐,文本会把图片遮住控件长这样:
但这样做,输入框在获取焦点时候,会把图片挡住就像这样:
输入完成之后图片就会显示完整。所以我又采用了PictureBox+TextBox组合的方式来完成这种效果。完成这种效果需要完成以下步骤:
0.分别设置PictureBox和TextBox的控件的Anchor和Dock属性,这样在窗体上拉动控件大小的时候,图片框和文本输入框能一起变大;
1.调整TextBox的border为none;
2.调整PictureBox的backColor为White;
3.调整作为控件载体的UserControl的BackColor为White;
4.设置作为控件载体的UserControl的BorderStyle为FixedSingle;因为这里需要重绘UserContorl的边框就需要这样的设置,我这里重绘成了DarkRed颜色。

提醒:

如果你想写一些文本框的事件就要像定义MyTextChanged那样暴露出来。还有就是,这里如果override UserControlde的OnPaint方法我是没能完成控件边框的重绘。
(我也不清楚什么时候重写WndProc什么时候重写OnPaint。)

代码:

 public partial class MyPicturerTextBox : UserControl{public MyPicturerTextBox(){InitializeComponent();this.BorderStyle = BorderStyle.FixedSingle;}private Image userImg;[Description("文本框里的图片")]public Image UserImg{get { return userImg; }set{if (value != null){this.Img.Image = value;}userImg = value;}}private string txt;[Description("输入的文本")]public string Txt{get { return txt; }set{if (!string.IsNullOrEmpty(value)){this.textBox.Text = value;}txt = value;}}[Description("TextChanged事件")]public event EventHandler MyTextChanged;private void textBox_TextChanged(object sender, EventArgs e){MyTextChanged?.Invoke(sender, e);}/// <summary> /// 获得当前进程,以便重绘控件 /// </summary> /// <param name="hWnd"></param> /// <returns></returns> [System.Runtime.InteropServices.DllImport("user32.dll")]static extern IntPtr GetWindowDC(IntPtr hWnd);[System.Runtime.InteropServices.DllImport("user32.dll")]static extern int ReleaseDC(IntPtr hWnd, IntPtr hDC);protected override void WndProc(ref Message m){base.WndProc(ref m);if (m.Msg == 0xf || m.Msg == 0x133){//拦截系统消息,获得当前控件进程以便重绘。 //一些控件(如TextBox、Button等)是由系统进程绘制,重载OnPaint方法将不起作用. //所有这里并没有使用重载OnPaint方法绘制TextBox边框。 // //MSDN:重写 OnPaint 将禁止修改所有控件的外观。 //那些由 Windows 完成其所有绘图的控件(例如 Textbox)从不调用它们的 OnPaint 方法, //因此将永远不会使用自定义代码。请参见您要修改的特定控件的文档, //查看 OnPaint 方法是否可用。如果某个控件未将 OnPaint 作为成员方法列出, //则您无法通过重写此方法改变其外观。 // //MSDN:要了解可用的 Message.Msg、Message.LParam 和 Message.WParam 值, //请参考位于 MSDN Library 中的 Platform SDK 文档参考。可在 Platform SDK(“Core SDK”一节) //下载中包含的 windows.h 头文件中找到实际常数值,该文件也可在 MSDN 上找到。 IntPtr hDC = GetWindowDC(m.HWnd);if (hDC.ToInt32() == 0){return;}//只有在边框样式为FixedSingle时自定义边框样式才有效 if (this.BorderStyle == BorderStyle.FixedSingle){//边框Width为1个像素 System.Drawing.Pen pen = new Pen(Brushes.DarkRed, 1);//绘制边框 System.Drawing.Graphics g = Graphics.FromHdc(hDC);g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;g.DrawRectangle(pen, 0, 0, this.Width - 1, this.Height - 1);pen.Dispose();}//返回结果 m.Result = IntPtr.Zero;//释放
                ReleaseDC(m.HWnd, hDC);}}protected override void OnResize(EventArgs e){base.OnResize(e);this.Refresh();}}

不足之处:

文本没能居中,可以把字体大小往上调让字体充满控件的高度。调整控件的大小之后,需要手动调整字体的大小

转载于:https://www.cnblogs.com/HelloQLQ/p/11298308.html

C# Winfrom 自定义控件——带图片的TextBox相关推荐

  1. axure中怎么把图片变圆_orcad中怎么创建带图片的Title Block?

    一般来说,Title Block都是调用系统本身自带的,或者是修改自带的文件,所以这里我们直接复制一个系统自带的Title Block,修改后保存在路径下,进行关联即可. 第一步,从系统自带的模板Ca ...

  2. xhtmlrenderer 将html转换成pdf,完美css,带图片,手动分页,解决内容断开的问题

    xhtmlrenderer 将html转换成pdf,完美css,带图片,手动分页,解决内容断开的问题 参考文章: (1)xhtmlrenderer 将html转换成pdf,完美css,带图片,手动分页 ...

  3. wangEditor - 轻量级web富文本编辑器(可带图片上传)

    业务需求: 通过后台编辑文章和图片,上传到前端界面,展示新闻消息模块.这个时候,需要一款简洁的编辑器,百度编辑器是最常用的一种,但是功能太过于复杂,而wangEditor - 轻量级web富文本编辑器 ...

  4. 自定义Android带图片的按钮

    自定义Android带图片的按钮 前言 现在移动设备的按钮设计讲究大图标小文字,希望用户只要一看到图标便能知道这个按钮是干嘛的,但又要有必要的文字提示,最常见的就数搜索按钮了,上面一个大大的放大镜图标 ...

  5. 仿快图系统自带图片浏览器应用源码项目

    仿快图系统自带图片浏览器应用源码,最近在做一个微博i动态模块,需要查看他人相册照片或者微博内容图片等.看到QQ空间那个效果不错,尝试了不少方法来实现,均不是怎么理想.最初是想通过自定义GroupVie ...

  6. 小程序提交表单mysql_GitHub - kun19911227/minipro: 微信小程序提交带图片的表单

    minipro 微信小程序提交带图片的表单 目录说明 upload_images ├── pages │ ├── upload_info 提交表单 │ └── display_info 信息展示 ├─ ...

  7. xslt三种带图片的超链接(a标签,img标签)写法

    来源:http://www.notsee.info/tech/XSLT/XSLT-detail-333.xml 第一种带图片的超链接写法 xml   <notsee ID="a002& ...

  8. 用VB实现带图片的XP风格的按钮控件

    虽然在VB里实现XP风格很简单,但是要使用XP风格同时又让按钮显示图片,则实现起来要麻烦一些,为此,我写了一个控件来实现前述功能,同时让读者可以从中了解XP主题界面的绘制过程. 使用办法很简单,在VB ...

  9. 用VSCode打开带图片的.md文件

    最近自学python发现一个特别好的教程,里面文档都是.md文件并且带图片的,我用sublime,UE等都能打开 不能显示图片,所以就找到用VSCode打开. 把大象放进冰箱分三步,打开带图片的.md ...

最新文章

  1. JavaScript初学者编程题(20)
  2. 清空SQL Server数据库中所有表数据的方法(转)
  3. CodeForces - 603C Lieges of Legendre(博弈+找规律)
  4. 前端常见的安全性问题有哪些?
  5. 说说那些死于决斗的大牛
  6. dbcp 连接都会被断开_科普帖:软件与数据库连接的机制是怎样的?
  7. Oracle P6培训系列:03设置用户设置
  8. 基于Easyui框架的datagrid绑定数据,新增,修改,删除方法(一)
  9. 超强合集:OCR 文本检测干货汇总(含论文、源码、demo 等资源)
  10. linux可执行文件在window,教你如何在windows下编译linux生成windows的可执行程序
  11. cs服务器网页管理端,sXe服务器端怎么管理
  12. 计算机中算术逻辑单元负责,算术逻辑单元可实现 算术逻辑单元的发展
  13. 数学分析教程(科大)——1.7笔记+习题
  14. Kaggle无法出现人机验证的解决办法
  15. 数据库访问函数FIND_IN_SET介绍
  16. 2022商业武器:一站式供应链中台成为决胜关键
  17. python色卡_python matplotlib:plt.scatter() 大小和颜色参数详解
  18. 实例3:爬取斗破苍穹小说全文
  19. ssd 分区4k对齐 linux,Debian SSD ext4 4K对齐
  20. 计算机视觉中,目前有哪些经典的目标跟踪算法

热门文章

  1. 申请带@msn.com后缀的邮箱
  2. 学习ASP必须掌握100个基础
  3. 展示火眼金睛 教你学会内存优劣的识别技巧
  4. python3 [爬虫入门实战]爬虫之scrapy安装与配置教程
  5. AV1硬件采用及未来发展
  6. 如何搭建知识库网页?
  7. 物联网低功耗广域网(LPWAN)的比较
  8. 低功耗广域网(LPWAN)塑造物联网未来
  9. docker 多个mysql_docker安装多MySQL服务
  10. 如何增加网站的百度收录量?