e-works数字化企业网  »  文章频道  »  产品创新数字化(PLM)  »  CAD

MFC在开发UG18.0微机版中的应用

2003/9/13    来源:投稿    特约撰稿人:张军波            莫蓉      
关键字:MFC  UG  

    摘要:鉴于目前UG二次开发中存在的问题,本文提出了一种如何应用MFC开发UG的方法,同使用UIStyler相比,使用MFC开发UG具有速度快,方法简单的特点。本文详细叙述了使用MFC开发UG的过程并给出了一个详细的例程。

    1. 概述

    UG一直是高端CAD市场中的主流产品之一。随着基于三维设计的日益普及,UG在国内的用户也越来越多,为了更好的使用UG所提供的功能,很多用户提出了在UG上进行二次开发的要求。UG目前已经推出了第18版本,但是其开发工具没有太多的变化,还是GRIP和UG/Open,GRIP是一种宏语言开发工具,UG/Open是一种采用C/C++对UG进行二次开发的工具。利用这两个开发工具均可对UG进行二次开发。
    鉴于目前C/C++在微机上十分流行,采用UG/Open对UG进行二次开发依然是用户的首选。UG/Open包含了三部分内容:UG/Open API、UG/Open C++和UI Styler,UG/Open API和UG/Open C++包含了一组访问UG图形数据的函数,其中UG/Open API是标准C的方式,UG/Open C++是C++的方式。UI Styler是应用程序界面的工具,主要用于对话框的定制。我们使用的是微机版的UG18.0,在开发时主要使用的是UG/Open,开发过程中发现UG/Open使用起来很不方便,主要表现在下面几个方面:
    1) 字符串处理,UG/Open基本上采用的是标准C的字符串函数,使用起来非常麻烦,很容易出现错误。由于在开发过程中需要大量使用字符串,无形中增加了开发的周期,如果能使用一个C++的类来处理字符串,例如MFC中提供的CString,将会大大降低开发的周期。
    2) 数据结构的实现,目前很多Windows开发工具都提供了链表、映射、数组等类,对于实现复杂的数据结构非常有用。但是UG/Open中相关的内容很少,想实现复杂的数据结构很困难。
    3) 用户界面的开发,同目前流行的Windows应用程序开发工具相比, UI Styler中包含的控件较少,功能有限,受到的局限太大,使用起来很不方便,有的功能甚至难以实现。
以上问题不仅是我们也是众多UG开发者面临的难题,如何利用Microsoft Fundament Class(MFC)来开发UG的应用程序是许多UG爱好者的梦想。尽管UG 从15.0推出微机版以来,UG/Open应用程序一直采用Microsoft Visual C++ (VC)作为编译器,但是由于UG/Open API中没有直接提供对MFC的支持,所以在UG开发中还不能直接调用MFC。我们通过摸索和大量的实践,提出了一种能够在UG/Open中直接使用MFC的方法,下面将对该方法作详细介绍。

    2. 实现原理

    在实践中,我们发现目前的UG应用程序不能很好的支持MFC的原因在于:我们所创建的UG应用程序基本上都是采用的UG提供的应用程序向导UG/Open AppWizard创建的,该向导创建的应用程序本身不支持MFC。为了让我们的应用程序支持MFC必须抛弃这种应用程序创建方式,在实践中我们按照下面的步骤来创建应用程序:
    1) 在VC的应用程序创建向导中选择MFC AppWizard(dll);
    2) 选择应用程序类型为:Regular DLL using shared MFC DLL;
    3) 结束创建应用程序的过程;
    4) 将UG库文件(libugopenint.lib,libufun.lib)加入所创建的项目。
    5) 结束
    熟悉UG开发的人都知道UG应用程序的入口函数是ufsta,所以下一步的工作就是在应用程序中添加UG/Open函数入口ufsta。这个过程很简单,可以把UG所提供的例子程序中的主函数直接复制过来,或者采用UG/Open AppWizard创建一个项目,然后把主函数复制过来就可以了。

    3. 一个例子的源程序

    以下是我们做的一个在UG中显示模态对话框的例子,为了方便起见,删除了所有的注释语句。CMyDialog是采用MFC创建的一个对话框类,函数DisplayDialog的功能是显示显示模态对话框。其他的代码基本上都是由MFC AppWizard或者UG/Open AppWizard创建的,十分简单。由此可以看出,UG应用程序经过这样改造之后,调用其它的MFC类已经不成问题。因此就实现了利用MFC来开发UG的应用程序的功能。
 

#include "stdafx.h"

#include "ccc.h"

//以下代码与UG有关

#include

#include

#include

#include "resource.h"

#include "MyDialog.h"

void DisplayDialog()

{

       AFX_MANAGE_STATE(AfxGetStaticModuleState());

       CMyDialog dlg;

       dlg.DoModal();

}

extern "C" DllExport void ufsta( char *param, int *returnCode, int rlen )

{

    int errorCode = UF_initialize();

     DisplayDialog ();

    if ( 0 == errorCode )

    {

        errorCode = UF_terminate();

    }

}

extern "C" void ufusr_cleanup(void)

{

}

extern "C"  int ufusr_ask_unload( void )

{

    return( UF_UNLOAD_UG_TERMINATE );

}

//以下代码由MFC AppWizard创建

BEGIN_MESSAGE_MAP(CCccApp, CWinApp)

//{{AFX_MSG_MAP(CCccApp)

        // NOTE - the ClassWizard will add and remove mapping macros here.

        //    DO NOT EDIT what you see in these blocks of generated code!

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

CCccApp::CCccApp()

{

}

CCccApp theApp;
    4. 结束语

    本文中提出的应用程序在下列环境下运行通过:
    操作系统:Windows 2000 Server (Service Pack 2),
    UG版本:UG 18.0微机版
    编译环境:Microsoft Visual C++ 6.0

 

责任编辑:罗伊
本文为e-works原创投稿文章,未经e-works书面许可,任何人不得复制、转载、摘编等任何方式进行使用。如已是e-works授权合作伙伴,应在授权范围内使用。e-works内容合作伙伴申请热线:editor@e-works.net.cn tel:027-87592219/20/21。
e-works
官方微信
掌上
信息化
编辑推荐
新闻推荐
博客推荐
视频推荐