效果:

描述:

本来是想用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() == )
{
return;
} //只有在边框样式为FixedSingle时自定义边框样式才有效
if (this.BorderStyle == BorderStyle.FixedSingle)
{
//边框Width为1个像素
System.Drawing.Pen pen = new Pen(Brushes.DarkRed, ); //绘制边框
System.Drawing.Graphics g = Graphics.FromHdc(hDC);
g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
g.DrawRectangle(pen, , , this.Width - , this.Height - );
pen.Dispose();
}
//返回结果
m.Result = IntPtr.Zero;
//释放
ReleaseDC(m.HWnd, hDC);
}
} protected override void OnResize(EventArgs e)
{
base.OnResize(e);
this.Refresh();
}
}

不足之处:

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

C# Winfrom 自定义控件——带图片的TextBox的更多相关文章

  1. 自定义带图片和文字的ImageTextButton

    今天我们来讲一下有关自定义控件的问题,今天讲的这篇是从布局自定义开始的,难度不大,一看就明白,估计有的同学或者开发者看了说,这种方式多此一举,但是小编我不这么认为,多一种解决方式,就多一种举一反三的学 ...

  2. JAVA实现带图片的列表——JList

    JList:显示对象列表并且允许用户选择一个或多个项的组件. JList的构造方法: 1.根据数组创建列表: JList(Object[] listData) 构造一个 JList,使其显示指定数组中 ...

  3. C# Qrcode生成二维码支持中文,带图片,带文字 2015-01-22 15:11 616人阅读 评论(1) 收藏

    1.下载Qrcode库源码,下载地址:http://www.codeproject.com/Articles/20574/Open-Source-QRCode-Library 2.打开源码时,部分类库 ...

  4. WPF 实现带标题的TextBox

    这篇博客将分享在WPF中如何创建一个带Title的TextBox.首先请看一下最终的效果, 实现思路:使用TextBlock+TextBox来实现,TextBlock用来显示Title. 实现代码, ...

  5. 实现打印级别且带图片的Excel 方案

    导出二维数据excel,其实很简单,使用cvs就可以了.但是如果导出格式复杂带样式还带图片的怎么办?客户的要求有时就是这么变态.呵呵.如果使用.net,微软提供的有库,使用php好像也有现成的有库.我 ...

  6. 【Android代码片段之六】Toast工具类(实现带图片的Toast消息提示)

    转载请注明出处,原文网址:http://blog.csdn.net/m_changgong/article/details/6841266  作者:张燕广 实现的Toast工具类ToastUtil封装 ...

  7. 使用C#发送正文带图片邮件

    最近有个地方用到正文带图片的邮件发送功能,由于发送邮件调用的是web service,要求正文必须是string,而接收方要能看到图片,还不能单纯的添加一个图片地址链接,查阅了很多资料,基本上都是从头 ...

  8. java带图片的邮件发送方法实现

    package sendEmail; import java.util.Properties; import javax.activation.DataHandler; import javax.ac ...

  9. 基于bootstrap的轮播广告页,带图片和文字

    <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="utf-8& ...

随机推荐

  1. java泛型的作用及其基本概念

    一.泛型的基本概念 java与c#一样,都存在泛型的概念,及类型的参数化.java中的泛型是在jdk5.0后出现的,但是java中的泛型与C#中的泛型是有本质区别的,首先从集合类型上来说,java 中 ...

  2. springboot-redis-crda example

    springboot-redis-crda example 1. 从 https://github.com/XLuffyStory/springboot-redis-crdu 拿到源码之后,导入到ST ...

  3. python多线程爬取图片实例

    今天试着把前面那个爬取图片的爬虫改成了多线程爬取,虽然最后可以爬取存储图片了,但仍存在一些问题.网址还是那个网址https://www.quanjing.com/category/1286521/1. ...

  4. 跟我学SpringCloud | 第十篇:服务网关Zuul高级篇

    SpringCloud系列教程 | 第十篇:服务网关Zuul高级篇 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 如无特殊说明,本系列教程全 ...

  5. C#实体是什么

    实体 一般是指三层结构的数据库访问形式中,用于映射数据表或视图中一条记录的类的实例.例如现有数据表A 内涵 ID int(4) Info(nvarchar 50)两个字段,而有其对应的类 public ...

  6. 在vue项目中遇到关于对象的深浅拷贝问题

    一.问题 项目里新添加了一个多选的功能,其显示的数据都是从后端返回过来的,我们需要在返回来的数据外再额外添加一个是否选中的标记,我的选择是在返回正确的数据时将标记添加进去,然后push到数组中.然后就 ...

  7. kafka介绍及安装配置(windows)

    Kafka介绍 Kafka是分布式的发布—订阅消息系统.它最初由LinkedIn(领英)公司发布,使用Scala和Java语言编写,与2010年12月份开源,成为Apache的顶级项目.Kafka是一 ...

  8. activiti学习笔记

    activiti入门 activiti官网 pom.xml文件 xml <!-- activiti --> <dependency> <groupId>org.ac ...

  9. C# 中异常抛出捕获机制--throw / try,catch,finally

    try { messagebox.show("true"); } catch { messagebox.show("false"); } finally { m ...

  10. 跨站脚本攻击(selfxss)笔记(三)

    本篇纯文字发表自己对自插型xss的看法 selfxss,顾名思义,自己输入xss脚本,输出仅自己看到,仅xss到自己. 常见的有:查询框的xss.某个账号中,添加自己的分组类等 查询框的xss: 即在 ...