轉(zhuǎn)帖|其它|編輯:郝浩|2011-09-27 15:42:13.000|閱讀 11726 次
概述:本文介紹擴(kuò)展SplitContainer控件,在分隔欄上實(shí)現(xiàn)一個(gè)按鈕,點(diǎn)擊按鈕可以收縮分隔欄中的一個(gè)面板(Panel),實(shí)現(xiàn)像QQ游戲中的分隔欄那樣的效果。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門(mén)軟控件火熱銷售中 >>
很多常用的軟件中,我們都可以看到分隔欄(Split或SplitContainer)的使用,而且可以點(diǎn)擊然后收縮其中的某個(gè)面板,例如QQ游戲大廳:
.NET也提供了分隔欄控件(Split或SplitContainer),但是卻不能實(shí)現(xiàn)點(diǎn)擊收縮的功能,不過(guò)我們可以在它的基礎(chǔ)上實(shí)現(xiàn)點(diǎn)擊收縮的功能。下面就來(lái)詳細(xì)介紹怎樣實(shí)現(xiàn)分隔欄控件點(diǎn)擊收縮的功能。
首先來(lái)看看最終需要實(shí)現(xiàn)的效果:
現(xiàn)在說(shuō)明一下實(shí)現(xiàn)分隔欄控件點(diǎn)擊收縮的功能的原理,原理很簡(jiǎn)單:
1. 確定點(diǎn)擊按鈕在分割欄的位置(實(shí)現(xiàn)的時(shí)候是取分隔欄的中間位置),然后在分隔欄上把按鈕畫(huà)出來(lái)。
2. 實(shí)現(xiàn)一個(gè)屬性(CollapsePanel),以便選擇使哪一個(gè)面板收縮,SplitContainer控件有兩個(gè)面板,分別是Panel1和Panel2。
3. 提供一個(gè)點(diǎn)擊按鈕的事件(CollapseClick),當(dāng)點(diǎn)擊按鈕的時(shí)候響應(yīng)這個(gè)事件,以方便處理點(diǎn)擊操作,默認(rèn)的處理就是收縮和展開(kāi)面板。
4. 重點(diǎn),處理SplitContainer控件的鼠標(biāo)事件(OnMouseMove、OnMouseDown、OnMouseUp、OnMouseLeave),以便處理按鈕的點(diǎn)擊、是否允許拖動(dòng)分隔欄和改變控件的鼠標(biāo)指針樣式。
下面是SplitContainer控件擴(kuò)展后的類視圖:
下面來(lái)看看中要的實(shí)現(xiàn)代碼:
CollapsePanel屬性:
? ?[?D?e?f?a?u?l?t?V?a?l?u?e?(t?y?p?e?o?f(?C?o?l?l?a?p?s?e?P?a?n?e?l?)?,? "1")]
public CollapsePanel CollapsePanel
{
get { return _collapsePanel; }
set
{
if (_collapsePanel != value)
{
Expand();
_collapsePanel = value;
}
}
}
重寫(xiě)OnMouseMove方法:
? ? ? ? ? ? ? p?r?o?t?e?c?t?e?d o?v?e?r?r?i?d?e v?o?i?d ?O?n?M?o?u?s?e?M?o?v?e?(?M?o?u?s?e?E?v?e?n?t?A?r?g?s? ?e?)?
{?
/?/如?果?鼠?標(biāo)?的?左?鍵?沒(méi)?有?按?下?,?重?置?H?i?s?t?T?e?s?t
i?f ?(?e?.?B?u?t?t?o?n? !?= MouseButtons.Left)
{
_histTest = HistTest.None;
}
Rectangle collapseRect = CollapseRect;
Point mousePoint = e.Location;
//鼠標(biāo)在Button矩形里,并且不是在拖動(dòng)
if (collapseRect.Contains(mousePoint) &&
_histTest != HistTest.Spliter)
{
base.Capture = false;
SetCursor(Cursors.Hand);
MouseState = ControlState.Hover;
return;
}//鼠標(biāo)在分隔欄矩形里
else if (base.SplitterRectangle.Contains(mousePoint))
{
MouseState = ControlState.Normal;
//如果已經(jīng)在按鈕按下了鼠標(biāo)或者已經(jīng)收縮,就不允許拖動(dòng)了
if (_histTest == HistTest.Button ||
(_collapsePanel != CollapsePanel.None &&
_spliterPanelState == SpliterPanelState.Collapsed))
{
base.Capture = false;
base.Cursor = Cursors.Default;
return;
}
//鼠標(biāo)沒(méi)有按下,設(shè)置Split光標(biāo)
if (_histTest == HistTest.None &&
!base.IsSplitterFixed)
{
if (base.Orientation == Orientation.Horizontal)
{
SetCursor(Cursors.HSplit);
}
else
{
SetCursor(Cursors.VSplit);
}
return;
}
}
MouseState = ControlState.Normal;
//正在拖動(dòng)分隔欄
if (_histTest == HistTest.Spliter &&
!base.IsSplitterFixed)
{
if (base.Orientation == Orientation.Horizontal)
{
SetCursor(Cursors.HSplit);
}
else
{
SetCursor(Cursors.VSplit);
}
base.OnMouseMove(e);
return;
}
base.Cursor = Cursors.Default;
base.OnMouseMove(e);
}
重寫(xiě)OnMouseDown方法:
? ? ? ? ? ? ? p?r?o?t?e?c?t?e?d o?v?e?r?r?i?d?e v?o?i?d ?O?n?M?o?u?s?e?D?o?w?n?(?M?o?u?s?e?E?v?e?n?t?A?r?g?s? ?e?)?
{?
R?e?c?t?a?n?g?l?e? ?c?o?l?l?a?p?s?e?R?e?c?t? = ?C?o?l?l?a?p?s?e?R?e?c?t?;?
P?o?i?n?t? ?m?o?u?s?e?P?o?i?n?t? = ?e?.?L?o?c?a?t?i?o?n?;?
? ? ? ? ? ? ? ? ? ? ? i?f ?(?c?o?l?l?a?p?s?e?R?e?c?t?.?C?o?n?t?a?i?n?s?(?m?o?u?s?e?P?o?i?n?t?)? |?|
(?_?c?o?l?l?a?p?s?e?P?a?n?e?l? !?= ?C?o?l?l?a?p?s?e?P?a?n?e?l?.?N?o?n?e? &?&
_?s?p?l?i?t?e?r?P?a?n?e?l?S?t?a?t?e? =?= ?S?p?l?i?t?e?r?P?a?n?e?l?S?t?a?t?e?.?C?o?l?l?a?p?s?e?d?)?)?
{?
_?h?i?s?t?T?e?s?t? = ?H?i?s?t?T?e?s?t?.?B?u?t?t?o?n?;?
r?e?t?u?r?n;?
}?
? ? ? ? ? ? ? ? ? ? ? i?f ?(b?a?s?e.?S?p?l?i?t?t?e?r?R?e?c?t?a?n?g?l?e?.?C?o?n?t?a?i?n?s?(?m?o?u?s?e?P?o?i?n?t?)?)?
{?
_?h?i?s?t?T?e?s?t? = ?H?i?s?t?T?e?s?t?.?S?p?l?i?t?e?r?;?
}
base.OnMouseDown(e);
}
重寫(xiě)OnMouseUp方法:
? ? ? ? ? ? ? p?r?o?t?e?c?t?e?d o?v?e?r?r?i?d?e v?o?i?d ?O?n?M?o?u?s?e?U?p?(?M?o?u?s?e?E?v?e?n?t?A?r?g?s? ?e?)?
{?
b?a?s?e.?O?n?M?o?u?s?e?U?p?(?e?)?;?
b?a?s?e.?I?n?v?a?l?i?d?a?t?e?(b?a?s?e.?S?p?l?i?t?t?e?r?R?e?c?t?a?n?g?l?e?)?;?
? ? ? ? ? ? ? ? ? ? ? ?R?e?c?t?a?n?g?l?e? ?c?o?l?l?a?p?s?e?R?e?c?t? = ?C?o?l?l?a?p?s?e?R?e?c?t?;?
P?o?i?n?t? ?m?o?u?s?e?P?o?i?n?t? = ?e?.?L?o?c?a?t?i?o?n?;?
? ? ? ? ? ? ? ? ? ? ? i?f ?(?_?h?i?s?t?T?e?s?t? =?= ?H?i?s?t?T?e?s?t?.?B?u?t?t?o?n? &?& ?
e?.?B?u?t?t?o?n? =?= ?M?o?u?s?e?B?u?t?t?o?n?s?.?L?e?f?t? &?&
c?o?l?l?a?p?s?e?R?e?c?t?.?C?o?n?t?a?i?n?s?(?m?o?u?s?e?P?o?i?n?t?)?)?
{?
O?n?C?o?l?l?a?p?s?e?C?l?i?c?k?(?E?v?e?n?t?A?r?g?s?.?E?m?p?t?y?)?;?
}?
_?h?i?s?t?T?e?s?t? = ?H?i?s?t?T?e?s?t?.?N?o?n?e?;?
}
重寫(xiě)OnMouseLeave方法:
? ? ? ? ? ? ? p?r?o?t?e?c?t?e?d o?v?e?r?r?i?d?e v?o?i?d ?O?n?M?o?u?s?e?L?e?a?v?e?(?E?v?e?n?t?A?r?g?s? ?e?)?
{?
b?a?s?e.?C?u?r?s?o?r? = ?C?u?r?s?o?r?s?.?D?e?f?a?u?l?t?;?
M?o?u?s?e?S?t?a?t?e? = ?C?o?n?t?r?o?l?S?t?a?t?e?.?N?o?r?m?a?l?;?
b?a?s?e.?O?n?M?o?u?s?e?L?e?a?v?e?(?e?)?;?
}
以上介紹SplitContainer控件的擴(kuò)展,希望能對(duì)你了解擴(kuò)展SplitContainer控件有所幫助。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請(qǐng)務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請(qǐng)郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:網(wǎng)絡(luò)轉(zhuǎn)載