【发布时间】:2021-08-13 16:53:00
【问题描述】:
这是我使用 HTML 和 CSS 创建的参考布局(颜色仅用于突出显示边界)。代码如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
.message {
padding: 5px;
background-color: red;
}
.text-field {
margin: 0;
padding: 5px;
background-color: gray;
color: black;
display: inline-block;
}
.max-size {
max-width: 60%;
}
.align-right {
text-align: right;
}
.align-right p {
text-align: left;
}
</style>
</head>
<body>
<div class="message">
<div class="msg-header">
<p class="text-field max-size">Sender</p>
</div>
<div class="msg-content">
<p class="text-field max-size">Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p>
</div>
</div>
<div class="message">
<div class="msg-header align-right">
<p class="text-field max-size">You</p>
</div>
<div class="msg-content align-right">
<p class="text-field max-size">Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.</p>
</div>
</div>
</body>
</html>
我尝试使用 c++ 和 wxWidgets 实现相同的布局。忽略 60% 的最大尺寸,我尝试了以下操作。
MainFrame::MainFrame(const wxString& title, const wxPoint& pos, const wxSize& size) : wxFrame(NULL, wxID_ANY, title, pos, size) {
this->InitialiseComponents();
}
void MainFrame::InitialiseComponents() {
...
this->panelChat = new wxScrolledWindow(this->splitterChatLog, MFID_LIST_BOX_CHAT, wxDefaultPosition, wxSize(850, 100));
this->panelChat->SetBackgroundColour(wxColour(255, 255, 255));
this->panelChat->SetScrollRate(5, 5);
this->sizerChat = new wxBoxSizer(wxVERTICAL);
this->panelChat->SetSizer(this->sizerChat);
...
}
void MainFrame::AddChatMessage(std::string addr, std::string str, bool sent) {
wxPanel *panelMsg = new wxPanel(this->panelChat, wxID_ANY);
panelMsg->SetBackgroundColour(wxColour(255, 0, 0));
wxStaticText *textAddr = new wxStaticText(panelMsg, wxID_ANY, addr);
wxStaticText *textMsg = new wxStaticText(panelMsg, wxID_ANY, str);
wxBoxSizer *sizerMsgHeader = new wxBoxSizer(wxVERTICAL);
wxBoxSizer *sizerMsgContent = new wxBoxSizer(wxVERTICAL);
sizerMsgHeader->Add(textAddr, 0, (sent ? wxALIGN_RIGHT : 0));
sizerMsgContent->Add(textMsg, 0, (sent ? wxALIGN_RIGHT : 0));
wxBoxSizer *sizerMsg = new wxBoxSizer(wxVERTICAL);
sizerMsg->Add(sizerMsgHeader, 0, wxEXPAND);
sizerMsg->Add(sizerMsgContent, 0, wxEXPAND | wxBOTTOM, 5);
panelMsg->SetSizer(sizerMsg);
this->sizerChat->Add(panelMsg, 0, wxEXPAND | wxLEFT | wxTOP | wxRIGHT, 5);
}
问题是:
- 多次调用 AddChatMessage 不会将它们叠加的消息堆叠起来。
- 每个消息面板都是一个 20x20 的红色正方形。它既不水平扩展也不包裹其内容。
【问题讨论】: