wxWidgets 中Notebook 刷新问题

解决wxScrolledWindow作为Notebook面板时初次显示控件位置不正确的问题。通过重载OnPaint方法并仅在首次绘制时调用Layout方法,确保控件正确布局。

      在使用NoteBook控件制作工具时,我需要将从wxScrolledWindow继承来的面板加到NoteBook控件中。在面板显示后,面板中的空间位置刷新不正确或者不显示(wxSlider最小值显示不正确、wxRadioBox不显示、等问题)。当再次拖动界面改变界面大小,界面控件变得正常。

 

      控件位置不正确应该是Layout的问题,于是想到让面板显示时候执行下Layout方法。让面板重载了Show方法,在该方法中调用

this->Layout();。但是当第一次打开该页面时刷新还是不正常,需要切换下页卡重新打开就显示正常了。于是想到可能wxScrolledWindow面板中的控件刷新需要在控件都显示出来以后再执行下Layout方法。于是就让该面板重载了Onpaint方法,在该方法中只调用一次Layout方法来刷新下控件的位置,以后Onpaint不在调用Layout方法。这样面板在第一次显示时,上面的空间位置都正确。

 

class TerrainEditorPanel : public wxScrolledWindow

{

........

void OnPaint    (wxPaintEvent &event);

private:

bool    m_firstlayout;

}

 

 

void TerrainEditorPanel::OnPaint(wxPaintEvent& event)
{
        if ( m_firstlayout )
        {
                m_firstlayout = false;
               Layout();
        }
        wxScrolledWindow::OnPaint(event);
}

 

前后对比如下.

### 如何在 Visual Studio 2022 中正确配置 wxWidgets #### 打开解决方案文件 对于最新版本的wxWidgets,在Windows环境下安装、配置、编译以及创建项目实现“hello world”,可以参照相似流程。首先,打开目录`wxWidgets-3.1.4\build\msw`,找到与Visual Studio 2022最匹配的`.sln`文件并用VS打开。由于官方可能会立即提供针对每一个新发布的Visual Studio版本的具体方案文件,可以选择接近版本的文件尝试兼容模式打开[^3]。 #### 进行批生成操作 待上述步骤完成且确认环境准备好之后,选择菜单中的“生成——批生成”。此时应确保所有目标都被选中以进行全面构建过程,依据计算机性能差异整个编译时间可能会有所同,用户需耐心等待直至全部成功结束。 #### 设置环境变量 为了使系统能够识别到库的位置,在操作系统层面设置路径也是必要的环节之一。具体做法涉及编辑系统的PATH等环境变量,加入解压后的wxWidgets根目录及其下的lib子目录等内容,以便于链接阶段顺利调用所需的静态或动态链接库文件。 #### 使用预编译二进制包简化流程 如果希望跳过自行编译源码的过程,则可以直接利用官方网站提供的适用于Windows平台上的预编译好的wxWidgets二进制分发版来加速开发前准备工作。这种方式特别适合那些急于开始应用界面编程而愿意花费额外精力处理底层依赖关系的人群[^4]。 #### 测试配置有效性 最后验证当前环境是否已经正确设置了wxWidgets支持,可以通过新建一个简单的控制台应用程序工程,并向其中添加一段标准的HelloWorld程序代码来进行初步检验。当一切正常的话,应该可以看到预期的结果展示出来[^5]。 ```cpp #include <wx/wx.h> class MyApp : public wxApp { public: virtual bool OnInit(); }; class MyFrame : public wxFrame { public: MyFrame(const wxString& title); private: void OnQuit(wxCommandEvent& event); DECLARE_EVENT_TABLE() }; BEGIN_EVENT_TABLE(MyFrame, wxFrame) EVT_MENU(wxID_EXIT, MyFrame::OnQuit) END_EVENT_TABLE() bool MyApp::OnInit() { MyFrame *frame = new MyFrame(_T("Hello World")); frame->Show(true); return true; } MyFrame::MyFrame(const wxString& title) : wxFrame(NULL, wxID_ANY, title, wxDefaultPosition, wxSize(200, 150)) { wxMenu *menuFile = new wxMenu; menuFile->Append(wxID_EXIT); wxMenuBar *menuBar = new wxMenuBar; menuBar->Append(menuFile, _T("&File")); SetMenuBar(menuBar); } void MyFrame::OnQuit(wxCommandEvent& WXUNUSED(event)) { Close(true); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值