一、wxwidgets 库文件下载与配置
- 可自行下载源码编译,或直接下载库文件,下载链接:Downloads - wxWidgets

- 官方使用配置说明:How to use wxMSW binaries | wxWidgets
- 下载后解压,将文件夹下内容直接拷贝到指定位置。

二、创建 ARX 项目及配置 wxwidgets 环境
- 推荐使用ARX项目模版一键创建项目直接创建项目。
- 若有需要,可后续将 wxwidgets 配置写入该模板(本文不演示创建过程)。
- 创建项目后,添加上一步 wxwidgets 库文件夹中的属性文件
wxwidgets.props。


三、添加 wxwidgets 主窗口及重写初始化函数
在 arxEntryPoint.cpp 文件中添加如下函数:
class TRApp : public wxApp {
public:
virtual bool OnInit() override {
return true;
}
};
IMPLEMENT_APP_NO_MAIN(TRApp); // 关键点
void EnsureWxWidgetsInitialized() {
static bool wxStarted = false;
if (!wxStarted) {
int argc = 0;
char** argv = nullptr;
wxStarted = true;
wxEntryStart(argc, argv);
wxTheApp->CallOnInit();
}
}
并在 ARX 初始化函数中调用(同步初始化创建 wxwidgets 主窗口):
virtual AcRx::AppRetCode On_kInitAppMsg(void* pkt) {
AcRx::AppRetCode retCode = AcRxArxApp::On_kInitAppMsg(pkt);
EnsureWxWidgetsInitialized();
return (retCode);
}
四、wxwidgets 实例
经过前三步,可直接使用 wxwidgets 创建 UI 界面(支持代码创建或 XRC 资源文件,本文展示代码创建)。
4.1 AI 生成的简单实例
#include <wx/wx.h>
// 自定义对话框类
class MyDialog : public wxDialog {
public:
// 构造函数
MyDialog(wxWindow* parent, const wxString& title)
: wxDialog(parent, wxID_ANY, title, wxDefaultPosition, wxSize(300, 200)) {
// 创建垂直布局管理器
wxBoxSizer* vbox = new wxBoxSizer(wxVERTICAL);
// 添加静态文本
wxStaticText* text = new wxStaticText(this, wxID_ANY,
"这是一个简单的 wxWidgets 对话框!\n\n欢迎使用 wxWidgets 库。",
wxDefaultPosition, wxDefaultSize, wxALIGN_CENTRE);
// 设置文本字体
wxFont font(12, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_BOLD);
text->SetFont(font);
// 添加文本到布局,设置边距
vbox->Add(text, 1, wxALL | wxEXPAND, 20);
// 创建水平布局放置按钮
wxBoxSizer* hbox = new wxBoxSizer(wxHORIZONTAL);
// 添加确定按钮
wxButton* okBtn = new wxButton(this, wxID_OK, "确定", wxDefaultPosition, wxSize(70, 30));
hbox->Add(okBtn, 0, wxRIGHT, 10);
// 添加取消按钮
wxButton* cancelBtn = new wxButton(this, wxID_CANCEL, "取消", wxDefaultPosition, wxSize(70, 30));
hbox->Add(cancelBtn);
// 将水平布局添加到垂直布局
vbox->Add(hbox, 0, wxALIGN_CENTER | wxTOP | wxBOTTOM, 10);
// 设置对话框的布局
SetSizer(vbox);
// 居中显示对话框
Centre();
}
};
4.2 作者自定义实例
头文件(.h)
#pragma once
#include <wx/wx.h>
class MyDialog : public wxDialog {
public:
MyDialog(wxWindow* parent);
private:
void OnClose(wxCloseEvent& event);
void OnOK(wxCommandEvent& event);
void OnCancel(wxCommandEvent& event);
void OnCharHook(wxKeyEvent& event);
};
实现文件(.cpp)
#include "StdAfx.h"
#include "MyDialog.h"
class CDocLocker {
public:
CDocLocker() { acDocManager->lockDocument(acDocManager->curDocument()); }
~CDocLocker() { acDocManager->unlockDocument(acDocManager->curDocument()); }
};
MyDialog::MyDialog(wxWindow* parent)
: wxDialog(parent, wxID_ANY, "My Custom Dialog", wxDefaultPosition, wxSize(400, 200),
wxDEFAULT_DIALOG_STYLE | wxCLOSE_BOX | wxSTAY_ON_TOP) {
// 控件布局
auto* mainSizer = new wxBoxSizer(wxVERTICAL);
mainSizer->Add(new wxStaticText(this, wxID_ANY, "Welcome to use custom dialog"), 0, wxALL | wxALIGN_CENTER, 15);
auto* bSizer1 = new wxBoxSizer(wxHORIZONTAL);
auto* m_Cancel = new wxButton(this, wxID_CANCEL, wxT("取消"), wxDefaultPosition, wxDefaultSize, 0);
bSizer1->Add(m_Cancel, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5);
auto* m_Ok = new wxButton(this, wxID_OK, wxT("确定"), wxDefaultPosition, wxDefaultSize, 0);
bSizer1->Add(m_Ok, 1, wxALIGN_CENTER_VERTICAL | wxALL, 5);
mainSizer->Add(bSizer1, 0, wxEXPAND | wxALL, 5);
SetSizerAndFit(mainSizer);
// 事件绑定
m_Ok->Bind(wxEVT_BUTTON, &MyDialog::OnOK, this);
m_Cancel->Bind(wxEVT_BUTTON, &MyDialog::OnCancel, this);
Bind(wxEVT_CHAR_HOOK, &MyDialog::OnCharHook, this);
Bind(wxEVT_CLOSE_WINDOW, &MyDialog::OnClose, this);
}
void MyDialog::OnCancel(wxCommandEvent& WXUNUSED(event)) {
Show(false); // 或 EndModal(wxID_CANCEL); // 模态对话框
}
void MyDialog::OnOK(wxCommandEvent& WXUNUSED(event)) {
Show(false);
acedGetAcadDwgView()->SetFocus();
CDocLocker docLocker;
ads_name ent;
ads_point pt;
if (acedEntSel(L"\nPick Curve: ", ent, pt) == RTNORM) {
AcDbObjectId objId;
AcDbEntity* pEnt = nullptr;
if (Acad::eOk == acdbGetObjectId(objId, ent)
&& Acad::eOk == acdbOpenObject(pEnt, objId, AcDb::kForWrite)) {
pEnt->setColorIndex(pEnt->colorIndex() > 254 ? 1 : pEnt->colorIndex() + 1);
pEnt->close();
}
} else {
acutPrintf(L"\nselect no curve.");
}
}
void MyDialog::OnClose(wxCloseEvent& WXUNUSED(event)) {
Show(false); // 或 EndModal(wxID_CANCEL); // 模态对话框
}
void MyDialog::OnCharHook(wxKeyEvent& event) {
if (event.GetKeyCode() == WXK_ESCAPE) {
Show(false); // 或 EndModal(wxID_CANCEL); // 模态对话框
return;
}
event.Skip();
}
五、使用方式
与 ARX 中 MFC 使用方式一致:
MyDialog* dlg = nullptr;
static void MyGroupTT1() {
if (!dlg) {
dlg = new MyDialog(nullptr);
}
dlg->Show();
}
static void MyGroupTT2() {
MyDialog2 dlg(nullptr, L"second dialog");
dlg.ShowModal();
}
ACED_ARXCOMMAND_ENTRY_AUTO(CwxWidgetsDemoApp, MyGroup, TT1, TT1, ACRX_CMD_MODAL, NULL)
ACED_ARXCOMMAND_ENTRY_AUTO(CwxWidgetsDemoApp, MyGroup, TT2, TT2, ACRX_CMD_MODAL, NULL)
六、演示相关
- 因使用动态链接库,加载插件前需将库所在文件夹添加到 CAD 的搜索路径。

- 之前的帖子一维下料使用 wxwidgets 实现(采用 XRC 资源文件,模块化可重复组合使用)。

- 上述代码添加到 ARX 项目并添加绘制图形函数后,可形成插件。
- 资源推荐:wxwidgets 创建 UI 界面的软件可采用 wxFormBuilder 或 DialogBlocks(推荐)。
六、资源下载
可公众号 【橡皮的CAD开发】 回复 【wxWidgets 界面开发】
2102

被折叠的 条评论
为什么被折叠?



