form_loader
使用 wvl::form_loader 是一个启动一个窗体的方法,例如
wvl::form_loader<wvl::form>()();
为什么必须给WVL引入 form_loader 呢?
如果我想在一个函数中启动一个窗口,如下代码
void show_window()
{
wvl::form a;
a.show();
}
实际上,这段代码毫无用处,因为局部对象会在函数结束时销毁,并且这个窗口也将立即被销毁。那好吧,我们用另外一个方法来创建窗口。看看下面代码
void show_window()
{
wvl::form *p = new form;
p->show();
}
这次,窗口在函数退出时就不会被销毁了,但是这个方法带来了一个新的问题,就是由指针p引用的对象将不会被销毁,这将引起内存泄露。
wvl::form_loader 可以解决这个问题。
void show_window()
{
wvl::form_loader<wvl::form>()();
//为什么它有两个括号?因为它是一个函数对象。
}
实际上, wvl::form_loader 同样是将对象创建在堆上,不同的是,用户将不会被内存管理问题缠绕,并且用这个来加载的窗体当被用户关闭时这个对象会被自动地销毁,这样就避免了内存泄露
wvl::form_loader 可以启动一个模式对话框。例如
void show_window()
{
wvl::form_loader<wvl::form>()(parent_form, true);
}
虽然 wvl::form_loader 可以启动一个模式对话框,但是不推崇这种方法。如果你想创建一个模式对话框,你可以这样做
void show_window()
{
wvl::form a;
a.show_dialog();
}
通过 wvl::form_loader ,我如何给这个窗口对象在创建时传递必要的参数呢? 考虑下面的这个类。
class Form: public
wvl::form
{
public:
Form(int a, int b):a_(a),
b_(b){};
private:
int a_;
int b_;
};
这里有两个参数,如果你想给这个窗口的初始化传递两个参数,那么我们就不得不重新设计这个窗口类
struct argument
{
int a;
int b;
};
class Form: public
wvl::form
{
public:
Form(const arguments& arg): a_(arg.a),
b_(arg.b){}
private:
int a_;
int b_;
};
void show_window()
{
argument arg;
arg.a = 10;
arg.b = 50;
wvl::form_loader<wvl::Form>()(arg, parent_form);
}