XTP dockingpane的使用方法

codejockdockingpane.挺好用的 
具体功能都已经实现了。
效果图:

步骤:
1.
在窗体上放一个DockingPane的控件。
2.
添加DockingPanedll引用
3.
添加using XtremeDockingPane;
4.
设置DockingPan的属性
private void init(DataSet ds)
{
try
{
//
创建面板
XtremeDockingPane.Pane PaneToolBox = 
DockingPaneManager.CreatePane(ID.PANE_TOOLBOX,140, 100, DockingDirection.DockLeftOf, null);
PaneToolBox.Title = "
工具栏";//设置标题
PaneToolBox.Hide();//
隐藏
DockingPaneManager.RedrawPanes();//
重绘
DockingPaneManager.Options.ShowContentsWhileDragging = true;//
拖拽时是否显示内容
//
显示移动标示
DockingPaneManager.Options.ShowDockingContextStickers = true;
DockingPaneManager.Options.AlphaDockingContext = true;
DockingPaneManager.VisualTheme = VisualTheme.ThemeWord2007;//
设置主题
DockingPaneManager.PanelPaintManager.Font.Size = 9;//
设置字号
DockingPaneManager.PanelPaintManager.Font.Bold = true;//
设置粗体    
}
catch (Exception ex)
{
}
}
5.
设置要显示的内容。(自定义)

#region 
为菜单数据源赋值
private static void InitMenu()
{
DataTable dt = new DataTable();
dt.Columns.Add("Uuid");
dt.Columns.Add("Resourcename");
dt.Columns.Add("Parentid");
dt.Columns.Add("SortCode");
DataRow dr = dt.NewRow();
dr[0] = "6AE68889-2AF4-4C79-9564-6252AA35FE71";
dr[1] = "
系统管理";
dr[2] = "0";
dr[3] = "6";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = "5BBA2F6F-83B1-4FD3-B061-F08BBD9BE71E";
dr[1] = "
日志查看";
dr[2] = "6AE68889-2AF4-4C79-9564-6252AA35FE71";
dr[3] = "0";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = "6BBA2F6F-83B1-4FD3-B061-F08BBD9BE71E";
dr[1] = "
修改密码";
dr[2] = "6AE68889-2AF4-4C79-9564-6252AA35FE71";
dr[3] = "1";
dt.Rows.Add(dr);
//////////////////////////////////////////////
dr = dt.NewRow();
dr[0] = "5AE68889-2AF4-4C79-9564-6252AA35FE12";
dr[1] = "
权限管理";
dr[2] = "0";
dr[3] = "5";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = "4g3f2d6F-83B1-4FD3-B061-F08BBD9BE71E";
dr[1] = "
分配权限";
dr[2] = "5AE68889-2AF4-4C79-9564-6252AA35FE12";
dr[3] = "1";
dt.Rows.Add(dr);
////////////////////////////////////////////////
dr = dt.NewRow();
dr[0] = "5AE644449-2AF4-4C79-9564-6252AA35FE12";
dr[1] = "
综合查询";
dr[2] = "0";
dr[3] = "4";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = "4g3f2d6F-23B1-4FD3-B061-F08BBD9BE71E";
dr[1] = "
人员查询";
dr[2] = "5AE644449-2AF4-4C79-9564-6252AA35FE12";
dr[3] = "1";
dt.Rows.Add(dr);
////////////////////////////////////////////////
dr = dt.NewRow();
dr[0] = "5AE644449-2AF3-4C79-9564-6252AA35FE12";
dr[1] = "
统计报表";
dr[2] = "0";
dr[3] = "3";
dt.Rows.Add(dr);
dr = dt.NewRow();
dr[0] = "4g3f2d6F-83B1-4FD2-B061-F08BBD9BE71E";
dr[1] = "
报表初审";
dr[2] = "5AE644449-2AF3-4C79-9564-6252AA35FE12";
dr[3] = "1";
dt.Rows.Add(dr);
dsMenu.Tables.Add(dt);
}
#endregion
写一个事件,弹出CommandPane

private void DockingPaneManager_AttachPaneEvent(object sender, AxXtremeDockingPane._DDockingPaneEvents_AttachPaneEvent e)
{
try
{
switch (e.item.Id)
{
case ID.PANE_TOOLBOX:
if (frmCommandPaneView == null)
frmCommandPaneView = new CommandPane(dsMenu);
e.item.Handle = frmCommandPaneView.Handle.ToInt32();
break;
}
}
catch (Exception err)
{
}
}
CommandPane里面

DataSet dsMenu;
public CommandPane(DataSet ds)
{
InitializeComponent();
dsMenu = ds;
CreateShortcutBar();
}
8,
上面引用了这么一个方法

void CreateShortcutBar()
{
DataRow[] rowP;
DataRow[] rowC;
string uuid;
bool flag = false;
frmTopMenu top;
rowP = dsMenu.Tables[0].Select("Resourcename='
综合查询'");
if (rowP.Length > 0)
{
uuid = rowP[0][0].ToString();
rowC = dsMenu.Tables[0].Select("Parentid='" + uuid + "'");
if (rowC.Length > 0)
{
top = new frmTopMenu("
综合查询", dsMenu);
ShortcutBarItem ItemZH = wndShortcutBar.AddItem(ID.SHORTCUT_INBOX, "
综合查询", top.Handle.ToInt32());
if (!flag)
{
wndShortcutBar.Selected = ItemZH;
flag = true;
}
}
}
wndShortcutBar.ExpandedLinesCount = wndShortcutBar.ItemCount;             
wndShortcutBar.Icons = (XtremeShortcutBar.ImageManagerIcons)ImageManager.Icons;
}
上面用到了一个frmTopMenu窗体

static public frmTopMenu Instance;
DataSet ds;
public frmTopMenu()
{
InitializeComponent();
Instance = this;
}
public frmTopMenu(string caption, DataSet dsMenu)
{
InitializeComponent();
ds = dsMenu;
loadItems(caption);
menuCaption.Caption = caption;
}
获得传来的菜单数据集,然后调用这个方法

private void loadItems(string caption)
{
DataRow[] rowP;
DataRow[] rowC;
string uuid;
switch (caption)
{
case "
综合查询":
tvwMenu.Nodes.Clear();
rowP = ds.Tables[0].Select("Resourcename='
综合查询'", "SortCode ASC");
uuid = rowP[0][0].ToString();
rowC = ds.Tables[0].Select("Parentid='" + uuid + "'");
for (int i = 0; i < rowC.Length; i++)
{
string name = rowC[i][1].ToString();
icon++;
tvwMenu.Nodes.Add(name, name, icon, 0);
}
break;
}
}
窗体上有一个treeview和一个AxShortCutCaption控件

treeview
有一个事件,用于显示标题内容

private void tvwMenu_MouseDown(object sender, MouseEventArgs e)
{
TreeNode tn = tvwMenu.GetNodeAt(e.X, e.Y);
if (tn != null)
{
string name = tn.Text;
MessageBox.Show(name);
}
}
至此,基本上显示就没有问题了。
总结:一个主窗口,一个CommandPane窗口。
主窗口有一个控件,名为DockingPaneManager,有一个事件。
CommandPane
窗口有一个控件,名为CommandPane
问题;在不是MDI窗体的情况下,如何实现右侧内容随着菜单大小变化而变化位置?
解决:  
private void DockingPaneManager_ResizeEvent(object sender, EventArgs e)
{
int left, top, right, bottom;
DockingPaneManager.GetClientRect(out left, out top, out right, out bottom);
this.groupBox1.SetBounds(left, top, right - left, bottom - top);            
}
DockingPaneManager
为工具栏的名字
groupBox1
右边所有控件的容器的名字(用pane也一样)

你可能感兴趣的:(mfc,vc++,界面,停靠窗,xtp)