wxDialog失去了最重要的属性

时间:2016-12-15 12:25:08

标签: c++ windows wxwidgets

我有两个带有按钮的wxDialogs,按钮点击按钮后,它们每个都是最顶层的对话框(wxSTAY_ON_TOP)。

工作流:

  1. 我使其中一个最受检查 - 对话框成为最顶层。

  2. 我再次点击,对话框变得不是最顶层,检查好了。

  3. 两者都做得最多,检查 - 确定,最重要。

  4. 在第3步之后制作其中一个不是最顶级的,检查 - 根据日志1 - 最顶部,另一个不是最顶级,但如果我点击某处,两者都表现得不是最顶级。我试过wxFrame,有超过2个wxDialogs - 结果相同。也许我错过了什么或者是一个错误。请帮忙。

  5. wxWidgets 3.0.2,Windows

    拥有对话框的简单框架

    class Frame : public wxFrame
    {
    public:
        Frame()
            : wxFrame(nullptr, wxID_ANY, wxEmptyString, wxPoint(1100, 300), wxSize(200, 200))
        {
            wxBoxSizer* sz = new wxBoxSizer(wxVERTICAL);
            wxStaticText* text = new wxStaticText(this, wxID_ANY, "Parent Frame");
            sz->Add(text, 0, wxALL, 5);
            SetSizer(sz);
            Layout();
        }
    };
    

    对话类

    class Dialog  : public wxDialog
    {
    public:
        Dialog(wxWindow* parent, wxPoint pos)
            : wxDialog(parent, wxID_ANY, "", pos, wxSize(200, 200),
                wxFRAME_NO_TASKBAR | wxTAB_TRAVERSAL | wxBORDER_NONE)
        {
            wxBoxSizer* mainS = new wxBoxSizer(wxVERTICAL);
            wxButton* button = new wxButton(this, wxID_ANY, "Top Most");
            mainS->Add(button, 0, wxALL, 5);
            SetSizer(mainS);
            Layout();
            button->Bind(wxEVT_BUTTON, &Dialog::onButton, this);
        }
    
        void onButton(wxCommandEvent&)
        {
            bool isTopMost = (GetWindowStyle() & wxSTAY_ON_TOP) != 0;
            if (isTopMost) {
                // Makes not top most dynamically
                SetWindowStyle(GetWindowStyle() & ~wxSTAY_ON_TOP);
            } 
            else {
                // Makes top most dynamically
                SetWindowStyle(GetWindowStyle() | wxSTAY_ON_TOP);
            }
        }
    };
    

    调用样本

    class WxguiApp : public wxApp
    {
    public:
        bool OnInit() override
        {
            Frame* mainWnd = new Frame();
            mainWnd->Show();
            SetTopWindow(mainWnd);
    
            Dialog* dlg1 = new Dialog(mainWnd, wxPoint(500, 300));
            dlg1->Show();
            Dialog* dlg2 = new Dialog(mainWnd, wxPoint(800, 300));
            dlg2->Show();
    
            return true;
        }
    };
    IMPLEMENT_APP(WxguiApp);
    

0 个答案:

没有答案