Fl_Window 子类不起作用
Posted
技术标签:
【中文标题】Fl_Window 子类不起作用【英文标题】:Fl_Window subclass doesn't work 【发布时间】:2016-05-20 17:18:19 【问题描述】:如上所述,我正在尝试让一个非常简单的 FLTK 1.3.3 应用程序正常工作。 但是,即使只有一个简单的 Fl_Window 和 1 个 Fl_Button,似乎也没有任何效果。有人可以帮忙吗?
class MainEditorWindow : public Fl_Window
public:
MainEditorWindow(int _width, int _height, std::string _title);
~MainEditorWindow();
virtual void draw();
virtual int handle(int _event);
private:
Fl_Button* m_btnExit;
;
这是实现
MainEditorWindow::~MainEditorWindow()
int MainEditorWindow::handle(int _event)
return 1;
void MainEditorWindow::draw()
m_btnExit->redraw();
MainEditorWindow::MainEditorWindow(int _width, int _height, std::string _title) : Fl_Window(_width, _height, _title.c_str())
this->begin();
m_btnExit = new Fl_Button(0, 0, 40, 40, "EXIT");
m_btnExit->color(FL_RED);
this->color(FL_WHITE);
this->end();
但是当像这样简单地运行应用程序时:
int main(int argc, char** argv)
MainEditorWindow* mw = new MainEditorWindow(800, 600, "SHIP Editor");
mw->show(argc,argv);
return Fl::run();
窗口显示得很好,它的可调整大小可移动等,draw()
- 函数正在被调用等等。但是窗口本身只是空白。它什么也没有显示,尤其是Fl_Button
。谁能告诉我为什么会这样?据我所知,我的代码应该没有什么特别的问题。
【问题讨论】:
您不需要以某种方式将按钮添加到窗口吗? @Hedanito 在begin()
和and()
之间创建小部件正是这样做的。
我只能想象线程危险:|
@Hedanito 我也担心这一点——因为至少可以说 FLTKs API 已经过时了。不过他们有一个add(Fl_Widget*)
函数。
【参考方案1】:
你需要调用 Fl_Window::draw()
void MainEditorWindow::draw()
m_btnExit->redraw();
Fl_Window::draw();
也许你希望按钮也可以点击
int MainEditorWindow::handle(int _event)
//return 1;
return(Fl_Window::handle(_event));
【讨论】:
【参考方案2】:在你的 MainEditorWindow
构造函数中试试这个:
MainEditorWindow(int _width, int _height, const std::string& _title)
: Fl_Window(_width, _height, _title.c_str())
// begin grouped GUI object creation
Fl_Group::begin();
// alter x,y coords of button as necessary
m_btnExit = new Fl_Button(0,0,40,40,"EXIT");
m_btnExit->color(FL_RED);
// end grouped GUI object creation
Fl_Group::end();
// defines resizable widget for group
Fl_Group::resizable(this);
this->color(FL_WHITE);
// display window
Fl_Window::show();
然后在main中:
int main(int argc, char** argv)
MainEditorWindow mw(800, 600, "SHIP Editor");
return Fl::run();
这里我们将按钮添加到一个组中,然后在构造函数中调用Fl_Window::show()
来显示它。
请注意,在main
中无需将mw
设为指向MainEditorWindow
的指针。
【讨论】:
@calcyss 尝试改变按钮的 (x,y) 坐标(Fl_Button
构造函数的前 2 个参数)
问题似乎出在Fl_Window
的子类化上。我尝试简单地创建一个 Fl_Window
并向其添加一个按钮,这很有效。
你可以尝试创建Fl_Window
的子类吗?
我有一个我不久前制作的 fltk 应用程序,它使用与我上面的答案类似的代码结构并且这有效,但我可以在一段时间内尝试另一个测试用例。
hm... 用Fl_Window::draw();
调用基类draw()
方法成功了,它现在可以工作了。很奇怪。以上是关于Fl_Window 子类不起作用的主要内容,如果未能解决你的问题,请参考以下文章
UICollectionViewFlowLayout 子类不起作用