fltk-1.3.5小部件上的视觉工件

时间:2019-05-19 21:30:40

标签: c++ fltk

我目前正在做井字游戏,无法弄清楚如何删除图像中可见的视觉伪像(Fl_Choice / Dropdown中的放大箭头)。您可以在https://github.com/FG-33/TicTacToeML上找到代码。

我正在使用fltk-1.3.5在Windows上工作。

1]

目前,我有两种类型的组件可用于创建GUI。第一个是使用fltk的draw方法绘制的形状:

class GameWindow : Fl_Double_Window { 
    std::vector<std::shared_ptr<IShape>> shapes;
    void draw() override;

..

void GameWindow::draw() {
    Fl_Double_Window::draw();
    for(int i=0;i<shapes.size();i++)
        shapes[i]->draw();
}

void Line::draw() const { // An example for an IShape
    fl_color(FL_FOREGROUND_COLOR);
    fl_line_style(FL_SOLID, line_width); // has to be after color on win32
    fl_line(lineStart.x(), lineStart.y(), lineEnd.x(), lineEnd.y());
}

要分解它,有一个此类GameWindow,其中包含一个向量,其中包含我要绘制的所有形状。该类覆盖Fl_Double_Window的draw方法。

第二种GUI组件是fltk给出的实际组件:

class ConfigDialog : public IWidget {
    std::shared_ptr<Fl_Box> box;
    void attach() override;

..

void ConfigDialog::attach() {
    box = std::make_shared<Fl_Box>(FL_SHADOW_BOX, topLeft.x(), topLeft.y(), width, height, ""); 
}

void GameWindow::attach(std::shared_ptr<IWidget> w) {
        begin();
        w->attach();
        end();
        widgets.push_back(w); // there's also a vector for widgets
}

要创建小部件,我调用attach()方法,该方法从window类初始化fltk小部件。要删除小部件和形状,我将其称为向量的clear()方法。

我在做什么以及工件何时出现:

// start the game in main

// Create dialog in the image // THE ERROR DOES NOT OCCUR HERE
view.attach(move(make_shared<ConfigDialog>(ConfigDialog(Point(width/6, height/3), width*2/3, height/3+height/40, this))));

// Remove the dialog if game is started
widgets.clear()

// add some shapes and draw them like this
fl_color(FL_FOREGROUND_COLOR);
fl_line_style(FL_SOLID, line_width); // has to be after color on win32
fl_line(lineStart.x(), lineStart.y(), lineEnd.x(), lineEnd.y());

// remove the shapes if game is finished
shapes.clear()

// add config dialog in the image again // NOW THE ERROR OCCURS
view.attach(move(make_shared<ConfigDialog>(ConfigDialog(Point(width/6, height/3), width*2/3, height/3+height/40, this))));

感谢您对任何可能出现工件的帮助,技巧或指示。

1 个答案:

答案 0 :(得分:0)

我解决了。

我如何绘制各种形状:

void Line::draw() const {
    fl_color(FL_FOREGROUND_COLOR);
    fl_line_style(FL_SOLID, line_width); // has to be after color on win32
    fl_line(lineStart.x(), lineStart.y(), lineEnd.x(), lineEnd.y());
}

问题是fl_line_style(FL_SOLID, line_width);仍然可以更改之后添加到窗口中的其他内容的线宽。因此,为了解决这个问题,我确实通过添加

将线宽重置为1
fl_line_style(FL_SOLID, 1); 

在绘图功能的末尾。