如何建立C 版浮動工具欄?

2021-05-23 13:17:18 字數 2659 閱讀 9382

所謂的浮動工具欄,效果圖如下:

也就是說,可以將工具欄拖出其原先的停靠位置,而且可以將拖出來的工具欄再拖放回去。

實現的基本思路如下

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 ...