這是一個小小的元件,實作控制帶有滾動條的控件(ListView,TreeView等)的滾動條顯示。 帶有滾動條的控件,通常情況下都是需要顯示滾動條的時候,如果水準滾動條和垂直滾動條都需要顯示,就一起顯示出來。但是有的時候我們隻想讓其隻顯示一條滾動條,例如隻顯示垂直滾動條,我們應該怎麼辦呢?我們可以通過API函數:ShowScrollBar (檢視)來實作。另外,我們可以通過API函數:GetWindowLong (檢視)來查詢目前控件是否需要顯示滾動條。先定義好這兩個API函數:
[DllImport("user32.dll")]
private static extern int ShowScrollBar(IntPtr hWnd, int iBar, int bShow);
[DllImport("user32.dll")]
private static extern int GetWindowLong(IntPtr hwnd, int nIndex);
現在,我們可以繼承 NativeWindow 來寫出我們需要的元件了。主要是重載 WndProc 函數:
protected override void WndProc(ref Message m)
{
HideScrollBar(ref m);
base.WndProc(ref m);
}
最後,來看看關鍵的 HideScrollBar 函數。
private void HideScrollBar(ref Message m)
{
int dwStyle = GetWindowLong(base.Handle, GWL_STYLE);
switch (_scrollBar)
{
case SB.SB_HORZ:
if ((dwStyle & WS_HSCROLL) == WS_HSCROLL)
{
ShowScrollBar(base.Handle, (int)_scrollBar, 0);
}
break;
case SB.SB_VERT:
if ((dwStyle & WS_VSCROLL) == WS_VSCROLL)
{
ShowScrollBar(base.Handle, (int)_scrollBar, 0);
}
break;
}
}