如何显式设置wxFrame位置?wxICONIZE为何致SetPosition失效?
wxFrame设置wxICONIZE标志后SetPosition失效的原因
问题复现
以下是触发问题的代码片段:
... wxFrame* mainFrame = new wxFrame(NULL, wxID_ANY, "main frame", wxPoint(10, 20), wxSize(150, 100), wxICONIZE); mainFrame->SetBackgroundColour(wxColor(80, 50, 100)); mainFrame->SetSize(wxSize(200, 50)); mainFrame->SetPosition(wxPoint(1400, 200)); ...
调用SetPosition()后窗口仍停留在构造时的wxPoint(10,20)位置,但移除wxICONIZE标志后,SetPosition()可正常生效。
原因分析
- 当构造
wxFrame时传入wxICONIZE标志,窗口会直接以最小化(图标化)状态创建。在Windows、GTK、macOS等主流桌面窗口系统中,最小化窗口的位置由系统窗口管理器全权控制,程序调用SetPosition()无法修改它——最小化窗口通常会被固定到任务栏、Dock等系统预设区域,常规位置设置接口对其无效。 - 省略
wxICONIZE时,窗口处于正常显示状态,此时窗口管理器允许程序通过SetPosition()自定义窗口位置,因此设置能正常生效。
解决办法
如果需要先指定窗口位置再将其最小化,可调整操作顺序:
- 不传入
wxICONIZE标志构造窗口 - 调用
SetPosition()设置目标位置 - 调用
Iconize(true)将窗口最小化
示例代码:
... // 不使用wxICONIZE标志构造窗口 wxFrame* mainFrame = new wxFrame(NULL, wxID_ANY, "main frame", wxPoint(10, 20), wxSize(150, 100)); mainFrame->SetBackgroundColour(wxColor(80, 50, 100)); mainFrame->SetSize(wxSize(200, 50)); mainFrame->SetPosition(wxPoint(1400, 200)); // 构造完成后再最小化窗口 mainFrame->Iconize(true); ...
内容的提问来源于stack exchange,提问作者Dario101
相关产品推荐
相关产品推荐

