更新窗口的标志

时间:2015-07-13 14:43:05

标签: c++ linux xlib

大家早上好!我试图设置和(稍后)删除C ++窗口的标志。无论我尝试做什么,我都会继续遇到编译错误,无法弄明白。以下是该对象的相关位:

enum {
    NO_FOCUS        = 0x0001,
    CLICK_TO_FOCUS      = 0x0002,
    NO_BORDER       = 0x0004,
 ...
}

class Frame : public Fl_Window {
    int flags_;
    void set_flag(int i) {flags_ |= i;}
    void clear_flag(int i) {flags_&=~i;}
    int flags() const {return flags_;}
    int flag(int i) const {return flags_&i;}
 ...
}

我正在尝试从另一个函数调整标志值:

void ShowWindow() {
 Display* d = fl_display;
 XWindow w = XCreateSimpleWindow(d, RootWindow(d, fl_screen),
        0, 0,
  100, 200,
        0,
        0x000000,
        0x000000);

    Frame* frame = new Frame(w);
 //frame.flags |= NO_BORDER;
 //frame->flags() |= NO_BORDER;
 frame->flags(NO_BORDER);
}

我尝试过除上述注释部分以外的其他方式,但无论我尝试什么,我都会继续遇到编译错误。任何帮助将不胜感激!

谢谢, 戴夫

更新:

根据提供的信息,我已将set_flag()函数设为public,但未获得所需的结果。项目中的另一个函数在绘制窗口之前检查标志的值:

void Frame::updateBorder() {
 ...

    if (flag(NO_BORDER)) { ... }
 else { ... }
}

但是当我在外部设置标志时,它似乎没有被触发。添加一些调试printf语句后,我可以看到窗口正在绘制之前可以设置标志。我怎么解决这个问题?我是否必须做以下事情:

Frame*->set_flag(NO_BORDER);
Frame* frame = new Frame(w);

Frame* frame;
frame->set_flag(NO_BORDER);
frame = new Frame(w);

我可以用后者编译程序,但是仍然没有发生预期的效果。如何在绘制窗口之前设置标志?

1 个答案:

答案 0 :(得分:0)

您需要在班级的某个部分之前public:才能从课堂外访问。

请注意,你不应该将flags_公开,所以你不应该使这个表格可用:

frame.flags_ |= NO_BORDER;

和没有下划线的标志是一个函数,所以您尝试的以下内容是非常错误的:

frame.flags |= NO_BORDER;

您将flags()定义为非常只读,因此即使您公开标记,也无法执行:

frame->flags() |= NO_BORDER;

将类的正确部分公开后,您应该按照定义使用它:

frame->set_flag( NO_BORDER );