GUI库:使本机应用程序具备Windows窗体的简易性
2010-10-15 09:07:42 来源:Web开发网此代码不言而喻;mul_str 通过将字符串转换成双精度型并将其与转换率相乘,使双精度型与字符串相乘。
要像上面那样处理事件,我必须做大量工作。假设您拥有一个具有三个编辑框的窗体。其中每个编辑框都将生成某一组事件。对于每个这样的事件(例如,on_change),我可以为每个控件生成一个可覆盖的函数
void on_change(edit::ev::change& e, ctrlname_);
或者只生成一个可覆盖的函数:
void on_change(edit::ev::change& e);
我更喜欢前一种解决方案 — 客户端代码比较简单(与 Visual Basic 方法更加类似)。您可以轻松地看到处理的内容(后一种解决方案与其不同,在事件的实施过程中,您必须手动查询通过 e.sender 生成事件的控件)。
这就是我实施第一种解决方案的原因。但是,实际上这其中也包含大量工作。eGUI++ 会监视资源编辑器。当添加新的控件或重命名控件时,会更新所有 <dlgname>_form_resource.h 文件。请注意,对于 form_resource::<dlgname> 类中的每个 <dlgname>_form_resource.h 文件,您必须从现有控件覆盖所有通知,而对于每个这样的已覆盖通知,则查找可以发送它的控件。下一步是生成将转发到每个控件的另一个可覆盖函数的实现。例如,图 10 显示了适用于具有两个编辑框和两个按钮的登录窗体的代码。
图 10 登录窗体代码
struct form_resource::login {
wnd<edit> name;
wnd<edit> passw;
wnd<button> ok, cancel;
typedef ... ok_;
typedef ... cancel_;
typedef ... name_;
typedef ... passw_;
virtual void on_change(edit::ev::change& e, name__) {}
virtual void on_change(edit::ev::change& e, passw__) {}
virtual void on_change(edit::ev::change& e) {
if ( e.sender == name) on_change(e, name__());
else if ( e.sender == passw) on_change(e, passw__());
}
// ... same for other edit notifications
virtual void on_click(button::ev::click & e, ok__) {}
virtual void on_click(button::ev::click & e, cancel__) {}
virtual void on_click(button::ev::click & e) {
if ( e.sender == ok) on_click(e, ok__());
else if ( e.sender == cancel) on_click(e, cancel__() );
}
// ... same for other button notifications
};
最后,您可以通过从 new_event<> 派生事件来创建自己的事件。无论您是发送现有事件还是您自己的事件,过程是相同的:使用 send_event 函数:
struct hover : new_event<hover> {
int x,y; // position
hover(int x,int y) : x(x),y(y) {}
};
w->send_event( hover(x,y) );
此库是线程安全的。另外,每个窗口都具有 m_cs 互斥变量(基本上是 CRITICAL_SECTION),我用该变量来确保每个方法访问都是线程安全的。在扩展窗口类时,您可以重用 m_cs 变量或创建自己的变量 — 这由您决定。
更多精彩
赞助商链接