Визуальный артефакт в виджете fltk-1.3.5 - PullRequest
0 голосов
/ 20 мая 2019

В настоящее время я работаю над игрой в крестики-нолики и не могу понять, как убрать визуальный артефакт (увеличенная стрелка в Fl_Choice / Dropdown), который вы видите на изображении. Вы можете найти код на https://github.com/FG-33/TicTacToeML.

Я работаю над окнами, используя fltk-1.3.5.

1] .

В настоящее время у меня есть два типа компонентов, которые я использую для создания графического интерфейса. Первая - это фигура, нарисованная с использованием методов рисования fltk:

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 метод рисования.

Второй тип компонентов 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(), которые инициализируют виджеты 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 голосов
/ 20 мая 2019

Я решил это.

Как я рисую различные виды фигур:

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); 

в конце функции рисования.

...