Skip to content

C++ 环境搭建 - MFC

1 准备工作

1.1 Vistual Studo 2022

VC++版本的lib不兼容,建议使用VS2022

1.2 SDK下载

请联系客户顾问获取。

1.3 示例代码下载

请联系客户顾问获取。

2 项目配置

若是新项目,则直接创建一个MFC的可执行程序sampleMFC。已有项目直接进行项目配置。

把SDK的bin目录下的DLL复制到项目的bin目录下,目录结构如下:

  • bin
    • Windows
  • build
  • include
    • Core
    • MFC
  • lib
    • Windows
  • sampleMFC
    • sampleMFC.vcxproj

注意:

  • 配置:所有配置
  • 平台:所有平台

2.1 配置属性/常规

  • 输出目录
    ..\bin\Windows\$(PlatformTarget)\$(Configuration)\
  • 中间目录 - (可选)
    ..\build\SampleMFC\Windows\$(PlatformTarget)\$(Configuration)\
  • C++语言标准
    ISO C++17 标准 (/std:c++17)

配置属性

2.2 C/C++ /附加包含目录

增加

..\include\Core
..\include\MFC

2.3 链接器/常规/附加库目录

增加:

..\lib\Windows\$(PlatformTarget)\$(Configuration);

2.3 链接器/输入/附加依赖项

AnyCAD.Common.Core.lib;AnyCAD.Geometry.Builder.lib;AnyCAD.Geometry.Interop.lib;AnyCAD.Geometry.Kernel.lib;AnyCAD.Graphics.Interop.lib;AnyCAD.Graphics.Kernel.lib;AnyCAD.Graphics.Renderer.lib;AnyCAD.Graphics.View.lib;AnyCAD.Graphics.Window.lib;SamCoreKernel.lib;SamCoreInterop.lib;SamCoreModeling.lib;AnyCAD.Widget.MFC.lib;%(AdditionalDependencies)

3 代码修改

3.1 预编译头文件

pch.h或者stdafx.h中增加:

cpp
#include "AnyUIMFC.h"

// 名字空间简写
namespace Ad = anycore;

3.2 SDK初始化和释放

修改在从CWinApp(Ex)继承的子类,如CsampleMFCApp。

  • 初始化SDK
cpp
BOOL CsampleMFCApp::InitInstance()
{
    ...
    CWinAppEx::InitInstance();


	TCHAR path[MAX_PATH];
	ZeroMemory(path, MAX_PATH);
	GetModuleFileName(NULL, path, MAX_PATH);
	CString strPath = path;
	int pos = strPath.ReverseFind('\\');
	strPath = strPath.Left(pos);

	if (!Ad::GlobalInstance::Initialize((LPCWSTR)strPath))
	{
		return FALSE;
	}

	// 初始化 OLE 库
	if (!AfxOleInit())
	{
		AfxMessageBox(IDP_OLE_INIT_FAILED);
		return FALSE;
	}
    ...
}
  • 析构资源
cpp
int CsampleMFCApp::ExitInstance()
{
	//TODO: 处理可能已添加的附加资源
	AfxOleTerm(FALSE);

	Ad::GlobalInstance::Destroy();

	return CWinAppEx::ExitInstance();
}

3.2 View初始化

把CView改成AuView3d

.h文件

cpp
#include "Widget/AuView3d.h"

class CsampleMFCView : public AuView3d
{
    ...
};

.cpp文件。(可以直接全部替换CView--> AuView3d)

cpp
IMPLEMENT_DYNCREATE(CsampleMFCView, AuView3d)

BEGIN_MESSAGE_MAP(CsampleMFCView, AuView3d)
...

BOOL CsampleMFCView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: 在此处通过修改
	//  CREATESTRUCT cs 来修改窗口类或样式

	return AuView3d::PreCreateWindow(cs);
}

3.3 添加并显示一个球

cpp
void CsampleMFCView::OnAddSphere()
{
	// TODO: 在此添加命令处理程序代码
	auto sphere = Ad::ShapeBuilder::MakeSphere(gp_Pnt(), 100);
	auto node = Ad::BrepSceneNode::Create(sphere, nullptr, nullptr);
	GetScene()->AddNode(node);
	RequestUpdate(Ad::EnumUpdateFlags::Model);
}

4 编译&运行

编译通过后,可以得到如下的界面:

MFC App

通过AuView3d的GetViewer()方法可以得到显示控件,即可跟.NET一样操作三维窗口。

5 小结

通过项目配置引入SDK的头文件、lib文件,简单修改CWinApp子类来初始化SDK,通过修改CView可以实现一个经典的Document-View项目。

如果需要在对话框中引入三维控件,也很简单只需要在对话中加入一个CStaic控件,然后改成AuWindow3d即可。

#include "Widget/AuWindow3d.h"

不要忘记引入上面的头文件哟~


上海图无形科技有限公司旗下产品
Copyright © 2013-2024 AnyCAD