C++ 如何一次创建一个框架实例

C++ 如何一次创建一个框架实例,c++,wxwidgets,C++,Wxwidgets,我使用WxWIDGET和我的C++应用程序。 我有一个wxGrid设置,用户可以双击一个单元格,然后用另一个网格创建一个新窗口 我在用网格关闭和重新打开新窗口时遇到问题 void FeatureList::mouseDClick(wxGridEvent& event) { int n_row, n_col; n_row = event.GetRow(); n_col = 0; m_sCellValue = grid->GetCellValue(n_row, n_col); i

我使用WxWIDGET和我的C++应用程序。 我有一个wxGrid设置,用户可以双击一个单元格,然后用另一个网格创建一个新窗口

我在用网格关闭和重新打开新窗口时遇到问题

void FeatureList::mouseDClick(wxGridEvent& event)
{
int n_row, n_col;
n_row = event.GetRow();
n_col = 0;

m_sCellValue = grid->GetCellValue(n_row, n_col); 

if ( frame == NULL ) // If frame is closed
{
    CreateCrackBoxFrame(m_sCellValue);
}
else{
    frame->Raise();  // otherwise bring it to the front.
}
}

void FeatureList::CreateCrackBoxFrame(wxString m_sCellValue)
{
frame = new CrackBoxFrame(m_pvFeatures, m_sCellValue, m_bDisplayInMetric);
frame->Show(true);
}

CrackBoxFrame::CrackBoxFrame(vector<Feature> *pvFeatures, wxString CellValue, 
bool bDisplayInMetric)
: wxFrame(NULL, wxID_ANY, wxT("CrackBoxes"),wxDefaultPosition, wxSize(725, 
400))
{
 }
void FeatureList::mouseDClick(wxGridEvent&event)
{
国际北卡罗,北卡罗;
n_row=event.GetRow();
n_col=0;
m_sCellValue=grid->GetCellValue(n_行,n_列);
if(frame==NULL)//如果frame已关闭
{
CreateCrackBoxFrame(m_sCellValue);
}
否则{
frame->Raise();//否则将其置于前面。
}
}
无效特性列表::CreateCrackBoxFrame(wxString m_sCellValue)
{
帧=新CrackBoxFrame(m_pvFeatures、m_sCellValue、m_bDisplayInMetric);
帧->显示(真);
}
CrackBoxFrame::CrackBoxFrame(向量*pvFeatures,WX字符串单元格值,
布尔B显示(公制)
:wxFrame(NULL,wxID_ANY,wxT(“裂纹盒”),wxDefaultPosition,wxSize(725,
400))
{
}

如果我关闭新窗口,然后单击另一个单元格,我的程序将崩溃,因为您有两个选项:

  • 保留线的矢量,当单击网格中的线时,检查是否从矢量中单击了相应的线,并且仅当未单击时才允许事件继续

  • 在点击完成后禁用该行,不要让第二行通过

  • 在网格中的每一行上添加复选框,并在第一次单击时选中它。在后续操作中-检查是否未检查该值

  • 你选择

    多谢各位


    编辑:


    您正在尝试从wxGrid双击事件运行外部应用程序吗?它不是外部应用程序。功能列表是我的应用程序中具有网格设置的窗口。如果在网格上双击,它会创建一个新窗口。我只能创建一个实例,但我遇到了一个问题。一旦新窗口创建并打开,一切都会像它想象的那样工作。但一旦我关闭窗口并试图双击重新打开窗口,我的程序就会崩溃。@MaazAzeem,你使用了哪种算法?您需要在关闭事件中解锁该vframe的行。。。最好的方法可能是将自定义事件发送回带有网格和一些id的框架。我没有禁用单个网格线,而是禁用创建新框架的选项,而是更新了代码以供参考。谢谢你的帮助和帮助patience@MaazAzeem,我更新了我的答案,但这只是RTFM。您还可以检查
    事件
    示例。
    void FeatureList::CreateCrackBoxFrame(wxString m_sCellValue)
    {
        frame = new CrackBoxFrame(m_pvFeatures, m_sCellValue, m_bDisplayInMetric);
        frame->Show(true);
        frame->Bind( wxEVT_CLOSE, &FeatureList::OnCrackBoxClose, this );
    }