C++ FLTK:如何在前景中放置图形对象?

C++ FLTK:如何在前景中放置图形对象?,c++,graphics,fltk,C++,Graphics,Fltk,我在一个窗口中有两个可拖动的对象:一个包含黑色正方形的对象在背景中,而一个包含红色正方形的对象在前景中 这种布局是由它们的绘制顺序决定的。我希望将当前正在拖动的框放在前景中:例如,如果我拖动带有黑色正方形的框,我希望它放在前景中。一旦我把它扔了,它应该留在前景里。如果我拖动红色的,我希望它在前景中,而黑色的在背景中 我试图查看FLTK 1.3.5的文档,但没有发现任何有用的东西(至少就我所能理解的而言)。有没有办法达到我想要的 下面列出了代码(由该代码激发) #include <FL/Fl

我在一个窗口中有两个可拖动的对象:一个包含黑色正方形的对象在背景中,而一个包含红色正方形的对象在前景中

这种布局是由它们的绘制顺序决定的。我希望将当前正在拖动的框放在前景中:例如,如果我拖动带有黑色正方形的框,我希望它放在前景中。一旦我把它扔了,它应该留在前景里。如果我拖动红色的,我希望它在前景中,而黑色的在背景中

我试图查看FLTK 1.3.5的文档,但没有发现任何有用的东西(至少就我所能理解的而言)。有没有办法达到我想要的

下面列出了代码(由该代码激发)

#include <FL/Fl.H>
#include <FL/Fl_Double_Window.H>
#include <FL/Fl_Scroll.H>
#include <FL/Fl_Box.H>
#include <FL/Fl_Pixmap.H>
#include <iostream>

static char *box1_xpm[] = {                       // XPM
"20 20 2 1",
"  c #000000",
"# c None",
"####################",
"####################",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"####################",
"####################"
};

static char *box2_xpm[] = {                       // XPM
"20 20 2 1",
"  c #FF0000",
"# c None",
"####################",
"####################",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"####################",
"####################"
};

Fl_Double_Window *G_win    = NULL;
Fl_Scroll        *G_scroll = NULL;
static Fl_Pixmap  G_box1(box1_xpm);
static Fl_Pixmap  G_box2(box2_xpm);

#define BOXWIDTH  50
#define BOXHEIGHT 50

// A 'MOVABLE' BOX
class Box : public Fl_Box {
protected:
    int handle(int e) {
        static int offset[2] = { 0, 0 };
        int ret = Fl_Box::handle(e);
        switch ( e ) {
            case FL_PUSH:
                offset[0] = x() - Fl::event_x();    // save where user clicked for dragging
                offset[1] = y() - Fl::event_y();
                return(1);
            case FL_RELEASE:
                return(1);
            case FL_DRAG:
                position(offset[0]+Fl::event_x(), offset[1]+Fl::event_y());     // handle dragging
                G_win->redraw();
                return(1);
        }
        return(ret);
    }
public:
    Box(int X, int Y, int idx) : Fl_Box(X,Y,BOXWIDTH,BOXHEIGHT,0) {
        idx>0? image(G_box1):image(G_box2);
        box(FL_UP_BOX);
        color(FL_GRAY);
    }
};

/// MAIN
int main() {
    G_win = new Fl_Double_Window(200,200);
    new Box(20,BOXHEIGHT,2);
    new Box(20+BOXWIDTH,BOXHEIGHT,0);
    G_win->resizable(G_win);
    G_win->show();
    return(Fl::run());
}
#包括
#包括
#包括
#包括
#包括
#包括
静态字符*box1_xpm[]={//xpm
"20 20 2 1",
“百万加元”,
“#c无”,
"####################",
"####################",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"####################",
"####################"
};
静态字符*box2_xpm[]={//xpm
"20 20 2 1",
“c#FF0000”,
“#c无”,
"####################",
"####################",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"#                  #",
"####################",
"####################"
};
Fl_双_窗口*G_win=NULL;
Fl_Scroll*G_Scroll=NULL;
静态Fl_Pixmap G_box1(box1_xpm);
静态Fl_Pixmap G_box2(box2_xpm);
#定义箱宽50
#定义框高50
//“可移动”的盒子
类框:公共层框{
受保护的:
int句柄(inte){
静态整数偏移量[2]={0,0};
int ret=Fl_盒::手柄(e);
开关(e){
案例FLU推送:
偏移量[0]=x()-Fl::event_x();//保存用户单击拖动的位置
偏移量[1]=y()-Fl::event_y();
申报表(1);
案例FLU发布:
申报表(1);
案例FL_阻力:
位置(偏移量[0]+Fl::event_x(),偏移量[1]+Fl::event_y());//句柄拖动
G_win->redraw();
申报表(1);
}
返回(ret);
}
公众:
方框(整数X,整数Y,整数idx):Fl_方框(X,Y,方框宽度,方框高度,0){
idx>0?图像(G_盒1):图像(G_盒2);
盒子(FL\U UP\U盒子);
颜色(浅灰色);
}
};
///主要
int main(){
G_win=新的Fl_双_窗口(200200);
新箱子(20个,箱高,2个);
新箱子(20+箱宽,箱高,0);
G_-win->可调整大小(G_-win);
G_win->show();
返回(Fl::run());
}

小部件按照它们在父对象的child()列表中出现的顺序绘制。诀窍是确保拖动的小部件是最后绘制的小部件。按如下所示更换推压箱

            case FL_PUSH:
                {
                    offset[0] = x() - Fl::event_x();    // save where user clicked for dragging
                    offset[1] = y() - Fl::event_y();

                    // Do we need to rearrange?
                    int last_ix = G_win->children() - 1;
                    Box* last = (Box*)G_win->child(last_ix);
                    if (last != this)
                    {
                        // Widgets get drawn in the order in which they were inserted.
                        // Remove this widget from the parent
                        G_win->remove(this);
                        // Re-add it at the bottom of the list
                        G_win->add(this);
                    }
                }
                return(1);

这是一种魅力,谢谢。如果有两个以上的小部件,它也是完美的。还有一个改进-偏移量不需要是静态的-它可以声明为成员变量。谢谢,我没有仔细查看其余的代码,我只关注前台/后台问题。