當用戶用鼠標拖拽操作直接拖動滾動條時,控件 觸發的滾動事件過程如下:
1.當用戶在滾動條上按下鼠標左鍵,開始 拖拽在時,控件觸發ThumbTrack類型的滾動事件。
2.當用戶移動鼠標 時,每一移動都會讓控件觸發ThumbTrack類型的滾動事件。當Windows系統設置了“拖 動時顯示窗口內容”時,還會觸發控件重繪事件,當沒有設置“拖動時顯示窗口 內容”時不會觸發控件重繪事件。
3.當用戶松開鼠標按鍵,結束 拖拽操作時觸發ThumbPosition事件。
此外當程序自己使用代碼設置控件的 AutoScrollPosition屬性來自行滾動時不會觸發任何控件滾動事件,鼠標滾輪操作也不會觸 發滾動事件。
以上是在筆者的WindowsXP SP2的系統中的實驗效果,相信對其他 Windows操作系統也一樣吧。
根據上述實驗結果,筆者重點處理ThumbTrack和 ThumbPosition類型的滾動事件,由於存在“拖動時顯示窗口內容”的設置,筆者 會重載處理控件的Windows消息處理方法,當Windows沒有設置“拖動時顯示窗口內容 ”時,對每一個ThumbTrack事件消息都額外的處理一個ThumbPosition消息,這樣就將 兩種情況統一起來。
解決問題
根據所上述分析,筆者開始創建一種固定背景 的可滾動的控件了,原理上面講的比較清楚,因此編寫代碼時不再多說了。筆者首先使用 VS.Net2005建立一個名為“FixedBackground”的WinForm的C#工程。然後創建一 個名為FixedBackgroundControl的類型,該類型是從System.Windows.Forms.UserControl類 型派生的。
筆者建立一個FixedBackground的屬性用於指定是否啟動固定背景的功能 ,其代碼如下
private bool bolFixedBackground = false;
/// <summary>
/// 固定背景
/// </summary>
[System.ComponentModel.Category("Appearance")]
[System.ComponentModel.DefaultValue(false)]
public bool FixedBackground
{
get
{
return bolFixedBackground;
}
set
{
bolFixedBackground = value;
}
}
然後定義 一個名為LogonImage的屬性用於設置在控件客戶區右下角顯示的圖標,其代碼如下
private System.Drawing.Image myLogonImage = null;
/// <summary>
/// 標志圖片
/// </summary>
[System.ComponentModel.Category("Appearance")]
public System.Drawing.Image LogonImage
{
get
{
return myLogonImage;
}
set
{
myLogonImage = value;
}
}