首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何更改Fl_Box中的标签位置?

如何更改Fl_Box中的标签位置?
EN

Stack Overflow用户
提问于 2022-01-03 14:44:31
回答 2查看 131关注 0票数 0

我想要自定义标签在Fl_Box中的位置。查看我看到的draw_label()函数这里文档:这是Fl_Widget的一个受保护的成员,因此我为Fl_Box派生了一个自定义类。代码在下面。

代码语言:javascript
运行
复制
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Box.H>
#include <FL/Fl_Button.H>

class mBox: public Fl_Box{
    public:
        mBox(int X, int Y, int W, int H, const char* l=0): Fl_Box(X,Y,W,H,l){};

        void drawLabel(){
            label("New");
            draw_label(x(),y(),100,25);
            redraw_label();
            };

};

void action(Fl_Widget* w, void* data){
    mBox* B = (mBox*) data;
    B -> drawLabel(); }

int main(int argc, char **argv) {
    Fl_Window* G_win; 
    G_win = new Fl_Window(180,100,"The font test");

    mBox* A = new mBox(10,10,110,50,"The font TEST.");
    A -> box(FL_UP_BOX);

    Fl_Button* b = new Fl_Button(10,70,100,25,"Test");
    b -> callback(action,A);
 
    G_win->show();
    return(Fl::run()); }

当按下按钮时,我预计框中的标签将更改为“新建”,其左角位于x(), y()位置,其宽度和高度分别为110和50 (框的尺寸)。我调用redraw_label()函数强制使用新的边界框进行绘图。据我所知,新标签应该在盒子的左上角。

但实际上发生的是,新的标签确实是“新的”,但它的地位并没有改变。我在这里错过了什么?

这个问题是这个前一个问题的后续:我试图理解如何用默认字体更改标签的位置,然后尝试使用非标准字体自定义该位置。

EN

回答 2

Stack Overflow用户

发布于 2022-01-03 21:24:18

draw_label()方法的目的是要在draw()方法中使用。如果要基于回调触发绘图,这是对代码的修改:

代码语言:javascript
运行
复制
#include <FL/Enumerations.H>
#include <FL/Fl.H>
#include <FL/Fl_Box.H>
#include <FL/Fl_Button.H>
#include <FL/Fl_Window.H>
#include <FL/fl_draw.H>

class mBox : public Fl_Box {
    bool triggered = false;
public:
    mBox(int X, int Y, int W, int H, const char* l = 0)
        : Fl_Box(X, Y, W, H, l) {};

    void drawLabel() {
        triggered = true;
        label("New");
        
    };

    void draw() override {
        Fl_Box::draw();
        if (triggered) {
            fl_draw_box(box(), x(), y(), w(), h(), FL_BACKGROUND_COLOR);
            draw_label(x(), y(), 100, 25);
        }
    }
};

void action(Fl_Widget* w, void* data) {
    mBox* B = (mBox*)data;
    B->drawLabel();
}

int main(int argc, char** argv) {
    Fl_Window* G_win;
    G_win = new Fl_Window(180, 100, "The font test");

    mBox* A = new mBox(10, 10, 110, 50, "The font TEST.");
    A->box(FL_UP_BOX);

    Fl_Button* b = new Fl_Button(10, 70, 100, 25, "Test");
    b->callback(action, A);

    G_win->show();
    return (Fl::run());
}
票数 1
EN

Stack Overflow用户

发布于 2022-01-05 16:23:57

虽然前面的答案已经被接受了,但是我想分享一些想法和代码来回答文本对齐问题。如果您想精确地对齐文本,我建议直接使用fl_draw()绘制按需要对齐的框标签文本,而不是使用draw_label()。下面的代码在派生类的class()方法中执行此操作:

代码语言:javascript
运行
复制
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Box.H>
#include <FL/Fl_Button.H>
#include <FL/fl_draw.H>

class mBox : public Fl_Box {
public:
  mBox(int X, int Y, int W, int H, const char *l = 0)
    : Fl_Box(X, Y, W, H, l){};

  void draw() {
    draw_box();
    // arbitrary text position, change this as you need
    int xo = x() + 4;
    int yo = y() + h() * 2 / 3;
    // measure the text extents
    int dx = 0, dy = 0, tw = 0, th = 0;
    fl_font(labelfont(), labelsize());
    fl_text_extents(label(), dx, dy, tw, th);
    // draw the green base line
    fl_color(FL_GREEN);
    fl_xyline(xo, yo, xo + w() - 8);
    // draw the text aligned to the green base line
    fl_color(labelcolor());
    fl_draw(label(), x() + (w()-tw)/2, yo);
  }
};

void action(Fl_Widget *w, void *data) {
  mBox *B = (mBox *)data;
  B->label("New");
  B->redraw();
}

int main(int argc, char **argv) {
  Fl_Window *G_win;
  G_win = new Fl_Window(510, 150, "The font test");

  mBox *A1 = new mBox(10, 10, 240, 40, "Quick fox jumps over lazy dog.");
  A1->box(FL_UP_BOX);

  Fl_Box *A2 = new Fl_Box(260, 10, 240, 40, "Quick fox jumps over lazy dog.");
  A2->box(FL_UP_BOX);

  Fl_Button *b = new Fl_Button(10, 110, 100, 25, "Test");
  b->callback(action, A1);

  G_win->show();
  return (Fl::run());
}

我修改了回调以设置标签文本并调用redraw()。其他一切都是用draw()完成的。我还添加了一个标准的Fl_Box小部件来显示不同之处。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70567435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档