- 积分
- 17654
- 明经币
- 个
- 注册时间
- 2022-2-7
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
本帖最后由 橡皮 于 2025-8-22 16:00 编辑
1. wxwidgets 库文件下载(当然可以自己下载源码编译)
下载链接:Downloads - wxWidgets
oneDrive:wxWidgets
官方使用配置说明:How to use wxMSW binaries | wxWidgets
下载后解压并将文件夹下内容直接拷贝到一块
2. 创建 ARX 项目,配置 wxwidgets 环境
推荐ARX项目模版一键创建项目直接创建,当然如果愿意可后边将 wxwidgets 配置写到这个模板里边 ,
这里不再演示创建过程,创建之后,添加上一步 wxwidgets 库文件夹中的属性文件 wxwidgets.props
3. 添加 wxwidgets 主窗口,重写初始化函数
在 arxEntryPoint.cpp 文件中添加如下函数
- class TRApp : public wxApp {
- public:
- virtual bool OnInit() override
- {
- return true;
- }
- };
- IMPLEMENT_APP_NO_MAIN(TRApp);
- static bool wxStarted = false;
- void EnsureWxWidgetsInitialized() {
- if (!wxStarted) {
- int argc = 0;
- char** argv = nullptr;
- wxStarted = true;
- wxEntryStart(argc, argv);
- wxTheApp->CallOnInit();
- }
- }
- void CleanupWxWidgets() {
- if (wxStarted) {
- wxTheApp->OnExit();
- wxEntryCleanup();
- wxStarted = false;
- }
- }
复制代码 并在 ARX 初始化函数中调用(也就是同步初始化创建 wxwidgets 主窗口)
- virtual AcRx::AppRetCode On_kInitAppMsg (void *pkt) {
- AcRx::AppRetCode retCode =AcRxArxApp::On_kInitAppMsg (pkt) ;
-
- EnsureWxWidgetsInitialized();
- return (retCode) ;
- }
复制代码 卸载时同步释放资源
- virtual AcRx::AppRetCode On_kUnloadAppMsg (void *pkt) {
- CleanupWxWidgets();
- AcRx::AppRetCode retCode =AcRxArxApp::On_kUnloadAppMsg (pkt) ;
- return (retCode) ;
- }
复制代码
4. wxwidgets 实例
经过前三步就可以直接使用 wxwidgets 创建 UI 界面了(可以代码创建也可以使用xrc资源文件,这里只展示代码创建的)
a. 直接用 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();
- }
- };
复制代码
b. 自己也简单做了一个
 - #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
复制代码
5. 演示
因为使用的是动态链接库所以加载插件前一定要将库所在文件夹添加到 CAD 的搜索路径里
演示如下:
下边是之前的帖子一维下料使用wxwidgets实现(采用的 XRC 资源文件,他是模块化的可以重复组合使用)
这个是直接将上边的代码添加到 ARX 项目中,并添加了绘制图形函数之后的插件演示
资源推荐:
wxwidgets 创建 UI 界面软件可以采用 wxFormBuilder 或者 DialogBlocks(推荐)
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?注册
x
评分
-
查看全部评分
|