找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 968|回复: 1

[分享] 在ObjectARX中使用MFC-标签式对话框

[复制链接]

已领礼包: 13个

财富等级: 恭喜发财

发表于 2019-1-14 23:02:31 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
先附上流程图:

在ObjectARX中使用MFC-标签式对话框-1.jpg


(1) 创建工程


在ObjectARX中使用MFC-标签式对话框-2.jpg



在ObjectARX中使用MFC-标签式对话框-3.jpg

在ObjectARX中使用MFC-标签式对话框-4.jpg





(2)插入一个对话框

双击.rc文件

在ObjectARX中使用MFC-标签式对话框-5.jpg

右键-》选中添加资源


在ObjectARX中使用MFC-标签式对话框-6.jpg

在ObjectARX中使用MFC-标签式对话框-7.jpg


修改对话框ID:IDD_OPTION_SHEET

在ObjectARX中使用MFC-标签式对话框-8.jpg


在上面添加一个Tab控件, 修改ID:IDC_TAB

在ObjectARX中使用MFC-标签式对话框-9.jpg

(3)为此对话框添加映射类COptionSheet,基类为CAcUiTabMainDialog


在ObjectARX中使用MFC-标签式对话框-10.jpg




(4)再插入一个对话框资源(IDD_TEXT_PAGE)

右击,选“插入dialog”


在ObjectARX中使用MFC-标签式对话框-11.jpg



在ObjectARX中使用MFC-标签式对话框-12.jpg

放置一个文本框


在ObjectARX中使用MFC-标签式对话框-13.jpg

在ObjectARX中使用MFC-标签式对话框-14.jpg



在ObjectARX中使用MFC-标签式对话框-15.jpg

(5)创建文字选项卡的映射类CTextPage

在ObjectARX中使用MFC-标签式对话框-16.jpg

在ObjectARX中使用MFC-标签式对话框-17.jpg



(6)插入第二个选项卡对应的资源对话框(IDD_CONREOL_PAGE)

添加Group Box按钮

在ObjectARX中使用MFC-标签式对话框-18.jpg

内部放置两个单选按钮(ID分别为:IDC_RADIO1和IDC_RADIO2),只勾选第一个按钮的Group选项



在ObjectARX中使用MFC-标签式对话框-19.jpg

添加一个复选框控件

在ObjectARX中使用MFC-标签式对话框-20.jpg

点击一下对话框,修改属性

在ObjectARX中使用MFC-标签式对话框-21.jpg

创建这个选项卡对话框的映射类CControlPage


在ObjectARX中使用MFC-标签式对话框-22.jpg

在ObjectARX中使用MFC-标签式对话框-23.jpg


(7)在COptionSheet类中,为Tab控件添加映射成员变量

点击Tab控件框,右键选择“添加变量”


在ObjectARX中使用MFC-标签式对话框-24.jpg

在ObjectARX中使用MFC-标签式对话框-25.jpg


(8) 在COptionSheet类中添加两个成员变量

CTextPage m_textPage;

CControlPage m_controlPage;

在ObjectARX中使用MFC-标签式对话框-26.jpg

注:上图中的变量名应为:m_textPage

在ObjectARX中使用MFC-标签式对话框-27.jpg

在ObjectARX中使用MFC-标签式对话框-28.jpg




(9)创建IDD_OPTION_SHEET对话框的初始化事件

在ObjectARX中使用MFC-标签式对话框-29.jpg


在ObjectARX中使用MFC-标签式对话框-30.jpg


(10)在命令的实现函数中加入下面的代码,并添加头文件:#include "OptionSheet.h"

在ObjectARX中使用MFC-标签式对话框-31.jpg

这时候 编译程序,并打开CAD,看看是否能弹出对话框

在ObjectARX中使用MFC-标签式对话框-32.jpg

(11)添加一个新类CIniFile(C++常规类) ,用于读写INI文件中的键值


在ObjectARX中使用MFC-标签式对话框-33.jpg

在ObjectARX中使用MFC-标签式对话框-34.jpg


(13)类的实现内容

IniFile.h:

  1. #pragma once
  2. class CIniFile
  3. {
  4. public:
  5.         CIniFile();
  6.         //~CIniFile();

  7.         CIniFile(const TCHAR* fileName);

  8.         virtual ~CIniFile();

  9.         //指定字段和键的名称,获得对应的键值
  10.         bool GetValueOfKey(const TCHAR* strFieldName, const TCHAR* strKeyName, CString &strValue, int bufferLength = 1000) const;
  11.         bool GetValueOfKey(const TCHAR* strFieldName, const TCHAR* strKeyName, int &nValue) const;

  12.         bool GetValueOfKey(const TCHAR* strFieldName, const TCHAR* strKeyName, byte &byteValue) const;
  13.         bool GetValueOfKey(const TCHAR* strFieldName, const TCHAR* strKeyName, bool &bValue) const;

  14.         bool GetValueOfKey(const TCHAR* strFieldName, const TCHAR* strKeyName, double &dValue) const;

  15.         //指定字段名和键的名称,写入对应的键值
  16.         bool SetValueOfKey(const TCHAR* strFieldName, const TCHAR* strKeyName, const TCHAR* strValue);
  17.         bool SetValueOfKey(const TCHAR* strFieldName, const TCHAR* strKeyName, int nValue);

  18.         bool SetValueOfKey(const TCHAR* strFieldName, const TCHAR* strKeyName, byte byteValue);
  19.         bool SetValueOfKey(const TCHAR* strFieldName, const TCHAR* strKeyName, bool bValue);

  20.         //decimalplaces小数点位数
  21.         bool SetValueOfKey(const TCHAR* strFieldName, const TCHAR* strKeyName, double dValue, int decimalPlaces = 2);

  22. private:
  23.         CString m_strFile;//INI文件的保存位置
  24. };

IniFile.cpp

  1. #include "stdafx.h"
  2. #include "IniFile.h"


  3. CIniFile::CIniFile()
  4. {
  5. }


  6. CIniFile::~CIniFile()
  7. {
  8. }

  9. CIniFile::CIniFile(const TCHAR* fileName)
  10. {
  11.         m_strFile = fileName;
  12. }

  13. //指定字段和键的名称,获得对应的键值
  14. bool CIniFile::GetValueOfKey(const TCHAR* strFieldName, const TCHAR* strKeyName, CString &strValue, int bufferLength) const
  15. {
  16.         assert(m_strFile.GetLength() > 0);

  17.         CString strDefault = TEXT("NotExist");//如果找不到对应的键,则返回该值
  18.         CString strTemp;

  19.         DWORD dwCharacters = ::GetPrivateProfileString(strFieldName,
  20.                 strKeyName,
  21.                 strDefault,
  22.                 strTemp.GetBuffer(bufferLength),
  23.                 bufferLength,
  24.                 m_strFile);
  25.         strTemp.ReleaseBuffer();

  26.         //注意GetPrivateProfileString函数的错误形式
  27.         if (strTemp.Compare(strDefault) == 0)
  28.         {
  29.                 return false;
  30.         }
  31.         else
  32.         {
  33.                 strValue = strTemp;
  34.                 return true;
  35.         }
  36. }

  37. bool CIniFile::GetValueOfKey(const TCHAR* strFieldName, const TCHAR* strKeyName, int &nValue) const
  38. {
  39.         CString strValue = TEXT("");
  40.         if (GetValueOfKey(strFieldName, strKeyName, strValue))
  41.         {
  42.                 nValue = _ttoi(strValue);
  43.                 return true;
  44.         }
  45.         else
  46.         {
  47.                 return false;
  48.         }
  49. }

  50. bool CIniFile::GetValueOfKey(const TCHAR* strFieldName, const TCHAR* strKeyName, byte &byteValue) const
  51. {
  52.         CString strValue = TEXT("");
  53.         if (GetValueOfKey(strFieldName, strKeyName, strValue))
  54.         {
  55.                 byteValue = (byte)(_ttoi(strValue));
  56.                 return true;
  57.         }
  58.         else
  59.         {
  60.                 return false;
  61.         }
  62. }

  63. bool CIniFile::GetValueOfKey(const TCHAR* strFieldName, const TCHAR* strKeyName, bool &bValue) const
  64. {
  65.         CString strValue = TEXT("");
  66.         if (GetValueOfKey(strFieldName, strKeyName, strValue))
  67.         {
  68.                 bValue = bool(_ttoi(strValue) == 1);
  69.                 return true;
  70.         }
  71.         else
  72.         {
  73.                 return false;
  74.         }
  75. }

  76. bool CIniFile::GetValueOfKey(const TCHAR* strFieldName, const TCHAR* strKeyName, double &dValue) const
  77. {
  78.         CString strValue = TEXT("");
  79.         if (GetValueOfKey(strFieldName, strKeyName, strValue))
  80.         {
  81.                 //dValue = _tstof(strValue)//CString转double
  82.                 TCHAR* szStop = NULL;
  83.                 dValue = _tcstod(strValue, &szStop);//CString转double
  84.                 return true;
  85.         }
  86.         else
  87.         {
  88.                 return false;
  89.         }
  90. }

  91. //指定字段名和键的名称,写入对应的键值
  92. bool CIniFile::SetValueOfKey(const TCHAR* strFieldName, const TCHAR* strKeyName, const TCHAR* strValue)
  93. {
  94.         //防止在调用函数之前m_strFile未被初始化
  95.         if (m_strFile.IsEmpty())
  96.         {
  97.                 AfxMessageBox(TEXT("在调用函数SetValueOfKey时,m_strFile未被赋值,异常退出"));
  98.                 return false;
  99.         }

  100.         BOOL bRet = ::WritePrivateProfileString(strFieldName,
  101.                 strKeyName,
  102.                 strValue,
  103.                 m_strFile);

  104.         if (bRet)
  105.         {
  106.                 return true;
  107.         }
  108.         else
  109.                 return false;
  110. }

  111. bool CIniFile::SetValueOfKey(const TCHAR* strFieldName, const TCHAR* strKeyName, int nValue)
  112. {
  113.         CString strValue = TEXT("");
  114.         strValue.Format(TEXT("%d"), nValue);//returns the string format
  115.         return SetValueOfKey(strFieldName, strKeyName, strValue);
  116. }

  117. bool CIniFile::SetValueOfKey(const TCHAR* strFieldName, const TCHAR* strKeyName, byte byteValue)
  118. {
  119.         CString strValue = TEXT("");
  120.         strValue.Format(TEXT("%u"), byteValue);
  121.         return SetValueOfKey(strFieldName, strKeyName, strValue);
  122. }

  123. bool CIniFile::SetValueOfKey(const TCHAR* strFieldName, const TCHAR* strKeyName, bool bValue)
  124. {
  125.         CString strValue = TEXT("");
  126.         strValue.Format(TEXT("%d"), bValue);
  127.         return SetValueOfKey(strFieldName, strKeyName, strValue);
  128. }

  129. //decimalplaces小数点位数
  130. bool CIniFile::SetValueOfKey(const TCHAR* strFieldName, const TCHAR* strKeyName, double dValue, int decimalPlaces)
  131. {
  132.         assert(decimalPlaces >= 0);
  133.         CString strFormat = TEXT("");
  134.         strFormat.Format(TEXT("%%0.%df"), decimalPlaces);

  135.         CString strValue = TEXT("");
  136.         strValue.Format(strFormat, dValue);
  137.         return SetValueOfKey(strFieldName, strKeyName, strValue);
  138. }

(13)为CTextPage窗体中的文字高度的文本框映射double类型的成员变量m_textHeight

在ObjectARX中使用MFC-标签式对话框-35.jpg

同理,为文字样式组合框映射CComboBox成员变量m_cboTextStyle

在ObjectARX中使用MFC-标签式对话框-36.jpg

(14)创建CTextPage窗体的初始化事件

在ObjectARX中使用MFC-标签式对话框-37.jpg

填充文字样式组合框,从INI文件中加载默认的参数值:


  1. //填充文字样式组合框
  2.         std::vector<CString> textStyles;
  3.         CTextStyleUtil::GetAll(textStyles);
  4.         for (int i = 0; i < textStyles.size(); i++)
  5.         {
  6.                 m_cboTextStyle.AddString(textStyles);
  7.         }
  8.         if (m_cboTextStyle.GetCount() > 0)
  9.         {
  10.                 m_cboTextStyle.SetCurSel(0);
  11.         }

  12.         //从INI文件中加载参数值
  13.         CIniFile iniFile(CAppDirectoryUtil::GetCurrentDirectory() + TEXT("\\OptionSheet.ini"));
  14.         CString field = TEXT("OptionSheet");
  15.         iniFile.GetValueOfKey(field, TEXT("textHeight"), m_textHeight);
  16.         CString strTextStyle;
  17.         iniFile.GetValueOfKey(field, TEXT("textStyle"), strTextStyle);

  18.         //设置组合框的当前选择项
  19.         for (int i = 0; i < m_cboTextStyle.GetCount(); i++)
  20.         {
  21.                 CString strItem;
  22.                 m_cboTextStyle.GetLBText(i, strItem);//retrieves a string from the list box of a combo box
  23.                 if (strItem.CompareNoCase(strTextStyle) == 0)//Zero if the strings are identical (ignoring case),
  24.                 {
  25.                         m_cboTextStyle.SetCurSel(i);
  26.                         break;
  27.                 }
  28.         }
  29.         UpdateData(FALSE);



添加类AppDirectoryUtil

在ObjectARX中使用MFC-标签式对话框-38.jpg

类AppDirectoryUtil的实现

AppDirectoryUtil.h

  1. // AppDirectoryUtil.h: interface for the CAppDirectoryUtil class.
  2. ////////////////////////////////////////////////////////////////////////

  3. #if !defined(AFX_APPDIRECTORYUTIL_H__DD493023_982A_4370_8A6F_C271F5FD388F__INCLUDED_)
  4. #define AFX_APPDIRECTORYUTIL_H__DD493023_982A_4370_8A6F_C271F5FD388F__INCLUDED_
  5. #if _MSC_VER > 1000
  6. #pragma once
  7. #endif // _MSC_VER > 1000
  8. class CAppDirectoryUtil
  9. {
  10. public:
  11.         CAppDirectoryUtil();

  12.         // 功能: 获得当前的ARX文件所在的路径
  13.         static CString GetCurrentDirectory(HMODULE hInstance = _hdllInstance);

  14.         // 功能: 获得当前的ARX文件所在的文件夹的上级目录
  15.         static CString GetParentDirectory(HMODULE hInstance = _hdllInstance);

  16.         ~CAppDirectoryUtil();
  17. };


#endif // !defined(AFX_APPDIRECTORYUTIL_H__DD493023_982A_4370_8A6F_C271F5FD388F__INCLUDED_)
AppDirectoryUtil.cpp

#include "stdafx.h"
#include "AppDirectoryUtil.h"


#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#define new DEBUG_NEW
#endif

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////


CAppDirectoryUtil::CAppDirectoryUtil()
{
}


CAppDirectoryUtil::~CAppDirectoryUtil()
{
}

CString CAppDirectoryUtil::GetCurrentDirectory(HMODULE hInstance)
{
        TCHAR szPath[256];
        GetModuleFileName(hInstance, szPath, sizeof(szPath));
        *(_tcsrchr(szPath, '\\')) = 0;                // 将最后一个\所在的位置修改为\0

        CString strResult = szPath;
        return strResult;
}

CString CAppDirectoryUtil::GetParentDirectory(HMODULE hInstance)
{
        TCHAR szPath[256];
        GetModuleFileName(hInstance, szPath, sizeof(szPath));
        *(_tcsrchr(szPath, '\\')) = 0;                // 将最后一个\所在的位置设置为\0
        *(_tcsrchr(szPath, '\\')) = 0;                // 继续将最后一个\所在的位置设计为\0

        CString strResult = szPath;
        return strResult;
}

添加C++常规类:CTextStyleUtil

CTextStyleUtil.h:

#if !defined(AFX_TEXTSTYLEUTIL_H__F392A987_01EA_4AD0_BCE3_C39921CAC013__INCLUDED_)
#define AFX_TEXTSTYLEUTIL_H__F392A987_01EA_4AD0_BCE3_C39921CAC013__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#include <vector>
class CTextStyleUtil
{
public:
        CTextStyleUtil();
        virtual ~CTextStyleUtil();

        // 获得某个文字样式的ID
        static AcDbObjectId GetAt(const TCHAR* name);

        // 获得文字样式名称列表
        static void GetAll(std::vector<CString> &textStyles);

        // 创建一种文字样式
        static AcDbObjectId Add(const TCHAR* name, const TCHAR* fontFileName = TEXT("txt.shx"),
                const TCHAR* bigFontFileName = TEXT("gbcbig.shx"));
        //~CTextStyleUtil();
};

#endif // !defined(AFX_TEXTSTYLEUTIL_H__F392A987_01EA_4AD0_BCE3_C39921CAC013__INCLUDED_)

CTextStyleUtil.cpp:

  1. #include "stdafx.h"
  2. #include "TextStyleUtil.h"
  3. #include <dbsymtb.h>
  4. #include <acutmem.h>

  5. #ifdef _DEBUG
  6. #undef THIS_FILE
  7. static char THIS_FILE[] = __FILE__;
  8. #define new DEBUG_NEW
  9. #endif

  10. //////////////////////////////////////////////////////////////////////
  11. // Construction/Destruction
  12. //////////////////////////////////////////////////////////////////////


  13. CTextStyleUtil::CTextStyleUtil()
  14. {
  15. }


  16. CTextStyleUtil::~CTextStyleUtil()
  17. {
  18. }

  19. AcDbObjectId CTextStyleUtil::GetAt(const TCHAR* name)
  20. {
  21.         AcDbObjectId textStyleId;

  22.         if (_tcslen(name) > 0)//Unicode字符串的长度
  23.         {
  24.                 AcDbTextStyleTable* pTextStyleTable = NULL;
  25.                 acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pTextStyleTable, AcDb::kForRead);
  26.                 pTextStyleTable->getAt(name, textStyleId);        // 如果不存在,textStyleId不会被赋值
  27.                 pTextStyleTable->close();
  28.         }

  29.         return textStyleId;
  30. }

  31. void CTextStyleUtil::GetAll(std::vector<CString> &textStyles)
  32. {
  33.         textStyles.clear();

  34.         AcDbTextStyleTable *pTextStyleTbl = NULL;
  35.         acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pTextStyleTbl, AcDb::kForRead);
  36.         AcDbTextStyleTableIterator *pIt = NULL;
  37.         pTextStyleTbl->newIterator(pIt);

  38.         for (; !pIt->done(); pIt->step())
  39.         {
  40.                 AcDbTextStyleTableRecord *pRcd = NULL;
  41.                 if (pIt->getRecord(pRcd, AcDb::kForRead) == Acad::eOk)
  42.                 {
  43.                         TCHAR *szName = NULL;
  44.                         pRcd->getName(szName);
  45.                         if (_tcslen(szName) > 0)                // 过滤掉名称为空的文字样式
  46.                         {
  47.                                 textStyles.push_back(szName);
  48.                         }
  49.                         acutDelString(szName);

  50.                         pRcd->close();
  51.                 }
  52.         }
  53.         delete pIt;
  54.         pTextStyleTbl->close();
  55. }

  56. AcDbObjectId CTextStyleUtil::Add(const TCHAR* name, const TCHAR* fontFileName, const TCHAR* bigFontFileName)
  57. {
  58.         Acad::ErrorStatus es;
  59.         AcDbTextStyleTable* pTextStyleTable = NULL;
  60.         es = acdbHostApplicationServices()->workingDatabase()->getSymbolTable(pTextStyleTable, AcDb::kForWrite);

  61.         AcDbTextStyleTableRecord* pTextStyleRecord = new AcDbTextStyleTableRecord();
  62.         es = pTextStyleRecord->setName(name);
  63.         es = pTextStyleRecord->setBigFontFileName(bigFontFileName);                // 大字体文件
  64.         es = pTextStyleRecord->setFileName(fontFileName);        // 字体文件
  65.         es = pTextStyleRecord->setXScale(1.0);                // 文字高宽比(一般这里都设置为1,在文字属性中决定高宽比)
  66.         es = pTextStyleTable->add(pTextStyleRecord);
  67.         AcDbObjectId styleId = pTextStyleRecord->objectId();
  68.         pTextStyleTable->close();
  69.         pTextStyleRecord->close();

  70.         return styleId;
  71. }


在TextPage.cpp文件中添加以下头文件:

  1. #include "AppDirectoryUtil.h"
  2. #include "IniFile.h"
  3. #include <vector>
  4. #include <string.h>
  5. #include "TextStyleUtil.h"

这时候编译会出错:

在ObjectARX中使用MFC-标签式对话框-39.jpg

需要强制类型转换:

在ObjectARX中使用MFC-标签式对话框-40.jpg

(15)在CTextPage类中添加公有成员函数SaveProfiles,用于将用户在控件中输入的参数值保存到INI中

在ObjectARX中使用MFC-标签式对话框-41.jpg

函数的代码:

  1. bool CTextPage::SaveProfile()
  2. {
  3.         if (!UpdateData())
  4.         {
  5.                 return false;
  6.         }

  7.         //保存参数值
  8.         CIniFile iniFile(CAppDirectoryUtil::GetCurrentDirectory() +
  9.                 TEXT("\\OptionSheet.ini"));
  10.         CString field = TEXT("OptionSheet");
  11.         iniFile.SetValueOfKey(field, TEXT("textHeight"), m_textHeight);
  12.         CString strTextStyle;
  13.         m_cboTextStyle.GetLBText(m_cboTextStyle.GetCurSel(), strTextStyle);
  14.         iniFile.SetValueOfKey(field, TEXT("textStyle"), strTextStyle);
  15.         return false;
  16. }

(16)对CControlPage窗体中的单选按钮映射int类型的成员变量m_nRadio1

在ObjectARX中使用MFC-标签式对话框-42.jpg

对CControlPage窗体中的复选框按钮映射BOOL类型的成员变量m_bCheck1


在ObjectARX中使用MFC-标签式对话框-43.jpg


这是编译发现出错:
在ObjectARX中使用MFC-标签式对话框-44.jpg
强制类型转换:

在ObjectARX中使用MFC-标签式对话框-45.jpg

(17)创建CControlPage窗体的初始化事件


  1. BOOL CControlPage::OnInitDialog()
  2. {
  3.         CAcUiTabChildDialog::OnInitDialog();

  4.         // TODO:  在此添加额外的初始化

  5.         //从INI文件中加载参数值
  6.         CIniFile iniFile(CAppDirectoryUtil::GetCurrentDirectory() +
  7.                 TEXT("\\OptionSheet.ini"));
  8.         CString field = TEXT("OptionSheet");
  9.         iniFile.GetValueOfKey(field, TEXT("nRadio1"), m_nRadio1);
  10.         iniFile.GetValueOfKey(field, TEXT("bCheck1"), m_bCheck1);

  11.         UpdateData(FALSE);

  12.         return TRUE;  // return TRUE unless you set the focus to a control
  13.                                   // 异常: OCX 属性页应返回 FALSE
  14. }

添加头文件

  1. #include "AppDirectoryUtil.h"
  2. #include "IniFile.h"
  3. (18)在CControlPage 类中添加函数SaveProfiles

  4. bool CControlPage::SaveProfiles()
  5. {
  6.         CIniFile iniFile(CAppDirectoryUtil::GetCurrentDirectory() +
  7.                 TEXT("\\OptionSheet.ini"));
  8.         CString field = TEXT("OptionSheet");
  9.         iniFile.SetValueOfKey(field, TEXT("nRadio1"), m_nRadio1);
  10.         iniFile.SetValueOfKey(field, TEXT("bCheck1"), m_bCheck1);

  11.         return false;
  12. }

(19)为COptionSheet窗体添加OnOK消息处理函数

在ObjectARX中使用MFC-标签式对话框-46.jpg

  1. void COptionSheet::OnOK()
  2. {
  3.         // TODO: 在此添加专用代码和/或调用基类
  4.         if (!m_textPage.SaveProfile() || !m_controlPage.SaveProfiles())
  5.         {
  6.                 return;
  7.         }

  8.         CAcUiTabMainDialog::OnOK();
  9. }





效果:

在ObjectARX中使用MFC-标签式对话框-47.jpg

项目源代码:在ObjectARX中使用MFC-标签式对话框 项目源代码

参考资料:

《AutoCAD ObjectARX(VC)开发基础与实例教程》
---------------------
作者:李燕良
来源:CSDN
原文:https://blog.csdn.net/qq_40416052/article/details/81666093
版权声明:本文为博主原创文章,转载请附上博文链接!

论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!

已领礼包: 3256个

财富等级: 富可敌国

发表于 2019-1-15 08:39:49 | 显示全部楼层
真是不一般的 复杂啊
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2025-9-8 02:04 , Processed in 0.307508 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表