然後筆者重載控件的 OnPaintBackground方法用於自定義繪制背景,其代碼如下。
/// <summary>
/// 自定義繪制控件背景
/// </summary>
/// <param name="e"></param>
protected override void OnPaintBackground(PaintEventArgs e)
{
base.OnPaintBackground (e);
if (myLogonImage != null)
{
// 在控件客戶區的右下角繪制標志圖片
int x = this.ClIEntSize.Width - myLogonImage.Width;
int y = this.ClIEntSize.Height - myLogonImage.Height;
if (e.ClipRectangle.IntersectsWith(
new Rectangle(
x,
y,
myLogonImage.Width,
myLogonImage.Height)))
{
e.Graphics.DrawImage(
myLogonImage,
x,
y,
myLogonImage.Width ,
myLogonImage.Height );
}
}
}
接著要處理控件的滾動事件了,首先筆者導入Win32API函數 LockWindowUpdate,其代碼如下
[System.Runtime.InteropServices.DllImport("user32.dll")]
private static extern bool LockWindowUpdate(IntPtr hWnd);
筆者重載控件的OnScroll 方法,其代碼如下
/// <summary>
/// 處理滾動條事件
/// </summary>
/// <param name="se">事件參數 </param>
protected override void OnScroll(ScrollEventArgs se)
{
if (bolFixedBackground)
{
// 執行固定背景的操作
if (se.Type == ScrollEventType.ThumbTrack)
{
// 若滾動框正在移動,解除對控件用戶界面的鎖定
LockWindowUpdate(IntPtr.Zero);
// 立即重新繪制控件 所有的用戶界面
this.Refresh();
// 鎖定控件的用戶界面
LockWindowUpdate (this.Handle);
}
else
{
// 解除對控件用戶界面的鎖定
LockWindowUpdate(IntPtr.Zero);
// 聲明 控件的所有的內容無效,但不立即重新繪制
this.Invalidate();
}
}
base.OnScroll(se);
}