在C ++中的FLTK中在运行时添加/删除小部件

用户名

我正在制作一个处理平面图的应用程序,因此希望有一个“层”对话框,该对话框允许用户打开/关闭平面图中的不同层。

我希望有一个弹出窗口,因此对于运行时加载的平面布置图中的每个层都有一个复选框。每个复选框本身就是一个小部件,我只有在编译时指定/创建的经验。但是,在加载特定的平面图之前,我不知道需要多少复选框。

我向前迈进的问题是,我将如何在FLTK中创建此类功能(我正在使用什么)。我可以想象在启动层对话框时(在每个回调中都具有通用的回调函数)在回调中循环创建复选框小部件,但是我不知道如何指示FLTK将复选框小部件放在何处。即,在运行时如何指示FLTK层对话窗口应为父窗口小部件?另外,我可以动态创建整个窗口,但是我担心确保每当隐藏窗口时都将其销毁(删除)。

注意:我可以想象当窗口关闭(隐藏)时删除窗口小部件。在这一点上,我还不清楚:我是以通常的new / delete c ++方式删除小部件,还是使用Fl :: delete_widget()对话框(http://www.fltk.org/doc-1.3/group__fl__del__widget。 html#ga609413ac47ba433d1e7da8678a27164f

或者:有没有更好的方法可以解决所有这些问题呢?

杯子

这是一个如何根据层数进行大小调整的有说服力的示例。需要注意的主要事情是,如果使用向量,则随着向量的增长它会重新分配,因此保持指针在向量中显示数据可能会导致屏幕上出现垃圾。

如果您在某个位置的const文件中设置小部件的大小,则可以使用它来调整大小。

#include <FL/Fl.H>
#include <FL/fl_draw.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Box.H>
#include <FL/Fl_Button.H>
#include <FL/Fl_Check_Button.H>
#include <iostream>
#include <sstream>
#include <string>
#include <list>
#include <vector>

const int hsep = 10, vsep = 10, btnwid = 100, btnhgt = 20;

// The canvas layer
class Canvas : public Fl_Box
{
    Fl_Offscreen& m_buffer;
public:
    Canvas(int x, int y, int w, int h, Fl_Offscreen& buffer)
        : Fl_Box(x, y, w, h)
        , m_buffer(buffer)
    {
    }

    void Clear()
    {
        fl_begin_offscreen(m_buffer);
        fl_color(FL_WHITE);
        fl_rectf(0, 0, w(), h());
        fl_end_offscreen();
    }
    void draw()
    {
        fl_copy_offscreen(x(), y(), w(), h(), m_buffer, 0, 0);
    }
};

// This structure exists because there is no callback that takes
// two client parameters.  Also, the tag must exist for the life of
// the dialog.
class LayerWin;
class LayerCheck
{
public:
    int m_layer;
    std::string m_tag;
    LayerWin* m_parent;
};

// The layer window
class LayerWin
{
    int m_layers;
    Fl_Window* m_dlg;
    std::string m_title;
    std::list<LayerCheck> m_tag;
    Canvas* m_canvas;
    Fl_Offscreen m_buffer;
    std::vector<bool> m_layer;
public:
    LayerWin(int layers)
        : m_layers(layers)
        , m_dlg(0)
    {
    }
    ~LayerWin()
    {
        delete m_dlg;
    }

    void Create()
    {
        int dlgwid = 400, dlghgt = 300;
        std::ostringstream oss;

        oss << m_layers << " Layers";
        m_title = oss.str();
        m_dlg = new Fl_Window(dlgwid, dlghgt, m_title.c_str());
        m_dlg->set_modal();
        int x = hsep, y = vsep;
        for (int ll = 0; ll < m_layers; ++ll)
        {
            oss.str("");
            oss << "Layer " << ll + 1;
            LayerCheck dummy;
            m_tag.push_back(dummy);
            LayerCheck& actual = m_tag.back();
            actual.m_tag = oss.str();
            actual.m_layer = ll;
            actual.m_parent = this;
            Fl_Check_Button* btnCheck = new Fl_Check_Button(x, y, btnwid, btnhgt, actual.m_tag.c_str());
            btnCheck->callback(_LayerCB, &actual);
            m_layer.push_back(false);
            y += vsep + btnhgt;
        }

        x = hsep + btnwid + hsep;
        y = vsep;
        int canw = dlgwid - x - 2 * hsep;
        int canh = dlghgt - 3 * vsep;
        m_buffer = fl_create_offscreen(canw, canh);
        m_canvas = new Canvas(x, y, canw, canh, m_buffer);
        m_canvas->Clear();

        Fl_Button* btnClose = new Fl_Button(hsep, dlghgt - vsep - btnhgt, btnwid, btnhgt, "Close");
        btnClose->callback(_CloseCB, this);
        m_dlg->end();
        m_dlg->show();

        Fl::wait();
    }

    static void _CloseCB(Fl_Widget* w, void* client)
    {
        LayerWin* self = (LayerWin*)client;
        delete self;
    }
    static void _LayerCB(Fl_Widget* w, void* client)
    {
        Fl_Check_Button* btn = (Fl_Check_Button*)w;
        LayerCheck* check = (LayerCheck*)client;
        check->m_parent->LayerCB(check->m_layer, !!btn->value());
    }
    void LayerCB(int layer, bool set)
    {
        std::cout << "Layer " << layer+1 << "=" << set << std::endl;
        m_layer[layer] = set;

        // Redo the canvas
        m_canvas->Clear();
        fl_begin_offscreen(m_buffer);
        for (int ll = 0; ll < m_layer.size(); ++ll)
        {
            if (m_layer[ll])
            {
                switch (ll)
                {
                case 0:
                    fl_color(FL_RED);
                    fl_circle(20, 40, 100);
                    break;
                case 1:
                    fl_color(FL_DARK_GREEN);
                    fl_rectf(50, 70, 20, 40);
                    break;
                case 2:
                    fl_color(FL_BLUE);
                    fl_circle(100, 100, 50);
                    break;
                case 3:
                    fl_color(FL_DARK_MAGENTA);
                    fl_circle(200, 200, 70);
                    break;
                case 4:
                    fl_color(FL_DARK_CYAN);
                    fl_rectf(100, 200, 60, 90);
                    break;
                default:
                    std::cout << "Don't know what to do for layer " << ll + 1;
                    break;
                }
            }
        }
        fl_end_offscreen();
        m_canvas->redraw();
    }
};

void LayerCB(Fl_Widget* w, long layers)
{
    // Create a modal dialog with layers checkbuttons
    LayerWin* dlg = new LayerWin(layers);
    dlg->Create();
}

int main()
{
    // Work out the sizes
    int scrwid = btnwid + 2 * hsep, scrhgt = 2 * vsep + 3 * (vsep + btnhgt);

    // Create the main dialog
    Fl_Window mainwin(scrwid, scrhgt, "Layers");
    int x = hsep;
    int y = vsep;
    Fl_Button* button = new Fl_Button(x, y, btnwid, btnhgt, "3 layers");
    button->callback(LayerCB, 3);

    y += vsep + btnhgt;
    button = new Fl_Button(x, y, btnwid, btnhgt, "4 layers");
    button->callback(LayerCB, 4);

    y += vsep + btnhgt;
    button = new Fl_Button(x, y, btnwid, btnhgt, "5 layers");
    button->callback(LayerCB, 5);
    mainwin.end();
    mainwin.show();
    return Fl::run();
}

祝你好运!

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在Objective C中,如何在运行时获取self的类名?

来自分类Dev

在C#Winform中在运行时更改语言

来自分类Dev

在运行时在c中创建某个结构

来自分类Dev

如何使用C#在运行时在MS Access中创建存储的查询

来自分类Dev

如何在运行时在Visual Studio中编辑C#代码,而不是编辑并继续

来自分类Dev

在标准C中(而不是在C99中)在运行时声明数组的大小

来自分类Dev

如何在运行时在C#.NET集成测试中查找物理路径?

来自分类Dev

在c ++中的FLTK中在运行时添加/删除小部件

来自分类Dev

如何在运行时在Objective-C中查找字符串常量?

来自分类Dev

如何在运行时Objective-C中重写/处理私有类的方法?

来自分类Dev

Dev-Cpp中的C代码在运行时中断

来自分类Dev

如何在运行时使用C查找微控制器中的堆栈溢出

来自分类Dev

在运行时PictureBox控件C中找不到图像属性

来自分类Dev

我可以在C ++中在运行时更改对象的类型吗

来自分类Dev

C#在运行时或使用Mono.Cecil将代码添加到方法中

来自分类Dev

在运行时从C#中的ArrayList生成自定义对象

来自分类Dev

C#将事件处理程序添加到在运行时从程序集加载的类中

来自分类Dev

为什么C#表单中的所有内容在运行时变得模糊?

来自分类Dev

如何释放在运行时组件中创建的c ++ WinRT类的内存

来自分类Dev

目标C-在运行时添加属性

来自分类Dev

使用C#中的上下文菜单在运行时删除控件

来自分类Dev

在运行时在Objective-C中检测并使用可选的外部C库

来自分类Dev

在运行时C#中从List <Timer>中删除计时器

来自分类Dev

C#在运行时或使用Mono.Cecil将代码添加到方法中

来自分类Dev

在运行时无法从Model中的“方法”中设置Type参数C#MVC

来自分类Dev

如何在运行时在C中检测OS

来自分类Dev

如何在C#中在运行时添加/执行并最终将新代码删除到程序中

来自分类Dev

如何在运行时在 C# MVC 中在运行时向已经存在的数据表添加新行

来自分类Dev

C# 表单在运行时添加控件

Related 相关文章

  1. 1

    在Objective C中,如何在运行时获取self的类名?

  2. 2

    在C#Winform中在运行时更改语言

  3. 3

    在运行时在c中创建某个结构

  4. 4

    如何使用C#在运行时在MS Access中创建存储的查询

  5. 5

    如何在运行时在Visual Studio中编辑C#代码,而不是编辑并继续

  6. 6

    在标准C中(而不是在C99中)在运行时声明数组的大小

  7. 7

    如何在运行时在C#.NET集成测试中查找物理路径?

  8. 8

    在c ++中的FLTK中在运行时添加/删除小部件

  9. 9

    如何在运行时在Objective-C中查找字符串常量?

  10. 10

    如何在运行时Objective-C中重写/处理私有类的方法?

  11. 11

    Dev-Cpp中的C代码在运行时中断

  12. 12

    如何在运行时使用C查找微控制器中的堆栈溢出

  13. 13

    在运行时PictureBox控件C中找不到图像属性

  14. 14

    我可以在C ++中在运行时更改对象的类型吗

  15. 15

    C#在运行时或使用Mono.Cecil将代码添加到方法中

  16. 16

    在运行时从C#中的ArrayList生成自定义对象

  17. 17

    C#将事件处理程序添加到在运行时从程序集加载的类中

  18. 18

    为什么C#表单中的所有内容在运行时变得模糊?

  19. 19

    如何释放在运行时组件中创建的c ++ WinRT类的内存

  20. 20

    目标C-在运行时添加属性

  21. 21

    使用C#中的上下文菜单在运行时删除控件

  22. 22

    在运行时在Objective-C中检测并使用可选的外部C库

  23. 23

    在运行时C#中从List <Timer>中删除计时器

  24. 24

    C#在运行时或使用Mono.Cecil将代码添加到方法中

  25. 25

    在运行时无法从Model中的“方法”中设置Type参数C#MVC

  26. 26

    如何在运行时在C中检测OS

  27. 27

    如何在C#中在运行时添加/执行并最终将新代码删除到程序中

  28. 28

    如何在运行时在 C# MVC 中在运行时向已经存在的数据表添加新行

  29. 29

    C# 表单在运行时添加控件

热门标签

归档