gskelly 发表于 2010-1-8 23:09:02

Bricscad 和 wxWidgets

现在Bricscad到Linux的端口已经开始了...还不要太兴奋,它仍然是prealpha。我一直在考虑如何制作可能与这个新的杀手级应用程序一起工作的插件。我知道官方发展援助库应该是独立于平台的(尽管Linux还没有DRX SDK!),所以我假设在某个时候BricscadLinux会加载DRX模块。我也知道BRX应用程序可能无法工作,因为它们已经链接到MFC。因此,我们需要使用像wxWidgets这样的跨平台GUI,与Bricscad使用的GUI相同。
为自己获取wxWidgets的副本,使用VC8/Unicode编译它,
使用必要的路径设置VC8 i. e
$(DRX206)\include
$(BRICSDS)
$(WxW)\include
$(WxW)\msvc\include
and
$(DRX206)\lib\VC8md
$(BRICSDS)
$(WxW)lib\vc_lib
添加这些预处理器定义
DRXWX_EXPORTS
wxUSE_GUI=1
__WXMSW__
为您的DLLMain使用这样的
// __WXMSW__ needs to be defined
#ifdef __WXMSW__
static HANDLE ThreadId;
class WXEXPORT wxDLLApp : public wxApp
{
public:
bool OnInit()
{
    //Set the Bricscad main frame as the top level wxWindow
    wxWindow * win = new wxWindow();
    win->SetHWND((WXHWND)sds_getmainhwnd());
    win->AdoptAttributesFromHWND();
    SetTopWindow(win);
    return true;
}
};
IMPLEMENT_APP_NO_MAIN(wxDLLApp)
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
wxApp::SetInstance(new wxDLLApp());
wxEntry(GetModuleHandle(NULL),NULL,NULL,SW_SHOW);
return true;
}
BOOL APIENTRY DllMain(HANDLE hModule,
                      DWORDul_reason_for_call,
                      LPVOID lpReserved
                      )
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
    ThreadId = CreateThread(NULL,0,ThreadProc,NULL,0,NULL);
    break;
case DLL_THREAD_ATTACH: break;
case DLL_THREAD_DETACH: break;
case DLL_PROCESS_DETACH:
    wxEntryCleanup();
    break;
}
return TRUE;
}
#endif

**** Hidden Message *****

gskelly 发表于 2010-1-8 23:12:44

接下来,设置一个对话框,我只使用了一个快速示例
class CustomDialog : public wxDialog
{
public:
   CustomDialog(const wxString& title , wxWindow* parent = NULL);
};

CustomDialog::CustomDialog(const wxString & title , wxWindow* parent/* = NULL*/)
: wxDialog(parent, -1, title, wxDefaultPosition, wxSize(250, 230))
{
wxPanel *panel = new wxPanel(this, -1);
wxBoxSizer *vbox = new wxBoxSizer(wxVERTICAL);
wxBoxSizer *hbox = new wxBoxSizer(wxHORIZONTAL);
wxStaticBox *st = new wxStaticBox(panel, -1, wxT("Colors"),
    wxPoint(5, 5), wxSize(240, 150));
wxRadioButton *rb = new wxRadioButton(panel, -1,
    wxT("256 Colors"), wxPoint(15, 30), wxDefaultSize, wxRB_GROUP);
wxRadioButton *rb1 = new wxRadioButton(panel, -1,
    wxT("16 Colors"), wxPoint(15, 55));
wxRadioButton *rb2 = new wxRadioButton(panel, -1,
    wxT("2 Colors"), wxPoint(15, 80));
wxRadioButton *rb3 = new wxRadioButton(panel, -1,
    wxT("Custom"), wxPoint(15, 105));
wxTextCtrl *tc = new wxTextCtrl(panel, -1, wxT(""),
    wxPoint(95, 105));
wxButton *okButton = new wxButton(this, -1, wxT("Ok"),
    wxDefaultPosition, wxSize(70, 30));
wxButton *closeButton = new wxButton(this, -1, wxT("Close"),
    wxDefaultPosition, wxSize(70, 30));
hbox->Add(okButton, 1);
hbox->Add(closeButton, 1, wxLEFT, 5);
vbox->Add(panel, 1);
vbox->Add(hbox, 0, wxALIGN_CENTER | wxTOP | wxBOTTOM, 10);
SetSizer(vbox);
}

,现在调用新的对话框
class CommandDRXTest : public OdStaticRxObject
{
public:
const OdString localName() const { return globalName(); }
const OdString groupName() const { return DD_T("DRXGLOBAL"); }
const OdString globalName() const { return DD_T("DRXTest"); }
//++--
void execute(OdEdCommandContext* pCmdCtx)
{
    OdDbCommandContextPtr pDbCmdCtx(pCmdCtx); //++-- downcast for database access
    OdDbUserIO* pDbIO = pDbCmdCtx->dbUserIO(); //++-- User IO
    OdDbDatabasePtr pDb = pDbCmdCtx->database(); //++-- Current database
   
    CustomDialog custom(wxT("CustomDialog"));
    custom.ShowModal();
}
};

Kerry 发表于 2010-1-8 23:15:35


gskelly 发表于 2010-1-9 09:16:59

酷!!!我想知道如何做到这一点……我知道有人要求提供一个包含基于wx的界面的示例应用程序,但我没有找到。我想知道他们是在考虑包装所需的MFC依赖项还是什么Connect(wxEVT_MOVE, wxMoveEventHandler(CustomDialog::OnMove));
this->Centre();
}
void CustomDialog::OnMove( wxMoveEvent & event )
{
wxPoint size = event.GetPosition();
st1->SetLabel(wxString::Format(wxT("x: %d"), size.x ));
st2->SetLabel(wxString::Format(wxT("y: %d"), size.y ));
}

gskelly 发表于 2010-1-9 09:26:32

模态和非模态Dan?

gskelly 发表于 2010-1-9 10:33:11

是的,先生

gskelly 发表于 2010-1-9 20:36:22

嘿,这个wxWidgets的东西就像完全整洁,它应该与ARX / BRX / SDS等一
起工作,我只需要弄清楚如何在getXXX函数
期间让位于编辑器窗口

gskelly 发表于 2010-1-9 21:35:14

是的,正确传递信息似乎是个问题。我能够获得键盘和鼠标事件,由于一些奇怪的原因,点击按钮事件失败。当将按钮事件映射到mouse_ left_。哦,好吧

gskelly 发表于 2010-1-9 21:44:49

我想我之前读到的关于将wx插件加载到wxApp中的内容表明我会使用wx RTTI宏:
DECLARE_ABSTRACT_CLASS and IMPLEMENT_ABSTRACT_CLASS
DECLARE_DYNAMIC_CLASS and IMPLEMENT_DYNAMIC_CLASS

然后在wxApp中使用wxPluginManager::LoadLibrary()完成加载,然后由主wxApp注册。我不确定这一点如何适用于金砖四国。我已经问过了,所以希望会有结果。
我没有特别指出,但我似乎记得其他人说过在DLL中创建wxApp并将其加载到基于wx的应用程序中是不安全的,但我可能是错的,或者它可能与某些特定的用法有关。
伙计,你似乎学东西学得太快了...

Kerry 发表于 2010-1-9 21:51:04


很高兴从马的嘴里听到Linux /MacAPI/SDK的计划,这样我们就可以计划
页: [1] 2
查看完整版本: Bricscad 和 wxWidgets