24,855
社区成员
发帖
与我相关
我的任务
分享
template<typename DrawerTrigger>
class basic_button: public widget_object<category::widget_tag>
{
public:
basic_button(){}
basic_button(nana::gui::widget& widget, int x, int y, unsigned width, unsigned height)
{
this->create(widget.handle(), x, y, width, height);
}
private:
drawer_trigger* get_drawer_trigger() //Important
{
btn_drawer_.set(*this);
return &btn_drawer_;
}
private:
DrawerTrigger btn_drawer_;
};
template<typename DrawerTrigger>
drawer_trigger* get_drawer_trigger()
{
btn_drawer_.set(*this);
return &btn_drawer_;
}
class button_drawer: public nana::gui::drawer_trigger
{
public:
button_trigger();
void set(nana::gui::widget&);
private:
void attached(paint::graphics&);
void detached();
void normal(paint::graphics&);
void mouse_leave(paint::graphics&, const eventinfo&);
void mouse_down(paint::graphics&, const eventinfo&);
void mouse_up(paint::graphics&, const eventinfo&);
void focus(paint::graphics&, const eventinfo&);
private:
void _m_draw_title(paint::graphics&, bool is_mouse_down, bool is_focus);
void _m_draw_background(paint::graphics&, bool is_mouse_down);
void _m_draw_border(paint::graphics&, bool is_mouse_down);
private:
nana::gui::widget* widget_;
bool is_ms_down_;
bool is_focus_;
};
button_drawer::button_drawer()
:widget_(0), is_ms_down_(false), is_focus_(false)
{}
void button_drawer::set(nana::gui::widget& widget)
{
if(widget_ == 0) widget_ = &widget;
}
void button_drawer::attached(nana::paint::graphics&)
{
using namespace nana::gui::API;
is_ms_down_ = false;
nana::gui::window window = widget_->handle();
make_drawer_event<events::mouse_leave>(window);
make_drawer_event<events::mouse_down>(window);
make_drawer_event<events::mouse_up>(window);
make_drawer_event<events::focus>(window);
}
void button_drawer::detached()
{
nana::gui::API::unregister_drawer_event(widget_->handle());
}
void button_drawer::normal(paint::graphics& ghc)
{
_m_draw_background(ghc, is_ms_down_);
_m_draw_border(ghc, is_ms_down_);
_m_draw_title(ghc, is_ms_down_, is_focus);
}
void button_drawer::mouse_leave(paint::graphics& ghc, const eventinfo&)
{
_m_draw_background(ghc, false);
_m_draw_border(ghc, false);
_m_draw_title(ghc, false, is_focus_);
nana::gui::API::lazy_refresh();
}