【问题标题】:C++ FLTK, creating a rounded boxC++ FLTK,创建一个圆角框
【发布时间】:2014-06-25 12:27:32
【问题描述】:

问题说: 画一个圆角的盒子。定义一个 Box 类,由四行四弧组成。 因此,我为该练习编写了以下代码:

#include <Simple_window.h>
Simple_window win(Point(100,100), 600,400, "semi-ellipse");

struct Box: Shape{

    Box(Point p, int ww, int hh): w(ww), h(hh) 
        { add(Point(p.x-ww,p.y-hh));  }

    void d_l() const        //creating 4 lines
     {
        Line hrz1 (Point(150,100), Point(400,100));
        Line hrz2 (Point(150,300), Point(400,300));
        Line ver1 (Point(507,150), Point(507,250));
        Line ver2 (Point(41,150), Point(41,250));

        win.attach(hrz1);
        win.attach(hrz2);
        win.attach(ver1);
        win.attach(ver2);
     }

    void draw_lines() const      //creating 4 arcs
    {
        fl_arc(point(0).x,point(0).y,w,h,30,90);
        fl_arc(point(0).x,point(0).y,w,h,270,330);
        fl_arc(point(0).x,point(0).y,w,h,90,150);
        fl_arc(point(0).x,point(0).y,w,h,210,270);
    }

private:
    int w;
    int h;
};

int main()
{
    using namespace Graph_lib; 

    Box b(Point(100,100),100,50);
    win.attach(b);
    win.wait_for_button();
}

当我运行它时,我遇到了这个异常:

test.exe 中 0x757FE9D7 (ole32.dll) 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000004。

我知道这是指在全局状态下声明 Simple_window win(Point(100,100), 600,400, "semi-ellipse");。但我这样做是因为我必须这样做。问题是如何在任一部分(main() 函数和 Box 结构)中将线和对象(此处为 b)附加到 Simple_window win。

【问题讨论】:

  • 没有那么多C++专家的回复!!?
  • 如果没有 Simple_window 源,我们根本无法帮助您。 Point 和 Shape 也是来自其他地方的类,而不是 FLTK。
  • 我知道你想做什么,但请稍候。我没有被要求阅读这些文件的来源!!!是的。我所接受的只是使用它们,所以我应该解决这个问题。我需要您阅读练习的上下文并检查我是否正确理解了问题,如果是,请提供您是否有任何其他解决方案。谢谢。
  • 建议您学习使用调试器并找出您的程序在哪里出错,或者至少告诉我们调用堆栈是什么样的,如果您看不懂的话。
  • 我的程序刚刚从 Simple window 行(代码的第二行)掉了下来。立方,不要走远,答案就在附近。如果你能告诉如何在两个主体(这里是 main() 和 Box 类)中使用 win,问题就解决了。就是这种情况。

标签: c++ fltk


【解决方案1】:

貌似是win的全局创建造成的。我从来没有运行过在 main 之前创建任何图形的 FLTK 程序,但我猜有时图形库需要一些东西,所以最好在 main 之后使用它们。

你能做些什么呢?如果 win 被声明为一个指针并在 main 内部而不是在 main 外部创建,那么你就不会崩溃。

...
Simple_window* win;
struct Box: Shape
{
  ...
   win->...
   ...
}


int main()
{
    win = new Simple_window(Point(100, 100), 600, 400, "semi-ellipse");
    Box b ...
    win->attach ...
    win->wait ...
    delete win;
}

【讨论】:

    【解决方案2】:

    您根本不需要在全局空间中放置任何东西。您希望将信息传递给需要它们的类,而不是在对它进行任何操作之前需要在全局范围内声明的所有内容。

    我在这里写的内容修改了您的Box 类,因此它还有一个私有成员变量,它是一个指向Simple_window 类的指针。构造函数已修改,因此当您构造 Box b 时,您必须向它发送一个指向将在其中绘制它的 Simple_window 的指针。当你这样做时,指针被分配指向然后声明的Simple_Window win。

    #include <Simple_window.h>
    
    
    struct Box: Shape{
    
    private:
        int w;
        int h;
        Simple_window* window;
    public:
    
        Box(Point p, int ww, int hh,Simple_window* win_): w(ww), h(hh),window(win_)
        { add(Point(p.x-ww,p.y-hh));  }
    
        void d_l() const        //creating 4 lines
        {
            Line hrz1 (Point(150,100), Point(400,100));
            Line hrz2 (Point(150,300), Point(400,300));
            Line ver1 (Point(507,150), Point(507,250));
            Line ver2 (Point(41,150), Point(41,250));
    
            window->attach(hrz1);
            window->attach(hrz2);
            window->attach(ver1);
            window->attach(ver2);
        }
    
        void draw_lines() const      //creating 4 arcs
        {
            fl_arc(point(0).x,point(0).y,w,h,30,90);
            fl_arc(point(0).x,point(0).y,w,h,270,330);
            fl_arc(point(0).x,point(0).y,w,h,90,150);
            fl_arc(point(0).x,point(0).y,w,h,210,270);
        }
    
    
    };
    
    int main()
    {
        using namespace Graph_lib;
        Simple_window* win = new Simple_window(Point(100,100), 600,400, "semi-ellipse");
        Box b(Point(100,100),100,50,win);
        win->attach(b);
        win->wait_for_button();
    }
    

    【讨论】:

      【解决方案3】:

      您的行是硬编码的,并且独立于构造函数参数。它们可以直接使用 FLTK 库绘制,与圆弧类似,并放置在继承自类 Shape 和覆盖函数 void draw_lines() const 中。那么你就不需要window对象是指针了。

      一个可能的实现是:

      Box::Box(Point p, int w, int h)
          : width(w), height(h)
      { 
          add(Point(p.x - w, p.y - h));
      }
      
      void Box::draw_lines() const
      {
          // draw lines with reduced length to adapt for the arcs
          if (color().visibility())
          {
              // upper horizontal
              fl_line(point(0).x + width/4, point(0).y, point(0).x + (3./4.) * width, point(0).y);
              // lower horizontal
              fl_line(point(0).x + width/4, point(0).y + height, point(0).x + (3./4.) * width, point(0).y + height);
              // left vertical 
              fl_line(point(0).x, point(0).y + height/4, point(0).x, point(0).y + (3./4.)*height);
              // right vertical 
              fl_line(point(0).x + width, point(0).y + height/4, point(0).x + width, point(0).y + (3./4.) * height);
          }
      
          // draw arcs
          if(color().visibility())
          { 
              fl_color(fill_color().as_int());
              // upper left arc
              fl_arc(point(0).x, point(0).y, width/2, height/2, 90, 180); 
              // upper right arc
              fl_arc(point(0).x + width/2, point(0).y, width/2, height/2, 0, 90);
              // down right arc
              fl_arc(point(0).x + width/2, point(0).y + height/2, width/2, height/2, 270, 0); 
              // down left arc
              fl_arc(point(0).x , point(0).y + height/2, width/2, height/2, 180, 270); 
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-03-08
        • 2015-05-06
        • 2011-08-10
        • 1970-01-01
        • 2011-06-08
        • 2021-11-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多