c#在WinForm中重写ProgressBar控件(带%的显示)

#region 定义textProgressBar控件的类

namespace csPublish

{

[ToolboxItem(true)]

class textProgressBar : System.Windows.Forms.ProgressBar

{

[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);

private System.Drawing.Color _TextColor = System.Drawing.Color.Black;

private System.Drawing.Font _TextFont = new System.Drawing.Font("SimSun ", 12);

public System.Drawing.Color TextColor

{

get { return _TextColor; }

set { _TextColor = value; this.Invalidate(); }

}

public System.Drawing.Font TextFont

{

get { return _TextFont; }

set { _TextFont = value; this.Invalidate(); }

}

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;

}

//base.OnPaint(e);

System.Drawing.Graphics g = Graphics.FromHdc(hDC);

SolidBrush brush = new SolidBrush(_TextColor);

string s = string.Format("{0}%", this.Value * 100 / this.Maximum);

SizeF size = g.MeasureString(s, _TextFont);

float x = (this.Width - size.Width) / 2;

float y = (this.Height - size.Height) / 2;

g.DrawString(s, _TextFont, brush, x, y);

//返回结果

m.Result = IntPtr.Zero;

//释放

ReleaseDC(m.HWnd, hDC);

}

}

}

}

#endregion

时间: 2024-11-29 11:06:42

c#在WinForm中重写ProgressBar控件(带%的显示)的相关文章

WPF中嵌入WinForm中的webbrowser控件

原文:WPF中嵌入WinForm中的webbrowser控件 使用VS2008创建WPF应用程序,需使用webbrowser.从工具箱中添加WPF组件中的webbrowser发现其中有很多属性事件不能使用.决定还是使用WinForm中的webbrowser.要想在WPF中使用WinForm控件,查看MSDN,需经过以下步骤. 创建名为 HostingWfInWpf 的 WPF 应用程序项目. 在解决方案资源管理器中,添加一个对名为 WindowsFormsIntegration.dll 的 Wi

WinForm中调用WPF控件

WinForm中调用WPF控件 在WinForm中可以使用WPF中的控件,或者由WPF创建的自定义控件: 步骤1:创建WinForm工程: 步骤2:在WinForm工程的解决方案资源管理器中,在刚刚创建的WinForm解决方案中新建或者添加现有的WPF用户控件工程: 步骤3:在WPF中创建自定义的控件,或者添加WPF控件到面板上: 步骤4:在WinForm面板上添加ElementHost控件(工具箱中): 步骤5:生成解决方案: 步骤6:在刚刚的ElementHost中的Child属性中添加刚刚

easyui中tree型控件不正常显示的处理方法

我在使用easyui中的tree控件时,出现不正常显示的现象,比如li中不能使用自定义的图标.父级展开或关闭时,其子级仍然显现并出现重叠等.找了很多资料,都没解决这个问题,后来逐个对照官方的源码,才发现是easyui.css和icon.css的引用顺序引起的. 正确的引用顺序是先引用easyui.css,然后引用icon.css. 不知这是否是easyui的Bug?

WINFORM中加入WPF控件并绑定数据源实现跨线程自动更新

1. WINFORM中添加两个ElementHost,一个放WPF的Button,一个放WPF的TextBox.其中TextBox与数据源绑定,实现跨线程也可以自动更新,而不会出现WINFORM的TextBox控件与数据源绑定后,存在子线程中更新数据源报错(跨线程更新控件)的情况. using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System

winform中如何在多线程中更新UI控件--ListView实时显示执行信息

1.在winform中,所有对UI的操作,都得回到UI线程(主线程)上来,才不会报错 线程间操作无效: 从不是创建控件的线程访问它. 2.在winform中,允许通过Control.invoke对控件进行操作.如下代码: private void btnTest_Click(object sender, EventArgs e) { CheckA(); } private void CheckA() { System.Threading.ThreadPool.QueueUserWorkItem(

winform 中调用用户控件中 嵌套用户控件的事件

工作了很久,一直没有很深入的了解C#中的委托和事件. 来到新公司,主要的工作就是使用委托和事件操作数据.一下子不知道该如何下手.各方请教大神,得出下面的方法 1. 在A控件中定义一个事件,B控件触发的时候,调用一下这个事件.然后再在A的父级控件中写方法,+=的方式把方法委托给A的事件就行了 窗体: private void Form1_Load(object sender, EventArgs e)        {            UC_Content content = new UC_

Winform中使用用户控件实现带行数和标尺的RichTextBox(附代码下载)

场景 RichTextBox控件允许用户输入和编辑文本的同时提供了比普通的TextBox控件更高级的格式特征. 效果 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 新建一个用户控件GuageRichTextBox. 编辑用户控件,相当于自己定义了一个控件,和其他控件一样在窗体中使用,是一个类. 然后打开其设计页面,放置一个RichTextBox 然后进入其代码 usi

Winform中修改WebBrowser控件User-Agent的方法(已经测试成功)

using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using System.Runtime.InteropServices; using System.Reflection; namespace WindowsFormsApplication2 { public class UserAgentHelper { priva

WinForm中按钮等控件的背景渐变色重绘

注:brush通过起止坐标来控制重绘范围及方向.比如从上到下渐变时,brush第二个Point参数是左下角坐标. 1 private void PaintGradientBackground(Button btn) 2 { 3 Bitmap newGradientBackImg = new Bitmap(btn.Width, btn.Height); 4 LinearGradientBrush brush = new LinearGradientBrush(new PointF(0, 0), n