﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-woaidongmao-随笔分类-UML</title><link>http://www.cppblog.com/woaidongmao/category/7999.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 22 Aug 2008 09:45:26 GMT</lastBuildDate><pubDate>Fri, 22 Aug 2008 09:45:26 GMT</pubDate><ttl>60</ttl><item><title>使用Visio 2000逆向工程将代码转换为UML图表</title><link>http://www.cppblog.com/woaidongmao/archive/2008/08/22/59657.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Fri, 22 Aug 2008 08:33:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/08/22/59657.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/59657.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/08/22/59657.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/59657.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/59657.html</trackback:ping><description><![CDATA[<p>摘要：<a href="http://www.csai.cn/incsearch/search.asp?key=Microsoft">Microsoft</a> Visio 2000 Professional Edition 和 Enterprise Edition 包含通过逆向工程将 Microsoft Visual <a href="http://www.csai.cn/incsearch/search.asp?key=C%2B%2B">C++</a>、Microsoft <a href="http://www.csai.cn/incsearch/search.asp?key=Visual+Basic">Visual Basic</a> 和 Microsoft Visual J++ 代码转换为统一建模语言 (UML) 类图表模型的技术。本文将讨论从每种语言实施逆向工程的步骤。 <p>　　目录 <p>　　简介 <p>　　概述 <p>　　步骤 1：自定义开发环境 <p>　　步骤 2：打开代码项目以实施逆向工程 <p>　　步骤 3：选择“逆向工程”(Reverse Engineer) 按钮 <p>　　步骤 4：在 Visio UML 模型图表解决方案中创建您的 UML 图表 <p>　　简介 <p>Microsoft Visio 2000 Enterprise Edition 和 Professional Edition 都包含通过逆向工程将代码转换为 UML 静态结构图表的解决方案。该解决方案支持三种语言：Microsoft Visual C++ 6.0、Microsoft Visual Basic 6.0 和 Microsoft Visual J++ 6.0。Visio UML 模型图表解决方案所采用的 UML <a href="http://www.csai.cn/incsearch/search.asp?key=%B1%EA%D7%BC">标准</a>为 1.2 版。 <p>　　每种语言使用的逆向工程技术各不相同。对于 J++ 和 Visual Basic，该解决方案使用开发环境的对象模型来收集静态结构信息。对于 C++，该解决方案将浏览信息文件 (.BSC) 用作结构信息的来源。虽然 Visual Basic 和 J++ 逆向工程都使用开发环境的对象模型，但 J++ 对象模型提供了更完整的信息，因此可得到更完整的逆向工程 UML 模型。C++ 中的浏览信息文件包含最少的信息;因此，它所生成的 UML 模型不如 J++ 和 Visual Basic 逆向工程得到的 UML 模型那么完整。 <p>　　本文将介绍通过逆向工程转换到 Visio UML 模型图表解决方案所需的步骤。 <p>　　注意：Visio UML 模型图表解决方案只支持 Microsoft Visual C++ 6.0、Microsoft Visual J++ 6.0 和 Microsoft Visual Basic 6.0 的逆向工程。要使用 Visio UML 外接程序，必须安装 Service Pack 3.0 for Microsoft? Visual Studio?。 <p>　　概述 <p>　　要通过逆向工程将您的代码转换到 Visio UML 模型图表解决方案，应执行以下主要步骤： <p>　　自定义 Visual Studio 开发环境 <p>　　在 Visual Studio 中打开项目以实施逆向工程 <p>　　从“Visio UML 外接程序”(Visio UML Add-In) 工具栏中选择“逆向工程”(Reverse Engineer) 按钮 <p>　　在 Visio UML 模型图表解决方案中创建 UML 类图表 <p>　　本文的其余部分提供了每个步骤的详细指导，并包括特定于编程语言的信息。例如，在自定义开发环境部分，Visual C++、Visual Basic 和 Visual J++ 都有其相应的章节。 <p>　　步骤 1：自定义开发环境 <p>　　为了实施逆向工程，第一步应通过添加“Visio UML 外接程序”(Visio UML Add-In) 工具栏来自定义开发环境。以下指导显示了如何将该工具栏添加到 Visual C++、Visual Basic 和 Visual J++ 的不同环境中。 <p>　　自定义 Microsoft Visual C++ 6.0 <p>　　在 Visual C++ 中，选择 Tools 菜单上的 Customize。 <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/Visio2000UML_E8C9/clip_image001_2.gif"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="234" alt="clip_image001" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/Visio2000UML_E8C9/clip_image001_thumb.gif" width="402" border="0"></a> <p>　　在 Customize 对话框中，选择 Add-ins and Macro Files 选项卡。 <p>　　在 Add-ins and Macro Files 列表中，选择外接程序和宏文件列表中的 Visio UML Add-in。确保旁边的复选框被选中，然后单击 Close。 <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/Visio2000UML_E8C9/clip_image002_2.gif"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="255" alt="clip_image002" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/Visio2000UML_E8C9/clip_image002_thumb.gif" width="375" border="0"></a> <p>　　出现浮动的 Visio UML Add-in 工具栏，其中包含五个按钮。 <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/Visio2000UML_E8C9/clip_image003_2.gif"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="65" alt="clip_image003" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/Visio2000UML_E8C9/clip_image003_thumb.gif" width="136" border="0"></a> <p>　　提示：如果希望该工具栏在每次打开 Microsoft Visual Studio 时都可用，可通过拖动将该工具栏靠接到工具栏区。 <p>　　自定义 Microsoft Visual Basic 6.0 <p>　　在 Visual Basic 中，从“外接程序”菜单中选择“外接程序管理器”。 <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/Visio2000UML_E8C9/clip_image004_2.gif"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="101" alt="clip_image004" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/Visio2000UML_E8C9/clip_image004_thumb.gif" width="544" border="0"></a> <p>　　在“外接程序管理器”对话框中，选择“可用的外接程序”列表中的“Visio UML Add-in”。对于“加载行为”，选择“加载/卸载”和“在启动中加载”，然后单击“确定”。 <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/Visio2000UML_E8C9/clip_image005_2.gif"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="280" alt="clip_image005" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/Visio2000UML_E8C9/clip_image005_thumb.gif" width="372" border="0"></a> <p>　　出现带有四个按钮的“Visio UML 外接程序”工具栏。 <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/Visio2000UML_E8C9/clip_image006_2.gif"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="75" alt="clip_image006" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/Visio2000UML_E8C9/clip_image006_thumb.gif" width="140" border="0"></a> <p>　　提示：Visio UML 外接程序在创建工具栏时，还会向“工具”菜单中添加命令。您可以通过从“Visio UML 解决方案”中选择“工具”来找到这些命令。 <p>　　自定义 Microsoft Visual J++ 6.0 <p>　　在 Visual J++ 中，选择 Tools 菜单上的 Add-In Manager。 <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/Visio2000UML_E8C9/clip_image007_2.gif"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="180" alt="clip_image007" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/Visio2000UML_E8C9/clip_image007_thumb.gif" width="386" border="0"></a> <p>　　在 Add-In Manager 对话框中，选择 Available Add-Ins 列表中的 Visio UML Solution。对于 Load Behavior，选中 Loaded/Unloaded 和 Load On Startup，然后单击 OK。 <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/Visio2000UML_E8C9/clip_image008_2.gif"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="299" alt="clip_image008" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/Visio2000UML_E8C9/clip_image008_thumb.gif" width="387" border="0"></a> <p>　　出现带有四个按钮的 Visio UML Add-in 工具栏。 <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/Visio2000UML_E8C9/clip_image009_2.gif"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="86" alt="clip_image009" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/Visio2000UML_E8C9/clip_image009_thumb.gif" width="166" border="0"></a> <p>　　提示：Visio UML Add-in 在创建工具栏时，还会向 Tools 菜单中添加命令。您可以通过从 Tools 菜单选择 Visio UML Solution 来找到这些命令。 <p>　　步骤 2：打开代码项目以实施逆向工程 <p>　　逆向工程过程从所有这三种语言的开发环境中开始。当通过添加“Visio UML 外接程序”(Visio UML Add-in) 自定义环境后，下一步是打开要实施逆向工程的项目。 <p>Visual C++ 6.0 的附加步骤 <p>　　对于 Visual C++，在开始逆向工程之前，还必须执行几个附加步骤。第一步是生成项目的浏览信息文件 (.BSC)。以下提供了生成浏览文件的指导。第二步是确定逆向工程中要包含的代码库。设置这些选项的指导将在浏览文件指导之后提供。最后，应在实施逆向工程之前构建项目。 <p>　　生成 Visual C++ 6.0 的浏览信息文件 <p>　　在 Visual C++ 中，选择 Project 菜单上的 Settings。 <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/Visio2000UML_E8C9/clip_image010_2.gif"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="197" alt="clip_image010" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/Visio2000UML_E8C9/clip_image010_thumb.gif" width="364" border="0"></a> <p>　　在 Project Settings 对话框中选择所需构建配置的类型，单击 C/C++ 选项卡，然后选中 Generate browse info。 <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/Visio2000UML_E8C9/clip_image011_2.gif"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="269" alt="clip_image011" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/Visio2000UML_E8C9/clip_image011_thumb.gif" width="410" border="0"></a> <p>　　单击 Browse Info 选项卡，指定浏览信息文件的名称和位置，选中 Build browse info file，然后单击 OK。 <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/Visio2000UML_E8C9/clip_image012_2.gif"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="268" alt="clip_image012" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/Visio2000UML_E8C9/clip_image012_thumb.gif" width="410" border="0"></a> <p>　　选择 Visual C++ 6.0 逆向工程所包含的库 <p>　　单击 UML Add-in 工具栏上的 Visio UML Options 按钮，设置 Visual C++ 逆向工程所包含的库。 <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/Visio2000UML_E8C9/clip_image013_2.gif"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="128" alt="clip_image013" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/Visio2000UML_E8C9/clip_image013_thumb.gif" width="200" border="0"></a> <p>　　此时显示 Visio UML Options 屏幕。如果希望在逆向工程中包含 MFC Classes、ATL Classes 或 Standard Include Files 的信息，只需选中所需选项旁边的复选框，然后单击 OK。 <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/Visio2000UML_E8C9/clip_image014_2.gif"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="194" alt="clip_image014" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/Visio2000UML_E8C9/clip_image014_thumb.gif" width="292" border="0"></a> <p>　　步骤 3：从“Visio UML 外接程序”(Visio UML Add-In) 工具栏选择“逆向工程”(Reverse Engineer) 按钮 <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/Visio2000UML_E8C9/clip_image015_2.gif"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="132" alt="clip_image015" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/Visio2000UML_E8C9/clip_image015_thumb.gif" width="204" border="0"></a> <p>　　逆向工程的下一步是从“UML 外接程序”(Visio UML Add-In) 工具栏选择“逆向工程”(Reverse Engineer) 按钮。 <p>　　对于 Visual Basic 和 Visual J++，此操作将在 Visio 2000 中打开 UML 模型图表解决方案，其中会显示通过逆向工程转换为模型的信息。此时 UML 模型图表解决方案打开，并在“UML 导航器”中显示一个空白的静态结构图表和一个树视图，其中包含从项目中收集的模型信息。 <p>　　对于 Visual C++，在 Visio 2000 打开并显示通过逆向工程转换到 UML 模型图表解决方案的项目信息之前，可能会显示另外两个屏幕。如果 Visual C++ 工作区中存在多个项目，可在 Select Project 对话框中选择要实施逆向工程的项目，然后单击 OK。 <p>　　如果项目层次结构中显示了多个浏览文件，可在“选择浏览文件”(Select Browse File) 对话框中选择一个浏览文件，然后单击“确定”(OK)。 <p>　　步骤 4：在 Visio UML 模型图表解决方案中创建您的 UML 图表 <p>　　现在，Visio 2000 应该显示您的项目信息。要创建 UML 类图表，请将模型元素从“UML 导航器”(UML Navigator) 拖放到“静态结构”(Static Structure) 图表上。类关系(泛化、实现、绑定)将会自动显示。利用 Visio UML 模型图表解决方案，您可以生成其他 UML 工件，以指定、构造软件项目并使软件项目形象化和文档化。 <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/Visio2000UML_E8C9/clip_image016_2.gif"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="644" alt="clip_image016" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/Visio2000UML_E8C9/clip_image016_thumb.gif" width="280" border="0"></a></p><img src ="http://www.cppblog.com/woaidongmao/aggbug/59657.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-08-22 16:33 <a href="http://www.cppblog.com/woaidongmao/archive/2008/08/22/59657.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Visio画UML图 类结构图（进阶篇）</title><link>http://www.cppblog.com/woaidongmao/archive/2008/08/22/59656.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Fri, 22 Aug 2008 08:26:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/08/22/59656.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/59656.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/08/22/59656.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/59656.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/59656.html</trackback:ping><description><![CDATA[<p>上一篇文章中说明了类结构图的基本画法。要真正要完成实用的类图，还要有许多工作要做。 <p><b>类之间的关系</b><b></b> <p><b>继承关系</b><b></b> <p>继承关系是最容易理解的关系。画成图的话就像下面这样。面向对象的说法就是is-a关系。也就是说Class2 is a Class1。在C++中我们说Class2是Class1的派生类，或者说Class1是Class2的基类。<a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VisioUML_E70C/clip_image002_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="286" alt="clip_image002" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VisioUML_E70C/clip_image002_thumb.jpg" width="182" border="0"></a> <p><b>聚集和组成</b><b></b> <p>从容易理解的关系说起.经常有一个类是另一格类的数据成员的情况。在UML中表现为，聚集（aggregation)和组成（composition）。 <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VisioUML_E70C/clip_image004_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="117" alt="clip_image004" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VisioUML_E70C/clip_image004_thumb.jpg" width="388" border="0"></a><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VisioUML_E70C/clip_image005_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="184" alt="clip_image005" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VisioUML_E70C/clip_image005_thumb.jpg" width="604" border="0"></a> <p>从图上来看，这两种关系都表现为一端是菱形的直线。其中有菱形的一端是整体，另外一端是部分。区别就是菱形是空心还是实心的。从C++曾序来看的话，如果图画成实心菱形的话，Class1就要负责Class2的创建和销毁。更准确的说，就是如果Class1不存在了，Class2也一定不存在。例如象下面的程序。 <p>class Class2 <p>{ <p>}; <p>class Class1 <p>{ <p>&nbsp;&nbsp;&nbsp; Class2 m_objClass2; <p>} <p>当然也有下面的情况 <p>class Class2 <p>{ <p>}; <p>class Class1 <p>{ <p>&nbsp;&nbsp;&nbsp; Class1（）； <p>&nbsp;&nbsp;&nbsp; ~Class1（）； <p>&nbsp;&nbsp;&nbsp; Class2* m_pClass2Obj; <p>}; <p>光看类的声明就不行了。这是就需要看类的实现部分了。 <p>Class1：：Class1（） <p>{ <p>&nbsp;&nbsp;&nbsp; m_pClass2Obj = new Class1;&nbsp; <p>} <p>Class1::~Class1（） <p>{ <p>&nbsp;&nbsp;&nbsp; delete m_pClass2Obj; <p>&nbsp;&nbsp;&nbsp; m_pClass2 = NULL； <p>} <p>组成（Composition）关系，如果在Class1的对象销毁的时候，比如在析构函数中没有将数据成员销毁的代码，那么这种关系就是聚集（aggregation）关系。当然，销毁数据成员的代码，会有很多种。 <p><b>依赖关系</b><b></b> <p>依赖关系就是在以个类中使用了另一个类。例如下面的代码 <p>Class1：：DoSomething（） <p>{ <p>&nbsp;&nbsp;&nbsp; Class3 obj; <p>&nbsp;&nbsp;&nbsp; obj.DoClass3Work(); <p>} <p>就是这样的情况。画成图的话就像下面这样。 <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VisioUML_E70C/clip_image006_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="135" alt="clip_image006" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VisioUML_E70C/clip_image006_thumb.jpg" width="380" border="0"></a></p><img src ="http://www.cppblog.com/woaidongmao/aggbug/59656.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-08-22 16:26 <a href="http://www.cppblog.com/woaidongmao/archive/2008/08/22/59656.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Visio画UML图 基本操作</title><link>http://www.cppblog.com/woaidongmao/archive/2008/08/22/59655.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Fri, 22 Aug 2008 08:23:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/08/22/59655.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/59655.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/08/22/59655.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/59655.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/59655.html</trackback:ping><description><![CDATA[<h3>目的</h3> <p>画UML图有好多种工具,VISIO只是其中一种.VISIO的动作非常轻快.很多人都在用.但是对众多的C++程序员来讲,存在着一个问题,那就是VISIO中的用语都来自面向对向,和C++程序员常用的说法有所不同.这一点令很多C++程序远很困惑.希望本文能为您解决这个问题. 在我们将使用下面的<a href="http://www.geocities.jp/weiguo_xue/Space/UMLSample.zip">例子（UMLSample.zip）</a>来进行说明。 <h3>启动Visio</h3> <p>然后选择[File]-[New]-[Software]-[UML Model Diagram]就可以进入到UML作图状态了.这时画面至少应该包含3个部分:形状窗口,模型资源管理器,和作图区域.可以通过选择[View]-[Shapes Window]来表示和隐藏形状窗口.模型资源管理器比较麻烦,必须通过[UML]-[View]-[Model Explorer]来进行. <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VisioUML_E667/clip_image001_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="477" alt="clip_image001" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VisioUML_E667/clip_image001_thumb.jpg" width="604" border="0"></a> <h3>创建各种图面</h3> <p>在模型资源管理器中选择[Static Mdel]-[Top Package],点鼠标右键,从弹出菜单中选择[New]-[Static Structure Diagram]即可创建用于制作类结构图的图面了,如果从弹出菜单中选择[New]-[Sequence Diagram]即可创建用于制作时序图的的图面. <h3>设定对象的属性</h3> <p>设定对象的详细信息的大部分操作是通过属性对话框实现的.可以通过在对象上双击鼠标或单击鼠标右键并选择属性属性来表示属性对话框. <h3>几种小技巧</h3> <h4>改变连线的方式</h4> <p>在绘图的过程中连线是最常见的操作.象下图那样,线有直角连接线和直线连接线和曲线连接线三种. <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VisioUML_E667/clip_image002_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="234" alt="clip_image002" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VisioUML_E667/clip_image002_thumb.jpg" width="382" border="0"></a> <p>可以通过,用鼠标右键点击希望改变种类的连接线,在弹出菜单中选择适当的连接线种类. <h4>扩大和缩小</h4> <p>我想说的不是当然我们可以通过菜单实现扩大和缩小,而是通过按住Ctrl键,在上滚/下滚鼠标的滚轮来实现扩大和缩小. <h4>上下/左右滚动屏幕</h4> <p>除了用鼠标拖动滚动条的方法以外,用鼠标滚轮也可以上下滚动屏幕.那么左右滚动呢,你可能已经猜到了,先按下Shift键就可以了. <h4>拷贝已经存在的对象</h4> <p>首先按下Ctrl键,用鼠标脱动对象,最后释放Ctrl键就可以了.需要注意的Ctrl键释放的时机一定要在鼠标释放之后. <h4>画水平线/垂直线</h4> <p>按下Shift键,在拖动鼠标画线,就可以很简单的画出水平线和垂直线.其实还可以画45度的斜线.</p><img src ="http://www.cppblog.com/woaidongmao/aggbug/59655.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-08-22 16:23 <a href="http://www.cppblog.com/woaidongmao/archive/2008/08/22/59655.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用Visio画UML图 类结构图（基本篇）</title><link>http://www.cppblog.com/woaidongmao/archive/2008/08/22/59654.html</link><dc:creator>肥仔</dc:creator><author>肥仔</author><pubDate>Fri, 22 Aug 2008 08:20:00 GMT</pubDate><guid>http://www.cppblog.com/woaidongmao/archive/2008/08/22/59654.html</guid><wfw:comment>http://www.cppblog.com/woaidongmao/comments/59654.html</wfw:comment><comments>http://www.cppblog.com/woaidongmao/archive/2008/08/22/59654.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/woaidongmao/comments/commentRss/59654.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/woaidongmao/services/trackbacks/59654.html</trackback:ping><description><![CDATA[<p></p> <p>因为类图很直观,所以恐怕C++成员首先接触到的应该就是类图了.在这篇文章中我们要将下面一个在MFC程序中随处可以见到类用UML图表现出来. <p>class CGraphicObject <p>{ <p>&nbsp;&nbsp;&nbsp; CRect m_rectBound; <p>public: <p>&nbsp;&nbsp;&nbsp; BOOL SetRect(CRect rect); <p>&nbsp;&nbsp;&nbsp; CRect GetRect(); <p>}; <h3>创建类图</h3> <p>在模型资源管理器中选择[Static Model]-[Top Package],点鼠标右键,从弹出菜单中选择[New]-[Static Structure Diagram]即可创建用于制作类结构图的图面了. <h3>准备工作</h3> <p>首先我们遇到的问题是,CRect和BOOL两种类型在Visio数据类型中找不到.所以我们先从追加数据类型开始.为了便于管理我们会先创建MFC数据类型包. <h4>创建数据包</h4> <p>右键点击下图中模型资源管理器的根节点.在弹出菜单中,选择[包]项目. <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VisioUML_E5AA/clip_image001_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="310" alt="clip_image001" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VisioUML_E5AA/clip_image001_thumb.jpg" width="193" border="0"></a> <p>下图是弹出的包属性对话框.点击[New]按钮,在[UML Package]列中输入[MFC Data Types],点击[OK]按钮结束.上图可以看到追加的MFC数据类型包.  <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VisioUML_E5AA/clip_image002_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="369" alt="clip_image002" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VisioUML_E5AA/clip_image002_thumb.jpg" width="604" border="0"></a> <h4>追加BOOL数据类型</h4> <p>在[MFC Data Types]项目上点击右键,选择[New]-[Data Type],在弹出的[UML Datatype Property]窗口中的类别窗口中选择[DataType]项目,在名称项目中填写[BOOL],选择[OK]结束.用同样的方法追加CRect类型. <p>注意:在MFC中CRect是一个类,但是由于我们并不关心CRect的细节,所以把CRect作为简单数据类型来处理. <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VisioUML_E5AA/clip_image003_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="400" alt="clip_image003" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VisioUML_E5AA/clip_image003_thumb.jpg" width="604" border="0"></a> <h4>追加一个类</h4> <p>追加一个类很简单,然后从形状窗口中的[UML Static Sturcture]分类中拖动[Class]对象就可以了. <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VisioUML_E5AA/clip_image004_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="372" alt="clip_image004" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VisioUML_E5AA/clip_image004_thumb.jpg" width="580" border="0"></a> <h3>设定类的详细信息</h3> <p>设定类的详细信息的大部分工作都是同时属性对话框实现的.对于C++程序员来说,需要设定的内容包括类名,数据成员,成员函数. <p>以开头提到的类为例。 <h4>类名</h4> <p>首先在[Categories]窗口中选择[Class]项目,然后在右面的名称栏目中写入类名就可以了.在这一页中我们可以暂时不必在意其他的内容. <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VisioUML_E5AA/clip_image005_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="332" alt="clip_image005" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VisioUML_E5AA/clip_image005_thumb.jpg" width="604" border="0"></a> <p>如果只是设定类名的话,大可不必用属性对话框.只要在选中类对象后,再在最上面一栏中单击左键,然后在输入就可以了. <h4>添加数据成员</h4> <p>在[Categories]窗口中选择[Attributes]项目,在右面的画面中增加属性。[Attribute]栏目中写入变量名，[Type]是用来选择数据类型的。这里我们选择[MFC DataTypes::CRect]。[Visibility]栏目选择的是这个成员是公共的(public)，保护的(protected)还是私有的(private)。这里我们选择[protected].[Multiplicity]一般翻译成多重性，是指，在类中，数据成员的个数。[1]代表在这个类中，有而且只有一个数据成员。[0..1]表示，没有或者有一个。可以在[Init.Value]中输入数据成员的初值。 <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VisioUML_E5AA/clip_image007_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="214" alt="clip_image007" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VisioUML_E5AA/clip_image007_thumb.jpg" width="388" border="0"></a> <h4>增加成员函数</h4> <p>在[Category]窗口中选择[Operations]项目，在右面的表格中追加成员函数。在［Ｖｉｓｉｂｌｉｌｉｔｙ］中选择函数是，共有，保护还是私有的。［Ｐｏｌｙｍｏｒｐｈｉｃ］表示函数是否为多态，也就是使否是虚函数。［Ｓｃｏｐｅ］表示一个函数是属于实例（ｉｎｓｔａｎｃｅ）还是属于类（ｃｌａｓｓｉｆｉｅｒ），静态函数，也被称为类的成员函数，普通的成员函数也被称为实例的成员函数。所以如过，在这里选中了［ｃｌａｓｓｉｆｉｅｒ］，就说明这个函数是静态函数。 <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VisioUML_E5AA/clip_image009_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="214" alt="clip_image009" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VisioUML_E5AA/clip_image009_thumb.jpg" width="388" border="0"></a> <p>上面的操作，只是设定函数的一些基本信息，更详细的信息可以通过选中函数后，点击［属性］按钮，在出现的［ＵＭＬ　Ｏｐｅｒａｔｉｏｎ　Ｐｒｏｐｅｒｔｉｅｓ］窗口中设定。首先是设定函数的基本信息。和上面的窗口重复的内容，我们不再说明。我们只说明［Ｐｒｏｆｉｘ］和［Ｓｕｆｆｉｘ］。如果我们想要返回的类型是指针类型或者是应用类型的话，只要在［ｓｕｆｆｉｘ］中填写［＊］或［&amp;］就可以了。 <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VisioUML_E5AA/clip_image011_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="226" alt="clip_image011" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VisioUML_E5AA/clip_image011_thumb.jpg" width="388" border="0"></a> <p>接下来是设定函数的参数。这个函数只有一个参数ｒｅｃｔ，但是［Ｐａｒａｍｅｔｅｒ］窗口中却出现了，两个参数。不过通过观察［Ｋｉｎｄ］列的内容可以知道，第一个参数［ＳｅｔＲｅｃｔ］是函数的返回值。第二个［ｒｅｃｔ］才是我们想要的。这个参数的［Ｋｉｎｄ］是［ｉｎ］表明这个参数是用来向函数传递信息的。如果是用来取得信息的，就选择［ｏｕｔ］，如果是双方向传递信息的，就选择［ｉｎｏｕｔ］。 <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VisioUML_E5AA/clip_image012_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="351" alt="clip_image012" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VisioUML_E5AA/clip_image012_thumb.jpg" width="604" border="0"></a> <p>完成上面的工作以后，点击［ＯＫ］按钮两次，回到作图画面。来看看我们的成果吧。 <p><a href="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VisioUML_E5AA/clip_image013_2.jpg"><img style="border-right: 0px; border-top: 0px; border-left: 0px; border-bottom: 0px" height="209" alt="clip_image013" src="http://www.cppblog.com/images/cppblog_com/woaidongmao/WindowsLiveWriter/VisioUML_E5AA/clip_image013_thumb.jpg" width="432" border="0"></a> <p>实际的<a href="http://www.geocities.jp/weiguo_xue/Space/UMLSample.zip">例子工程</a>中的CGraphicObject的UML图可以参照<a href="http://www.geocities.jp/weiguo_xue/Space/Sample1vsd.zip">Sample1Vsd.zip</a>. </p><img src ="http://www.cppblog.com/woaidongmao/aggbug/59654.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/woaidongmao/" target="_blank">肥仔</a> 2008-08-22 16:20 <a href="http://www.cppblog.com/woaidongmao/archive/2008/08/22/59654.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>