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);
我可以用后者编译程序,但是仍然没有发生预期的效果。如何在绘制窗口之前设置标志?
答案 0 :(得分:0)
您需要在班级的某个部分之前public:
才能从课堂外访问。
请注意,你不应该将flags_公开,所以你不应该使这个表格可用:
frame.flags_ |= NO_BORDER;
和没有下划线的标志是一个函数,所以您尝试的以下内容是非常错误的:
frame.flags |= NO_BORDER;
您将flags()定义为非常只读,因此即使您公开标记,也无法执行:
frame->flags() |= NO_BORDER;
将类的正确部分公开后,您应该按照定义使用它:
frame->set_flag( NO_BORDER );