c++ - Wxwidgets - 如何添加调整大小事件处理程序以使“X”绘图随窗口调整大小?
问题描述
我正在尝试使用 C++ 学习 WxWidgets(我对此很陌生),并且我创建了一个黑色背景色的窗口,上面有一个大的红色“X”。我必须编辑代码,以便在我调整窗口大小时,“X”会随窗口改变其大小。如何正确实现此代码的调整大小事件处理程序?
这是我的代码生成的屏幕截图:https ://imgur.com/a/0I8EG5y
这是我到目前为止所拥有的”
#include <wx/wx.h>
#include <wx/dcbuffer.h>
class MyCanvas : public wxWindow
{
public:
MyCanvas(wxWindow* parent)
: wxWindow(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxFULL_REPAINT_ON_RESIZE)
{
SetBackgroundStyle(wxBG_STYLE_PAINT);
Bind(wxEVT_PAINT, &MyCanvas::OnPaint, this);
}
private:
void OnPaint(wxPaintEvent&)
{
wxAutoBufferedPaintDC dc(this);
dc.SetPen(*wxRED_PEN);
dc.SetBrush(*wxBLACK_BRUSH);
dc.DrawLine(0,0,485,485);
dc.DrawLine(0, 485, 485, 0);
}
};
class MyFrame : public wxFrame
{
public:
MyFrame()
: wxFrame(NULL, wxID_ANY, _("Resizable X"), wxDefaultPosition, wxSize(500, 525))
{
wxBoxSizer* bSizer = new wxBoxSizer(wxVERTICAL);
bSizer->Add(new MyCanvas(this), 1, wxEXPAND);
SetSizer(bSizer);
}
};
/**** MyApp ****/
class MyApp : public wxApp
{
public:
virtual bool OnInit()
{
MyFrame* frame = new MyFrame();
frame->Show();
return true;
}
};
IMPLEMENT_APP(MyApp)
解决方案
实现调整大小处理程序的最简单方法是在MyCanvas
ctor 中执行以下操作:
Bind(wxEVT_SIZE, [this](wxSizeEvent& event) { Refresh(); event.Skip(); });
这将在每次调整画布大小时完全刷新您的画布,即将生成一个wxEVT_PAINT
将导致调用您现有OnPaint()
处理程序的内容。
当然,为了真正有用,您OnPaint()
应该考虑当前窗口大小,即使用GetClientSize()
而不是硬编码485
。
推荐阅读
- java - Spring WebsecurityConfig 正在调用过滤器每个请求
- html - 高度为 100% 的 Flexbox 容器会破坏移动设备上的布局,但可以在移动设备大小的桌面浏览器上运行
- java - 无法使 JAR/WAR 可执行文件与嵌入式 Tomcat 7 一起工作
- presto - 从 Presto varchar 列解析 JSON 失败
- javascript - 使用 django 处理大型 jquery 数据表很慢
- typescript - 将对象文字分配给打字稿泛型类型
- html - 在中使用切换按钮
- java - 如何以所需的方式对 REST API 响应进行排序?
- xslt - 如何使用 XSLT 删除特定 xml 元素的命名空间前缀?
- c - 问题编译 libmagic 程序,magic_open,MAGIC_MIME 和 MAGIC_CHECK 未声明