所謂的浮動工具欄,效果圖如下:
也就是說,可以將工具欄拖出其原先的停靠位置,而且可以將拖出來的工具欄再拖放回去。
實現的基本思路如下
1、拖動出來以後,需要建立乙個大小合適的視窗,作為工具欄新的停靠容器,這個視窗可以這樣設定:
formborderstyle = system.windows.forms.formborderstyle.fixedtoolwindow;
showicon = false;
showintaskbar = false;
topmost = true;
2、浮動工具欄可以擴充套件自.net framework提供的toolstrip,它被拖動都某個位置,鬆開滑鼠左鍵時,會觸發enddarg事件,在這個事件中,我們將其從原來的停靠容器中移除,同時根據滑鼠左鍵鬆開時,在滑鼠所在位置上建立乙個視窗,作為工具欄的新容器。
這個就是基本的思路了,下面是浮動工具欄floattoolstrip 具體的實現**:
using
system;
using
system.collections.generic;
using
system.componentmodel;
using
system.drawing;
using
system.data;
using
system.text;
using
system.windows.forms;
namespace
floattoolstripdemo
private
toolstripfloatwindow floatform;
public
toolstripfloatwindow floatform
set}
} void
floatform_formclosing(
object
sender, formclosingeventargs e)
private
void
floatform_locationchanged(
object
sender, eventargs e)
else
else if
((currentpt.x
>
minpt.x)
&&(currentpt.x
<
maxpt.x)
&&(currentpt.y
>
minpt.y -25
) &&
(currentpt.y
<
maxpt.y -25
))}}}
public
bool
isfloating
} public
toolstrippanel toolstrippanel
set}
private
void
mytoolstrip_enddrag(
object
sender, eventargs e)
point dockpoint
=cursor.position;
intopenx, openy;
openx
=dockpoint.x;
openy
=dockpoint.y;
point clientpt
=this
.tspanel.parent.pointtoclient(dockpoint);
if(clientpt.y
>
tspanel.height)
} private
void
mytoolstrip_sizechanged(
object
sender, eventargs e)}}
}
動態建立的作為浮動工具欄臨時容器的視窗,需要加入一些處理技巧,以免發生在建立該視窗的工作尚未結束時,dispose了這個視窗,這種情況發生在快速拖動工具欄時,觸發了enddrag事件,導致去建立臨時視窗作為工具欄新的容器,而這時又將工具欄拖回原停靠容器中,會導致dispose還沒有建立完畢的臨時視窗,發生異常!
下面是具體的**:
using
system;
using
system.collections.generic;
using
system.text;
using
system.windows.forms;
namespace
floattoolstripdemo
} public
toolstripfloatwindow():
base()
private
void
toolstripfloatwindow_load(
object
sender, eventargs e)}}
工具欄的建立
mfc 中工具欄關聯的類 c ctrl c c ctrl c 兩個類的區別 c 和 cstatusbar 都是在 control bars 類中的封裝,而 cstatusbarctrl 和 c ctrl 都是在 controls 類中的封裝。c ctrl 和 cstatusbarctrl 它們只是簡...
api 建立工具欄
tbbutton tbbuttons 0,0 0,0 define button count sizeof tbbuttons sizeof tbbuttons 0 hwnd winapi create hwnd hwndparent,hinstance hinst sendmessage hwnd...
RCP建立選單欄工具欄(下拉)
如圖 建立並註冊action override protected void makeactions iworkbenchwindow window 建立選單,選單項 override protected void fillmenubar imenumanager menubar override ...