7.4 更多关于布局的话题
这一节里,我们将讨论一些更深入的话题,在进行窗口布局的时候,你可以在脑子里考虑这些事情。
对话框单位
尽管布局控件可以让基本控件的大小随着平台的不同语言的不同进行相应的改变,但是有些情况下,你还是需要手动指定控件的大小(比如在对话框中增加一个列表框的时候).如果你希望这些手动指定的大小也随着平台的不同字体的不同进行相应的变化,你应该使用对话框单位来代替象素单位.对话框单位是基于应用程序当前字体的字符宽度和高度所取的一个平均值的,因此总能很好的和当前的字体对应.wxWidgets 也提供了相关的转换函数包括: ConvertDialogToPixels,ConvertPixelsToDialog 等,还包括一个宏 wxDLG_UNIT(window, ptOrSz) 用来直接将使用对话框单位 wxPoint 对象或者 wxSize 对象转换为象素单位.所以你可以使用下面的代码来指定那些你不得不指定的控件大小:
wxListBox* listBox = new wxListBox(parent, wxID_ANY,
wxDefaultPosition, wxDLG_UNIT(parent, wxSize(60, 20)));
你也可以在 XRC 文件中使用对话框单位,只需要在相应的值前面增加一个"d"字符就可以了。
平台自适应布局
尽管不同平台的对话框的绝大部分都是相同的,但是在风格上确是存在着一些不同.比如在 Windows 和 Linnx 平台上,右对齐或者居中放置的 OK,Cancel 和 Help 按钮都是可以接受的,但是在 Mac OsX 上,Help 按钮通常位于左面,而 Cancel 和 OK 按钮则通常依序位于右面。
要作到这种不同平台上按钮顺序的自适应,你需要使用 wxStdDialogButtonSizer 布局控件,这个控件继承自 wxBoxSizer,因此使用方法并没有太大的不同,只是它依照平台的不同对某些按钮进行特殊的排列。
这个布局控件的构造函数没有参数,要增加按钮可以使用两种方法:传递按钮指针给 AddButton 函数,或者(日过你没有使用标准的标识符的话),使用 SetAffirmativeButton, SetNegativeButton, and SetCancelButton 来设置按钮的特性.如果使用 AddButton,那么按钮应使用下面的这些标识符: wxID_OK, wxID_YES, wxID_CANCEL, wxID_NO, wxID_SAVE, wxID_APPLY, wxID_HELP 和 wxID_CONTEXT_HELP。
然后,在所有的按钮都增加到布局控件以后,调用 Realize 函数以便布局控件调整按钮的顺序,如下面的代码所示:
wxBoxSizer* topSizer = new wxBoxSizer(wxVERTICAL);
dialog->SetSizer(topSizer);
wxButton* ok = new wxButton(dialog, wxID_OK);
wxButton* cancel = new wxButton(dialog, wxID_CANCEL);
wxButton* help = new wxButton(dialog, wxID_HELP);
wxStdDialogButtonSizer* buttonSizer = new wxStdDialogButtonSizer;
topSizer->Add(buttonSizer, 0, wxEXPAND|wxALL, 10);
buttonSizer->AddButton(ok);
buttonSizer->AddButton(cancel);
buttonSizer->AddButton(help);
buttonSizer->Realize();
或者作为一个更方便的手段,你可以使用 wxDialog::CreateButtonSizer 函数,它基于一些按钮标记的列表来自动创建平台自适应的按钮,并将其放在一个布局控件中,如果你查看 src/generic 目录中的对话框代码的实现,你会发现大量的地方使用了 CreateButtonSizer 函数.这个函数支持的按钮标记如下表所示:
wxYES_NO | 增加 YES 和 No 按钮各一个。 |
---|---|
wxYES | 增加一个标识符为 wxID_YES 的 Yes 按钮。 |
wxNO | 增加一个标识符为 wxID_NO 的 No 按钮。 |
wxNO_DEFAULT | 让 No 按钮作为默认按钮,否则 Yes 或 OK 按钮将成为默认按钮。 |
wxOK | 增加一个标识符为 wxID_OK 的 OK 按钮。 |
wxCANCEL | 增加一个标识符为 wxID_CANCEL 的 Cancel 按钮。 |
wxAPPLY | 增加一个标识符为 wxID_APPLY 的 Apply 按钮。 |
wxHELP | 增加一个标识符为 wxID_HELP 的 Help 按钮。 |
使用 CreateButtonSizer 函数,上面例子中的代码可以简化为:
wxBoxSizer* topSizer = new wxBoxSizer(wxVERTICAL);
dialog->SetSizer(topSizer);
topSizer->Add(CreateButtonSizer(wxOK|wxCANCEL|wxHELP), 0,
wxEXPAND|wxALL, 10);
另外一种给不同的平台指定不同布局的方法是在 XRC 文件中指定平台属性.其中的参数部分的值可以通过一个"|"符号加上 unix, win,mac 或者 os2 来指定特定平台上的界面布局.在应用程序运行的时候,XRC 文件将只会创建那些和当前运行平台符合的控件.另外如果没有使用 XRC 的话,DialogBlocks 程序还支持针对不同的平台生成预置条件的 C++代码。
当然你也可以给不同的平台指定不同的 XRC 文件,不过这样作的话维护起来就有点不方便了。
动态布局
有时候你可能需要动态更改对话框的布局,比如你可以会增加一个"Detail"按钮,当这个按钮被按下的时候显式更多的选项,当然你可以使用平常的办法,调用 wxWindow::Show 函数来隐藏某个控件,不过 wxSizer 也提供了一个单独的方法,你可以使用 wxSizer:: Show 函数并且传递 False 参数,以便告诉 wxSizer 不要计算其中的窗口的大小,当然调用这个函数以后,你需要调用 wxSizer:: Layout 函数来强制更新对应的窗口。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论