ARX wxwidgets 界面开发

一、wxwidgets 库文件下载与配置

  1. 可自行下载源码编译,或直接下载库文件,下载链接:Downloads - wxWidgets
    在这里插入图片描述
  2. 官方使用配置说明:How to use wxMSW binaries | wxWidgets
  3. 下载后解压,将文件夹下内容直接拷贝到指定位置。
    在这里插入图片描述

二、创建 ARX 项目及配置 wxwidgets 环境

  1. 推荐使用ARX项目模版一键创建项目直接创建项目。
  2. 若有需要,可后续将 wxwidgets 配置写入该模板(本文不演示创建过程)。
  3. 创建项目后,添加上一步 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)

六、演示相关

  1. 因使用动态链接库,加载插件前需将库所在文件夹添加到 CAD 的搜索路径。
    在这里插入图片描述
  2. 之前的帖子一维下料使用 wxwidgets 实现(采用 XRC 资源文件,模块化可重复组合使用)。
    在这里插入图片描述
  3. 上述代码添加到 ARX 项目并添加绘制图形函数后,可形成插件。
  4. 资源推荐:wxwidgets 创建 UI 界面的软件可采用 wxFormBuilder 或 DialogBlocks(推荐)。

六、资源下载

可公众号 【橡皮的CAD开发】 回复 【wxWidgets 界面开发】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值