C#/.net WinForm如何做一个背景透明的RichTextBox
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#/.net WinForm如何做一个背景透明的RichTextBox相关的知识,希望对你有一定的参考价值。
我在网上搜到一个重写控件的代码,虽然背景透明了,但是很不稳定,我需要对这个RichTextBox进行大小、位置的改动,甚至滚动内容,这时控件就会闪烁,双重缓冲试过了,只会让背景变黑。。。求大神有什么好办法不让他闪烁吗,或者有别的办法重写一个RichTextBox??谢谢~~
那个重写的代码:
class TransparentRichTextBox : RichTextBox
override protected CreateParams CreateParams
get
CreateParams cp = base.CreateParams;
cp.ExStyle |= 0x20;
return cp;
override protected void OnPaintBackground(PaintEventArgs e)
也有另外的方法来设置透明,用定时器刷新,
RichTextBox
class TransparentControl : Control public TransparentControl() base.SetStyle( ControlStyles.UserPaint, true ); base.SetStyle( ControlStyles.DoubleBuffer, true ); base.SetStyle( ControlStyles.SupportsTransparentBackColor, true ); class TransparentRichTextBox : RichTextBox public TransparentRichTextBox() base.ScrollBars = RichTextBoxScrollBars.None; override protected CreateParams CreateParams get CreateParams cp = base.CreateParams; cp.ExStyle |= 0x20; return cp; override protected void OnPaintBackground( PaintEventArgs e )
TextBox
Collapse
public class TransparentTextBox : TextBox PictureBox pictureBox = new PictureBox(); public TransparentTextBox() pictureBox.Dock = DockStyle.Fill; this.Controls.Add( pictureBox ); protected override void WndProc( ref Message m ) base.WndProc( ref m ); switch( m.Msg ) case Win32.WM_PAINT: Bitmap bmpCaptured = new Bitmap( this.ClientRectangle.Width, this.ClientRectangle.Height ); Bitmap bmpResult = new Bitmap( this.ClientRectangle.Width,this.ClientRectangle.Height ); Rectangle r = new Rectangle( 0, 0, this.ClientRectangle.Width, this.ClientRectangle.Height ); CaptureWindow( this, ref bmpCaptured ); this.SetStyle( ControlStyles.SupportsTransparentBackColor, true ); this.BackColor = Color.Transparent; ImageAttributes imgAttrib = new ImageAttributes(); ColorMap[] colorMap = new ColorMap[ 1 ]; colorMap[ 0 ] = new ColorMap(); colorMap[ 0 ].OldColor = Color.White; colorMap[ 0 ].NewColor = Color.Transparent; imgAttrib.SetRemapTable( colorMap ); Graphics g = Graphics.FromImage( bmpResult ); g.DrawImage( bmpCaptured, r, 0 , 0, this.ClientRectangle.Width, this.ClientRectangle.Height, GraphicsUnit.Pixel, imgAttrib ); g.Dispose(); pictureBox.Image = ( Image )bmpResult.Clone(); break; case Win32.WM_HSCROLL: case Win32.WM_VSCROLL: this.Invalidate(); // repaint // if you use scrolling then add these two case statements break; private static void CaptureWindow( Control control, ref Bitmap bitmap ) Graphics g = Graphics.FromImage( bitmap ); int i = ( int )( Win32.PRF_CLIENT | Win32.PRF_ERASEBKGND ); IntPtr iPtr = new IntPtr( 14 ); IntPtr hdc = g.GetHdc(); Win32.SendMessage( control.Handle, Win32.WM_PRINT, hdc, iPtr ); g.ReleaseHdc( hdc ); g.Dispose(); 追问
我不设置背景图片,我只是放在窗体里可以继承窗体内的背景,不一定是图片,可能是窗体自绘的一些背景,就跟其他PictureBox设置背景色为TransParent一样,有透明度的图片,会显示周围一圈为原窗体的背景。
追答那就自己写个空间就行了,没有现成的
追问但是要写一个基于textbox的控件很麻烦的
本回答被提问者和网友采纳 参考技术B ... ... 这问题多试试看是有bug还是别的原因啦,解决起来应该需要点时间但不是很难的吧。 参考技术C 这个简单追问简单那你说怎么做啊?就知道骗经验
C# 做winform,在程序里选择文件(比如说word文档或图片),就直接调用对应程序打开该文件,如何实现啊!
如题,急等!
可以调用cmd来实现Process cmd = new Process();
cmd.StartInfo.FileName = "cmd";
cmd.StartInfo.RedirectStandardOutput = true;
cmd.StartInfo.RedirectStandardInput = true;
cmd.StartInfo.UseShellExecute = false;
cmd.StartInfo.CreateNoWindow = false; cmd.Start();
cmd.StandardInput.WriteLine(@"d:\\a.doc"); //这里可以换成从文件对话框取得文件名
cmd.Close(); 参考技术A 用默认程序打开文件
private void OpenFiles()
string fileName = "";//文件名
//打开文件对话框
OpenFileDialog ofd = new OpenFileDialog();
ofd.ShowDialog();
fileName = ofd.FileName;
try
if (fileName != "" && System.IO.File.Exists(fileName))
System.Diagnostics.Process.Start(fileName);
catch (System.Exception e)
MessageBox.Show("打开文件失败" + e.Message);
以上是关于C#/.net WinForm如何做一个背景透明的RichTextBox的主要内容,如果未能解决你的问题,请参考以下文章
.NET中C/S结构,winform怎么在datagridview中添加键盘点击事件,并设定热键?
C#/winform程序打包部署 如何把SQL 数据库 一起打包进去?
请推荐几个基于Winform C/S 结构系统框架的网站,谢谢!
关于C/S和B/S结构框架是否可以这样理解:所谓C/S即是winform程序,B/S即是ASP.NET?求高手指教?!~