Fl_Copy_Surface 不在窗口中绘制

问题描述 投票:0回答:1

我将黑色方块放在窗户上,但窗户没有变黑:

#include <FL/Enumerations.H>
#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Copy_Surface.H>
#include <FL/fl_draw.H>

int main()
{
    Fl_Window* window = new Fl_Window(500, 500, "FLTK Test");
    
    Fl_Copy_Surface *copy_surf = new Fl_Copy_Surface(window->w(), window->h()); // create an Fl_Copy_Surface object
    copy_surf->set_current(); // direct windowraphics requests to the clipboard
    fl_rectf(0, 0, window->w(), window->h(), FL_BLACK); // draw a white backwindowround
    copy_surf->draw(window); // draw the window widwindowet in the clipboard
    delete copy_surf; // after this, the clipboard is loaded
    Fl_Display_Device::display_device()->set_current();  // direct windowraphics requests back to the display

    window->end();
    window->show();
    return Fl::run();
}

我做错了什么?

c++ fltk
1个回答
0
投票

这个问题已经有 4 个月了,但无论如何,以防万一其他人寻找解决方案:

  1. Fl_Copy_Surface
    是绘制离屏图像以供其他小部件使用的错误类型。
  2. copy_surf->draw(window);
    会将
    window
    的内容绘制到
    copy_surf
    上,但窗口是空的。

执行 OP 想要的操作 (AFAICT) 的正确方法是使用

Fl_Image_Surface
进行离屏绘图,并从该表面获取生成的图像以供以后使用。 以下代码执行此操作,并且适用于 FLTK 1.3(使用 1.3.9/git 测试)和 1.4.0(截至今天的 git 'master' 分支)。

建议使用“FLTK 1.4 方式”,但在 1.3.x 中不可用,因此下面的代码中存在区别。

#include <FL/Fl.H>
#include <FL/Fl_Window.H>
#include <FL/Fl_Image_Surface.H>
#include <FL/Fl_Box.H>
#include <FL/fl_draw.H>
#include <stdio.h> // printf()

#define FLTK_14 10400 // FLTK 1.4.0 API version

int main() {
    int WW = 500, WH = 500;
    // create an Fl_Image_Surface object
    Fl_Image_Surface *surface = new Fl_Image_Surface(WW-80, WH-80);
    // draw something into the image surface
#if (FL_API_VERSION >= FLTK_14)                         // FLTK 1.4
    printf("Using FLTK 1.4.0 or higher (FL_API_VERSION = %d)\n",
            FL_API_VERSION);
    Fl_Surface_Device::push_current(surface);
    fl_rectf(0, 0, WW-80, WH-80, FL_BLACK);             // draw a black rectangle
    Fl_Surface_Device::pop_current();
    const char *group_label = "Fl_Group with black image below:";
#else
    printf("Using the FLTK 1.3.x way (FL_API_VERSION = %d)\n",
            FL_API_VERSION);
    surface->set_current();                             // FLTK 1.3
    fl_rectf(0, 0, WW-80, WH-80, FL_BLUE);              // draw a blue rectangle
    Fl_Display_Device::display_device()->set_current(); // FLTK 1.3
    const char *group_label = "Fl_Group with blue image below:";
#endif
    // get the image from the surface
    Fl_Image *img = surface->image();
    delete surface; // no longer needed
    if (!img) {
        printf("Image could not be created.\n");
        return 1;
    }
    printf("Image (w, h, d, ld) = %d, %d, %d, %d\n",
            img->w(), img->h(), img->d(), img->ld());

    // Create the GUI as usual, using the image as background of an Fl_Group

    Fl_Window* window = new Fl_Window(WW, WH, "FLTK Fl_Image_Surface Test");
    window->color(0xcce0ff); // light blue
    Fl_Group* g = new Fl_Group(10, 10, WW-20, WH-20, group_label);
    g->box(FL_FLAT_BOX);
    g->color(FL_GREEN);
    g->image(img);
    g->align(FL_ALIGN_TOP | FL_ALIGN_INSIDE | FL_ALIGN_IMAGE_BACKDROP);
    Fl_Box* box = new Fl_Box(150, 150, 200, 100, "Box inside Fl_Group");
    box->box(FL_UP_BOX);
    box->color(FL_YELLOW);
    g->end();
    window->end();
    window->show();
    return Fl::run();
}

注意:图像

img
可以有多种使用方式。我选择将其设置为
Fl_Group
小部件的背景图像。所选颜色旨在查看不同的小部件、图像及其各自的尺寸。示例代码变得比必要的要长一些。第一部分创建图像,第二部分将其设置为组 g 的背景图像。

© www.soinside.com 2019 - 2024. All rights reserved.