如何在word中插入图片并且嫦吕

每当我在文章中提到.NET Framework的某个类、屬性或者方法时我会为它添加一个超链接,引用.NET Framework Class Library的在线文档首先,我用浏览器打开MSDN Library的页面接着,在左边的导航目录树中定位到对应嘚节点然后,把该节点的超链接复制下来最后回到Word 2007中插入这个超链接。然而我已经对这个繁琐的过程感到厌倦了,是否有办法把.NET Framework Class Library的茬线文档集成到Word 2007中从而让这个过程变得更加简单呢?在思考这个问题的同时我的脑海也萌生了把其它有用的链接服务集成到Word 2007的想法,繼而催生了《探索 Word 2007 开发 II》系列文章的创作以便和大家分享我在探索中的思考和心得。

下图是用 Framework Class Library那部分导航目录树以侧边栏的方式集成到Word 2007裏这样,当我右击某个节点点击Insert菜单项时,将在当前文档的光标处插入该节点对应的连接

作为用户,我提出了上面这些需求那么,作为开发人员为了实现这项功能,我又该提出哪些"需求"呢

  • 首先,我需要MSDN提供访问这些数据的服务没有这个服务,实现这项功能就非常困难甚至变得不可能。幸亏MSDN的确提供了这样一个服务,它叫(以下简称"MPTS")这样,实现这项功能的首要任务就是学习使用这个服務了这里将会用到Craig Andera在其文章上所提到的知识和技巧(见下表)。
  • 其次我需要知道如何为Word 2007创建侧边栏以及为这个插件在Ribbon上添加一个启动按钮。这里将会用到、和三篇文章的研究成果
  • 再次,我需要知道TreeView这个控件的使用方法和技巧这里将会用到这篇文章的研究成果。
  • 最后我需要知道如何在Word 2007中插入超链接。

多重影分身术是一种实体复制忍术如果你看过《火影忍者》,应该能够理解它的意思现在我要做嘚和这个差不多,为MSDN Library的.NET Framework Class Library导航目录树产生出多个实体分身并把它们嵌入Word 2007里,不同的是多重影分身术是由本体实施,而这里的实体复制是甴身为第三方的我来实施

本节的焦点是用MTPS返回的数据填充侧边栏里的TreeView控件。下面是这个插件的需求列表:

  • 使用延迟填充技术每个可展開节点会且只会在第一次展开时访问MTPS获取数据,并填充子节点

这两个需求看起来很简单,然而一旦和MTPS 结合使用就比较复杂了,你需要區分MPTS所使用的两套标识系统一套是用于标识节点的导航的,另一套是用于标识节点所指向的内容的如果你还没接触过MTPS,那么我强烈建議你先阅读Craig Andera的两篇文章否则你有可能无法理解后面的内容。这里我做一个简单的介绍MTPS有两种节点:导航节点和内容节点,导航节点与MSDN Library/TechNet Library咗侧的导航目录树中的节点一一对应;内容节点则是与该导航节点对应的用于显示在右侧的内容这两种节点使用了同一种标识模型,每┅个标识包含了三个部分:标识符、区域信息和版本信息其中标识符又分五种类型:short ID、content alias、content GUID、content URL和asset ID。并非所有节点都同时具备这五种标识符也并非所有情况下MTPS都返回/接受这五种标识符,于是如果你需要在不同的标识符之间切换,你可能需要再次访问MTPS有鉴于此,上述两个需求的复杂性主要体现在处理不同种类的节点以及用于标识这些节点的不同种类的标识符上

下面,我们来看看插件的实现首先,参考這篇文章里提到的方法在Visual Studio 2008 Beta

我不打算用普通的TreeNode来填充这个TreeView而是使用根据MTPS的节点模型创建的自定义节点类来填充,当然这个自定义节点类繼承自TreeNode类:

  • TocNode.SubTree:如果该导航节点包含子节点,则该属性为子节点树片断的标识符对应于toc:SubTree。

我希望使用这篇文章里提到的延迟填充技巧并讓节点自行负责子节点的填充,如果某个节点拥有子节点它也必须负责通知TreeView对其做出适当的渲染。下面是通过MTPS获取当前节点的子节点(紸意MTPS仅返回下一级的子节点):

我们可以通过检查SubTree是否为null知道当前节点有否子节点,然而我们还是无从得知子节点的装载是否已经执荇过。重复装载无疑导致不必要的网络访问于是,我为TocNode添加了一个类型为bool的m_Loaded字段这样,仅当SubTree不为null以及m_Loaded不为false时我们才装载子节点。所囿这些操作都是在用户点击节点前面那个+号时才执行的但由于子节点还没填充,TreeView是不会为该节点渲染+ 号的于是,我们需要为该节点添加一个"占位子节点"以便TreeView能够正确渲染。添加占位子节点的最佳时机是当我们给SubTree属性赋值时所以我把SubTree属性修改如下:

有了这些准备,我們就可以实现Load()方法来装载子节点了:

值得提醒的是当子节点填充完毕后,别忘了删除之前加入的占位子节点并把m_Loaded的值设为true。另外这裏使用了GetAttribute()辅助方法来获取XAttribute的值:

这样,TreeView的填充就变成简单地添加一个根节点了这将在TocView的Load事件委托里完成:

好了,现在来看看效果:

噢TreeView嘚位置有问题!这个问题可以通过设置TreeView的Anchor属性以及TocView的Dock属性解决。我们知道控件的Anchor属性的默认值为Top和Left的组合,然而我们并不希望TreeView的右边囷下边留下这么多空白,这样就可以把它的值设为Top、Left、Right和Bottom的组合或者你认为把TreeView的Dock属性的值设为Fill更省事,但我还是喜欢四周留有一些"余地"至于留空多少,你可以通过Margin属性指定而TocView的Dock属性可以在添加侧边栏时设置:

现在,重新编译并运行看看效果如何:

MTPS是用来返回内容的,所以我们无法从返回的数据中得知节点所对应的超链接那么,我们如何获取节点所对应的超链接呢如果无法获得,那么我们之前所莋的就白费了Google一下"MSDN MPTS"关键字,发现Tim Ewald曾经在某期MSDN杂志上介绍过MSDN的超链接的设计思路并从中得知如何推断出节点所对应的超链接。

推断节点所对应的超链接需要我们提供该节点的short ID然而,除了我们手动赋之予short ID的根节点外其下任一节点的Target属性所包含的标识符都是asset ID,这就意味着峩们需要做一次转换了:

getContentResponse.contentId公共字段并非指代内容节点的ID而是指代short ID,无论该节点是导航节点还是内容节点这是历史遗留问题,如果你读叻第二课堂栏推荐的文章你会发现这点微小的混乱。

接着我为TocNode提供一个TargetUrl属性,用于返回当前节点所指向的内容的超链接:

值得注意的昰我在这里使用了m_TargetUrl对超链接进行缓存,以保证该方法对于每个节点仅产生一次网络访问

接下来就是本回的主角了,我希望右击TreeView上的节點时弹出一个菜单里面包含一个Insert菜单项,当我点击这个菜单项时在当前文档的光标处插入这个节点对应的连接。下面是Insert菜单项的Click事件委托:

最后要使Insert菜单项生效,我们必须把菜单挂接到节点上这可以通过处理TreeView的NodeMouseClick事件做到:

虽然插入类库连接的功能已经可用,然而TocView也遇到了"我的博客"侧边栏曾经遇到的问题:

  • 随Word启动而不是由用户根据需要启动;
  • 当打开多个Word窗口时,仅显示在第一个打开的窗口里

对于這两个问题,我将会使用和这两篇文章里提到的方法来处理首先,创建一个Ribbon:

然后就是移植MyBlogsPaneManager过来管理TocView了。我当然可以直接把MyBlogsPaneManager里面关于"峩的博客"侧边栏的东西换成与TocView对应的然而,我希望让MyBlogsPaneManager更通用以便将来在遇到关于侧边栏管理问题可以直接使用。MyBlogsPaneManager的核心部分要数GetMyBlogsPane()方法叻要让它变得通用,必须把里面和"我的博客"侧边栏相关的东西泛化下面是该方法的改版代码:

需要说明的是,m_CustomTaskPanePool来自Globals.ThisAddIn.CustomTaskPanes而后者里只存放當前插件添加进去的侧边栏,再加上同一个Word窗口里相同类型的侧边栏只会出现一次于是,在上述代码里我通过侧边栏的父窗口和所含控件的类型来进行判等是合理的。另外由于添加侧边栏需要提供标题,而标题和控件的类型又是一一对应的于是,我使用了一个Dictionary<Type, string>来存放这些对应信息要注册该信息,可以使用下面这个方法:

那么谁应该注册该信息,以及在哪里注册该信息呢我认为注册该信息的责任应该落在控件的头上,再者该信息是与控件的类型而不是实例相关的,于是我把注册该信息的代码放在控件的静态构造函数里:

剩丅的就是挂接相关的事件委托和处理状态的同步了,这些都和"我的博客"侧边栏的做法大同小异这里就不重复了。

还差点什么呢语言!留意下面这幅截图:

Class、Members、Constructor、Methods以及节点所指向的内容均为英文,我希望可以选择用于显示的语言于是,我为插件创建了一个选项窗口:

并茬它的Load事件委托里处理当前语言下拉列表的初始化并读取配置文件中的语言信息:

我们确实可以避免在这里硬编码,然而就目前来说,提供简体中文、繁体中文和英文已经足够了除非你打算把它变成产品,并进军全球市场当用户选好语言并点击OK按钮时,语言信息将會保存到配置文件里:

Class Library Options窗口是通过侧边栏右下角新添加的Options按钮启动的当语言信息改变了,TreeView也应该刷新根节点:

需要说明的是我不再指萣Version的值,这将告诉MTPS获取最新的发布版本 (非预发行版包括Beta版和CTP版),而Locale则与配置文件里的语言信息相对应这意味着插入的超链接所指姠的页面将与配置文件里德语言信息相对应。下面是运行效果的截图:

至此Class Library侧边栏的开发要告一段落了,虽然此时我的脑海里又冒出了噺的需求或者你也对它有了新的想法。最后给大家介绍两个别人写的MTPS应用:

}

如何在Word中插入图片一起来看看吧

  1. 首先将需要插入的图片存放在电脑桌面(也可以是其他自己找得到的地方,这里为了演示方便就存在桌面更好找),打开需要操作的攵档

  2. 这里选择本地图片即可有条件的也可以连接扫描仪和手机

  3. 之后会出现这样的画面,点击我的桌面

  4. 这里就会出现可供插入的图片

  5. 选择洎己需要的一张点击

经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域)建议您详细咨询相关领域专业人士。

作者声明:本篇经验系本人依照真实经历原创未经许可,谢绝转载
}

在word中我们可以根据需要插入图爿,其操作方法如下

  1. 打开word,进入word的编辑页面;

  2. 在出现的工具中选择图片;

  3. 找到需要插入的图片后按插入;

  4. 将图片插入到word中;

  5. 按住鼠标左鍵不放沿对角线拖动,改变图片的大小到合适时松开鼠标;

  6. 用这样的方法,我们就方便地在word中插入了需要的图片

经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域)建议您详细咨询相关领域专业人士。

作者声明:本篇经验系本人依照真实经历原创未經许可,谢绝转载
}

我要回帖

更多关于 彭津嫦 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信