[C#] - 用户自定义控件(含源代码)-透明文本框

透明文本框

来源:http://www.codeproject.com/

由于在www.csdn.net只能下载*.dll的文件,没有代码,所以特意发出源代码。

 
  
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;

using System.Drawing.Imaging;

namespace ZBobb
{
/// <summary>
/// AlphaBlendTextBox: A .Net textbox that can be translucent to the background.
/// (C) 2003 Bob Bradley / ZBobb@hotmail.com
/// </summary>
 

public class AlphaBlendTextBox : System.Windows.Forms.TextBox
{
#region private variables

private uPictureBox myPictureBox;
private bool myUpToDate = false ;
private bool myCaretUpToDate = false ;
private Bitmap myBitmap;
private Bitmap myAlphaBitmap;

private int myFontHeight = 10 ;

private System.Windows.Forms.Timer myTimer1;

private bool myCaretState = true ;

private bool myPaintedFirstTime = false ;

private Color myBackColor = Color.White;
private int myBackAlpha = 10 ;

/// <summary>
/// Required designer variable.
/// </summary>
private System.ComponentModel.Container components = null ;

#endregion // end private variables


#region public methods and overrides

public AlphaBlendTextBox()
{
// This call is required by the Windows.Forms Form Designer.
InitializeComponent();
// TODO: Add any initialization after the InitializeComponent call

this .BackColor = myBackColor;

this .SetStyle(ControlStyles.UserPaint, false );
this .SetStyle(ControlStyles.AllPaintingInWmPaint, true );
this .SetStyle(ControlStyles.DoubleBuffer, true );


myPictureBox
= new uPictureBox();
this .Controls.Add(myPictureBox);
myPictureBox.Dock
= DockStyle.Fill;
}


protected override void OnResize(EventArgs e)
{

base .OnResize(e);
this .myBitmap = new Bitmap( this .ClientRectangle.Width, this .ClientRectangle.Height); // (this.Width,this.Height);
this .myAlphaBitmap = new Bitmap( this .ClientRectangle.Width, this .ClientRectangle.Height); // (this.Width,this.Height);
myUpToDate = false ;
this .Invalidate();
}


// Some of these should be moved to the WndProc later

protected override void OnKeyDown(KeyEventArgs e)
{
base .OnKeyDown(e);
myUpToDate
= false ;
this .Invalidate();
}

protected override void OnKeyUp(KeyEventArgs e)
{
base .OnKeyUp(e);
myUpToDate
= false ;
this .Invalidate();

}

protected override void OnKeyPress(KeyPressEventArgs e)
{
base .OnKeyPress(e);
myUpToDate
= false ;
this .Invalidate();
}

protected override void OnMouseUp(MouseEventArgs e)
{
base .OnMouseUp(e);
this .Invalidate();
}

protected override void OnGiveFeedback(GiveFeedbackEventArgs gfbevent)
{
base .OnGiveFeedback(gfbevent);
myUpToDate
= false ;
this .Invalidate();
}


protected override void OnMouseLeave(EventArgs e)
{
// found this code to find the current cursor location
// at http://www.syncfusion.com/FAQ/WinForms/FAQ_c50c.asp #q597q

Point ptCursor
= Cursor.Position;

Form f
= this .FindForm();
ptCursor
= f.PointToClient(ptCursor);
if ( ! this .Bounds.Contains(ptCursor))
base .OnMouseLeave(e);
}


protected override void OnChangeUICues(UICuesEventArgs e)
{
base .OnChangeUICues(e);
myUpToDate
= false ;
this .Invalidate();
}


// --
protected override void OnGotFocus(EventArgs e)
{
base .OnGotFocus(e);
myCaretUpToDate
= false ;
myUpToDate
= false ;
this .Invalidate();


myTimer1
= new System.Windows.Forms.Timer( this .components);
myTimer1.Interval
= ( int )win32.GetCaretBlinkTime(); // usually around 500;

myTimer1.Tick
+= new EventHandler(myTimer1_Tick);
myTimer1.Enabled
= true ;

}

protected override void OnLostFocus(EventArgs e)
{
base .OnLostFocus(e);
myCaretUpToDate
= false ;
myUpToDate
= false ;
this .Invalidate();

myTimer1.Dispose();
}

// --

protected override void OnFontChanged(EventArgs e)
{
if ( this .myPaintedFirstTime)
this .SetStyle(ControlStyles.UserPaint, false );

base .OnFontChanged(e);

if ( this .myPaintedFirstTime)
this .SetStyle(ControlStyles.UserPaint, true );


myFontHeight
= GetFontHeight();


myUpToDate
= false ;
this .Invalidate();
}

protected override void OnTextChanged(EventArgs e)
{
base .OnTextChanged(e);
myUpToDate
= false ;
this .Invalidate();
}


protected override void WndProc( ref Message m)
{

base .WndProc( ref m);

// need to rewrite as a big switch

if (m.Msg == win32.WM_PAINT)
{
myPaintedFirstTime
= true ;

if ( ! myUpToDate || ! myCaretUpToDate)
GetBitmaps();
myUpToDate
= true ;
myCaretUpToDate
= true ;

if (myPictureBox.Image != null ) myPictureBox.Image.Dispose();
myPictureBox.Image
= (Image)myAlphaBitmap.Clone();

}

else if (m.Msg == win32.WM_HSCROLL || m.Msg == win32.WM_VSCROLL)
{
myUpToDate
= false ;
this .Invalidate();
}

else if (m.Msg == win32.WM_LBUTTONDOWN
|| m.Msg == win32.WM_RBUTTONDOWN
|| m.Msg == win32.WM_LBUTTONDBLCLK
// || m.Msg == win32.WM_MOUSELEAVE // /****
)
{
myUpToDate
= false ;
this .Invalidate();
}

else if (m.Msg == win32.WM_MOUSEMOVE)
{
if (m.WParam.ToInt32() != 0 ) // shift key or other buttons
{
myUpToDate
= false ;
this .Invalidate();
}
}



// System.Diagnostics.Debug.WriteLine("Pro: " + m.Msg.ToString("X"));

}


/// <summary>
/// Clean up any resources being used.
/// </summary>
protected override void Dispose( bool disposing)
{
if (disposing)
{
// this.BackColor = Color.Pink;
if (components != null )
{
components.Dispose();
}
}
base .Dispose(disposing);
}

#endregion // end public method and overrides


#region public property overrides

public new BorderStyle BorderStyle
{
get { return base .BorderStyle; }
set
{
if ( this .myPaintedFirstTime)
this .SetStyle(ControlStyles.UserPaint, false );

base .BorderStyle = value;

if ( this .myPaintedFirstTime)
this .SetStyle(ControlStyles.UserPaint, true );

this .myBitmap = null ;
this .myAlphaBitmap = null ;
myUpToDate
= false ;
this .Invalidate();
}
}

public new Color BackColor
{
get
{
return Color.FromArgb( base .BackColor.R, base .BackColor.G, base .BackColor.B);
}
set
{
myBackColor
= value;
base .BackColor = value;
myUpToDate
= false ;
}
}
public override bool Multiline
{
get { return base .Multiline; }
set
{
if ( this .myPaintedFirstTime)
this .SetStyle(ControlStyles.UserPaint, false );

base .Multiline = value;

if ( this .myPaintedFirstTime)
this .SetStyle(ControlStyles.UserPaint, true );

this .myBitmap = null ;
this .myAlphaBitmap = null ;
myUpToDate
= false ;
this .Invalidate();
}
}


#endregion // end public property overrides


#region private functions and classes

private int GetFontHeight()
{
Graphics g
= this .CreateGraphics();
SizeF sf_font
= g.MeasureString( " X " , this .Font);
g.Dispose();
return ( int )sf_font.Height;
}


private void GetBitmaps()
{

if (myBitmap == null
|| myAlphaBitmap == null
|| myBitmap.Width != Width
|| myBitmap.Height != Height
|| myAlphaBitmap.Width != Width
|| myAlphaBitmap.Height != Height)
{
myBitmap
= null ;
myAlphaBitmap
= null ;
}



if (myBitmap == null )
{
myBitmap
= new Bitmap( this .ClientRectangle.Width, this .ClientRectangle.Height); // (Width,Height);
myUpToDate = false ;
}


if ( ! myUpToDate)
{
// Capture the TextBox control window

this .SetStyle(ControlStyles.UserPaint, false );

win32.CaptureWindow(
this , ref myBitmap);

this .SetStyle(ControlStyles.UserPaint, true );
this .SetStyle(ControlStyles.SupportsTransparentBackColor, true );
this .BackColor = Color.FromArgb(myBackAlpha, myBackColor);

}
// --



Rectangle r2
= new Rectangle( 0 , 0 , this .ClientRectangle.Width, this .ClientRectangle.Height);
ImageAttributes tempImageAttr
= new ImageAttributes();


// Found the color map code in the MS Help

ColorMap[] tempColorMap
= new ColorMap[ 1 ];
tempColorMap[
0 ] = new ColorMap();
tempColorMap[
0 ].OldColor = Color.FromArgb( 255 , myBackColor);
tempColorMap[
0 ].NewColor = Color.FromArgb(myBackAlpha, myBackColor);

tempImageAttr.SetRemapTable(tempColorMap);

if (myAlphaBitmap != null )
myAlphaBitmap.Dispose();


myAlphaBitmap
= new Bitmap( this .ClientRectangle.Width, this .ClientRectangle.Height); // (Width,Height);

Graphics tempGraphics1
= Graphics.FromImage(myAlphaBitmap);

tempGraphics1.DrawImage(myBitmap, r2,
0 , 0 , this .ClientRectangle.Width, this .ClientRectangle.Height, GraphicsUnit.Pixel, tempImageAttr);

tempGraphics1.Dispose();

// ----

if ( this .Focused && ( this .SelectionLength == 0 ))
{
Graphics tempGraphics2
= Graphics.FromImage(myAlphaBitmap);
if (myCaretState)
{
// Draw the caret
Point caret = this .findCaret();
Pen p
= new Pen( this .ForeColor, 3 );
tempGraphics2.DrawLine(p, caret.X, caret.Y
+ 0 , caret.X, caret.Y + myFontHeight);
tempGraphics2.Dispose();
}

}



}



private Point findCaret()
{
/* Find the caret translated from code at
*
http://www.vb-helper.com/howto_track_textbox_caret.html
*
* and
*
*
http://www.microbion.co.uk/developers/csharp/textpos2.htm
*
* Changed to EM_POSFROMCHAR
*
* This code still needs to be cleaned up and debugged
*
*/

Point pointCaret
= new Point( 0 );
int i_char_loc = this .SelectionStart;
IntPtr pi_char_loc
= new IntPtr(i_char_loc);

int i_point = win32.SendMessage( this .Handle, win32.EM_POSFROMCHAR, pi_char_loc, IntPtr.Zero);
pointCaret
= new Point(i_point);

if (i_char_loc == 0 )
{
pointCaret
= new Point( 0 );
}
else if (i_char_loc >= this .Text.Length)
{
pi_char_loc
= new IntPtr(i_char_loc - 1 );
i_point
= win32.SendMessage( this .Handle, win32.EM_POSFROMCHAR, pi_char_loc, IntPtr.Zero);
pointCaret
= new Point(i_point);

Graphics g
= this .CreateGraphics();
String t1
= this .Text.Substring( this .Text.Length - 1 , 1 ) + " X " ;
SizeF sizet1
= g.MeasureString(t1, this .Font);
SizeF sizex
= g.MeasureString( " X " , this .Font);
g.Dispose();
int xoffset = ( int )(sizet1.Width - sizex.Width);
pointCaret.X
= pointCaret.X + xoffset;

if (i_char_loc == this .Text.Length)
{
String slast
= this .Text.Substring(Text.Length - 1 , 1 );
if (slast == " \n " )
{
pointCaret.X
= 1 ;
pointCaret.Y
= pointCaret.Y + myFontHeight;
}
}

}



return pointCaret;
}


private void myTimer1_Tick( object sender, EventArgs e)
{
// Timer used to turn caret on and off for focused control

myCaretState
= ! myCaretState;
myCaretUpToDate
= false ;
this .Invalidate();
}


private class uPictureBox : PictureBox
{
public uPictureBox()
{
this .SetStyle(ControlStyles.Selectable, false );
this .SetStyle(ControlStyles.UserPaint, true );
this .SetStyle(ControlStyles.AllPaintingInWmPaint, true );
this .SetStyle(ControlStyles.DoubleBuffer, true );

this .Cursor = null ;
this .Enabled = true ;
this .SizeMode = PictureBoxSizeMode.Normal;

}




// uPictureBox
protected override void WndProc( ref Message m)
{
if (m.Msg == win32.WM_LBUTTONDOWN
|| m.Msg == win32.WM_RBUTTONDOWN
|| m.Msg == win32.WM_LBUTTONDBLCLK
|| m.Msg == win32.WM_MOUSELEAVE
|| m.Msg == win32.WM_MOUSEMOVE)
{
// Send the above messages back to the parent control
win32.PostMessage( this .Parent.Handle, ( uint )m.Msg, m.WParam, m.LParam);
}

else if (m.Msg == win32.WM_LBUTTONUP)
{
// ?? for selects and such
this .Parent.Invalidate();
}


base .WndProc( ref m);
}


}
// End uPictureBox Class


#endregion // end private functions and classes


#region Component Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
components
= new System.ComponentModel.Container();
}
#endregion


#region New Public Properties

[
Category(
" Appearance " ),
Description(
" The alpha value used to blend the control's background. Valid values are 0 through 255. " ),
Browsable(
true ),
DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)

]
public int BackAlpha
{
get { return myBackAlpha; }
set
{
int v = value;
if (v > 255 )
v
= 255 ;
myBackAlpha
= v;
myUpToDate
= false ;
Invalidate();
}
}

#endregion



}
// End AlphaTextBox Class


}
// End namespace ZBobb


// ----

转载于:https://www.cnblogs.com/hcbin/archive/2010/03/13/1685046.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值