PictureStudio开发笔记04-工具栏的动态更新及其它

来源:互联网 发布:重生漫威之我是矩阵 编辑:程序博客网 时间:2024/05/16 05:13

本人同意他人对我的文章引用,但请在引用时注明出处,谢谢.作者:蒋志强

VS2005集成开发环境中编写WinForm类型程序,可以很方便的使用IDE来添加设置窗口中的工具栏。但这样使用IDE创建的工具栏是固定的,不能满足我们在程序运行中改变工具栏的要求。

在专业绘图软件PhotoShop或其它绘图软件中,一般都提供工具箱,用户在工具箱中选中一个工具,工具栏中会调整为相应的控件。在PictureStudio中,也需要实现这样的功能效果。这篇文章里我介绍了具体的操作方法。

.NET FrameWork2.0的框架类库中,提供了ToolStrip类表示工具栏。ToolStrip类中有一个类型为ToolStripItemCollection名字叫做Items的属性,表示工具栏中的各种控件。可以通过Items属性为工具栏添加删除各种工具栏控件。

 

所以以下的代码,我实现了动态的更新工具栏

//根据当前选中的工具箱中的工具更新工具栏内容

        
public void UpDataMainFormCurrentToolBar()

        
{      

            System.ComponentModel.ComponentResourceManager resources 
= 

                
new System.ComponentModel.ComponentResourceManager(typeof(MainForm));

                        

            toolBoxToolBar.Items.Clear();                        

            

            ToolStripItem[] itemCollection 
= 

                
new ToolStripItem[ToolBox.ToolBoxInstance.CurrentTool.ToolControlItems.Length + 1];

 

            itemCollection[
0= toolBoxPopButton;

            
for (int i = 0; i < ToolBox.ToolBoxInstance.CurrentTool.ToolControlItems.Length; i++)

            
{

                itemCollection[i 
+ 1= ToolBox.ToolBoxInstance.CurrentTool.ToolControlItems[i] as ToolStripItem;

            }
      

 

            toolBoxToolBar.Items.AddRange(itemCollection);

 

            resources.ApplyResources(
this.toolBoxToolBar, "toolBoxToolBar");

            
this.toolBoxToolBar.Name = "toolBoxToolBar";

            
this.toolBoxToolBar.RenderMode = System.Windows.Forms.ToolStripRenderMode.System;

            

            
this.Visible = true;

        }


 

在上面的代码中,当需要更新工具栏的内容的时候,首先清空了工具栏中当前包含的控件,然后根据当前选中的工具箱中工具的类型,添加该类型工具应该对应的控件。在添加完成以后,我对了主窗口的Visible属性赋值为true。这样让窗口显示马上进行刷新,看到更新后的工具栏。

还需要留意的是,常规情况下能够放进工具栏中的控件类型只有几种,包括:ToolStripButton,ToolStripComboBox, ToolStripLable等若干个有限的控件。其它的控件无法在Items属性中直接使用Add添加进去。如果你要添加一个NumeicUpDown控件,你是无法直接在在ToolStrip中的Items属性直接进行Add。这个时候,你需要ToolStripControlHost类的帮助,通过这个类你可以将任何你所希望使用的控件添加到ToolStrip工具栏中。

具体的操作方法如下面的代码所示:

public class ToolStripNumericUpDown:ToolStripControlHost

    
{

        
public ToolStripNumericUpDown()

            : 
base(new NumericUpDown())

        
{ }

 

        
public NumericUpDown NumericUpDownControl

        
{

            
get

            
{

                
return Control as NumericUpDown;

            }


        }


}


 

我们需要通过ToolStripControlHost对所希望添加的控件进行包装。操作步骤是:首先从ToolStripControlHost继承,定义一个子类,在构造函数中调用基类的构造函数,也就是ToolStripControlHost类的构造函数,并使用所要包装的控件的对象作为基类构造函数的参数。然后可以定义一个属性,返回所定义的这个类的Control字段,实际上这个字段就是所包装的控件的对象。

通过以上的方式,我们把NumericUpDown控件包装为了ToolStripNumericUpDown控件,这样就可以加入到ToolStrip工具栏中了。不仅对于.Net框架类库中那些不是ToolStrip工具栏支持的控件可以使用这样的方式,对于自己定义的控件也可以进行这样的包装,让其可以添加到工具栏中。

 

运行效果见下面的图片。这是点击工具栏第二行第二列的工具时,工具栏的状态:

这是点击工具栏第一行第一列的工具的时,工具栏的状态,可以看到工具栏中动态添加了一个NumericUpDown控件。

 

学校放假了,PictureStudio还是要继续的。10号放假回重庆了,本来满高兴的回家,回来才发现真是太热了,哎。好好放假轻松一下,但功课和PictureStudio还要继续的。good luck to PictureStudio……

 

原创粉丝点击