wxWidgets自定义按钮的方法
更新时间:2020年4月25日 17:26 点击:1858
场景:
1.现在的软件上的按钮都不是标准的按钮了,因为基本上是贴图上去的,正常情况下一种图片,鼠标移上去之后按钮显示另一种效果,按下去之后又是另一种效果。
2.wx的做法其实和mfc的按钮原理是一样的,就是给按钮贴图和重绘背景。
以下是源文件.
dh_bitmap_button.h
/* * File: dh_bitmap_button.h * Author: Sai * * Created on 2009年12月29日, 下午4:08 */ #ifndef _DH_BITMAP_BUTTON_H #define _DH_BITMAP_BUTTON_H #include "wx/wx.h" enum DhBitmapButtonStatus { kDhBitmapButtonNormal, kDhBitmapButtonEnter, kDhBitmapButtonDown, kDhBitmapButtonUp, kDhBitmapButtonLeave, kDhBitmapButtonDClick, kDhBitmapButtonDisable }; class DhBitmapButton : public wxControl { DECLARE_DYNAMIC_CLASS(DhBitmapButton) DECLARE_EVENT_TABLE() public: DhBitmapButton(); virtual ~DhBitmapButton(); DhBitmapButton(wxWindow* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxBORDER_NONE, const wxValidator& validator = wxDefaultValidator); bool Create(wxWindow* parent, wxWindowID id, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxDefaultSize, long style = wxSUNKEN_BORDER, const wxValidator& validator = wxDefaultValidator); wxSize DoGetBestSize() const; void OnPaint(wxPaintEvent& event); virtual void OnEnter(wxMouseEvent& event); virtual void OnLeave(wxMouseEvent& event); virtual void OnDown(wxMouseEvent& event); virtual void OnDClick(wxMouseEvent& event); virtual void OnUp(wxMouseEvent& event); virtual bool Enable(bool enable = true); virtual bool Disable(); /** * 设置正常图片 * * @param bitmap */ DhBitmapButton* set_normal_bitmap(wxBitmap* bitmap); /** * 1.设置按钮按下时的切换图片 */ DhBitmapButton* set_down_bitmap(wxBitmap* bitmap); /** * 1.设置按钮按经过时的切换图片 */ DhBitmapButton* set_enter_bitmap(wxBitmap* bitmap); /** * 1.设置Disable图片. * * @param bitmap * @return this */ DhBitmapButton* set_disable_bitmap(wxBitmap* bitmap); DhBitmapButton* set_background(const wxBitmap& bitmap); bool SetBackgroundColour(const wxColour& colour); protected: void DrawExistBitmap(wxDC* dc,wxBitmap* image1,wxBitmap* exist_image); private: wxBitmap background_; bool is_used_bg_; wxBitmap* normal_bitmap_; wxBitmap* down_bitmap_; wxBitmap* enter_bitmap_; wxBitmap* disable_bitmap_; int button_status_; wxString text_; wxFont text_font_; void DrawBackground(wxDC* dc); }; #endif /* _DH_BITMAP_BUTTON_H */
dh_bitmap_button.cpp
/* * File: DhBitmapButton.cpp * Author: Sai * * Created on 2009年12月29日, 下午4:08 */ #include "dh_bitmap_button.h" BEGIN_EVENT_TABLE(DhBitmapButton, wxControl) EVT_PAINT(DhBitmapButton::OnPaint) EVT_ENTER_WINDOW(DhBitmapButton::OnEnter) EVT_LEAVE_WINDOW(DhBitmapButton::OnLeave) EVT_LEFT_DOWN(DhBitmapButton::OnDown) EVT_LEFT_DCLICK(DhBitmapButton::OnDClick) EVT_LEFT_UP(DhBitmapButton::OnUp) END_EVENT_TABLE() IMPLEMENT_DYNAMIC_CLASS(DhBitmapButton, wxControl) DhBitmapButton::DhBitmapButton() { } DhBitmapButton::DhBitmapButton(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator) : normal_bitmap_(NULL), down_bitmap_(NULL), enter_bitmap_(NULL) { Create(parent, id, pos, size, style, validator); } DhBitmapButton::~DhBitmapButton() { wxDELETE(normal_bitmap_); wxDELETE(enter_bitmap_); wxDELETE(down_bitmap_); } bool DhBitmapButton::Create(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxValidator& validator) { normal_bitmap_ = NULL; down_bitmap_ = NULL; enter_bitmap_ = NULL; disable_bitmap_ = NULL; if (!wxControl::Create(parent, id, pos, size, style, validator)) { return false; } SetBackgroundStyle(wxBG_STYLE_PAINT); is_used_bg_ = false; return true; } wxSize DhBitmapButton::DoGetBestSize() const { return GetSize(); } void DhBitmapButton::DrawExistBitmap(wxDC* dc, wxBitmap* image1, wxBitmap* exist_image) { if (image1) { dc->DrawBitmap(*image1, 0, 0, true); } else { dc->DrawBitmap(*exist_image, 0, 0, true); } } void DhBitmapButton::OnPaint(wxPaintEvent& event) { wxPaintDC dc(this); DrawBackground(&dc); //1.状态控制绘画,好处就是可以调用Refresh连背景一起刷新. switch (button_status_) { case kDhBitmapButtonNormal: dc.DrawBitmap(*normal_bitmap_, 0, 0, true); break; case kDhBitmapButtonEnter: if (!enter_bitmap_) { int width = DoGetBestSize().GetWidth(); int height = DoGetBestSize().GetHeight(); wxClientDC dc(this); dc.SetPen(*wxRED_PEN); dc.SetBrush(*wxTRANSPARENT_BRUSH); dc.DrawRectangle(0, 0, width, height); break; } dc.DrawBitmap(*enter_bitmap_, 0, 0, true); break; case kDhBitmapButtonDown: DrawExistBitmap(&dc,down_bitmap_,normal_bitmap_); break; case kDhBitmapButtonUp: dc.DrawBitmap(*normal_bitmap_, 0, 0, true); break; case kDhBitmapButtonLeave: dc.DrawBitmap(*normal_bitmap_, 0, 0, true); break; case kDhBitmapButtonDClick: DrawExistBitmap(&dc,down_bitmap_,normal_bitmap_); break; case kDhBitmapButtonDisable: DrawExistBitmap(&dc,disable_bitmap_,normal_bitmap_); break; default: dc.DrawBitmap(*normal_bitmap_, 0, 0, true); break; } } void DhBitmapButton::DrawBackground(wxDC* dc) { if (is_used_bg_) { dc->DrawBitmap(background_, 0, 0, true); } else { wxBrush brush(GetBackgroundColour()); wxPen pen(GetBackgroundColour()); dc->SetBrush(brush); dc->SetPen(pen); dc->DrawRectangle(0, 0, GetSize().x, GetSize().y); } } void DhBitmapButton::OnEnter(wxMouseEvent& event) { button_status_ = kDhBitmapButtonEnter; Refresh(); Update(); } void DhBitmapButton::OnLeave(wxMouseEvent& event) { if (!IsEnabled()) { return; } button_status_ = kDhBitmapButtonLeave; Refresh(); Update(); } void DhBitmapButton::OnDClick(wxMouseEvent& event) { button_status_ = kDhBitmapButtonDown; Refresh(false); Update(); } void DhBitmapButton::OnDown(wxMouseEvent& event) { button_status_ = kDhBitmapButtonDown; Refresh(); Update(); } void DhBitmapButton::OnUp(wxMouseEvent& event) { if (kDhBitmapButtonDown != button_status_) { return; } button_status_ = kDhBitmapButtonUp; Refresh(); Update(); wxCommandEvent myEvent(wxEVT_COMMAND_BUTTON_CLICKED, GetId()); myEvent.SetEventObject(this); GetEventHandler()->ProcessEvent(myEvent); } DhBitmapButton* DhBitmapButton::set_normal_bitmap(wxBitmap* bitmap) { normal_bitmap_ = bitmap; return this; } DhBitmapButton* DhBitmapButton::set_down_bitmap(wxBitmap* bitmap) { down_bitmap_ = bitmap; return this; } DhBitmapButton* DhBitmapButton::set_enter_bitmap(wxBitmap* bitmap) { enter_bitmap_ = bitmap; return this; } bool DhBitmapButton::Enable(bool enable) { if (enable) { button_status_ = kDhBitmapButtonNormal; } else { button_status_ = kDhBitmapButtonDisable; } Refresh(false); Update(); return wxControl::Enable(enable); } bool DhBitmapButton::Disable() { return Enable(false); } DhBitmapButton* DhBitmapButton::set_disable_bitmap(wxBitmap* bitmap) { disable_bitmap_ = bitmap; return this; } DhBitmapButton* DhBitmapButton::set_background(const wxBitmap& bitmap) { is_used_bg_ = true; background_ = bitmap; return this; } bool DhBitmapButton::SetBackgroundColour(const wxColour& colour) { is_used_bg_ = false; return wxControl::SetBackgroundColour(colour); }
调用方式和wxButton一样.
1.先注册事件映射宏.
EVT_BUTTON(Minimal_StartSimplePopup, MyFrame::OnStartSimplePopup)
2.调用代码.
wxBitmap* normal = new wxBitmap("./resources/start/start_normal.png", wxBITMAP_TYPE_PNG); wxBitmap* down = new wxBitmap("./resources/start/start_pressed.png", wxBITMAP_TYPE_PNG); wxBitmap* enter = new wxBitmap("./resources/start/start_current.png", wxBITMAP_TYPE_PNG); wxBitmap* disable = new wxBitmap("./resources/start/stop_normal.png", wxBITMAP_TYPE_PNG); wxBitmap bg = GetPositionBackgroundBitmap(0,0,normal->GetWidth(),normal->GetHeight()); start = new DhBitmapButton(page,Minimal_StartSimplePopup,wxPoint(0,0), normal->GetSize()); start->set_normal_bitmap(normal)->set_down_bitmap(down)->set_enter_bitmap(enter); start->set_disable_bitmap(disable); start->set_background(bg); wxBitmap MyFrame::GetPositionBackgroundBitmap(int x, int y, int width,int height) { wxRect rect; rect.x = x; rect.y = y; rect.width = width; rect.height = height; wxBitmap temp = this->bg.GetSubBitmap(rect); return temp; }
3.当然我觉得有更好的方式.
比如重载这个类.wxBit
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。
上一篇: 代码讲解C++继承和派生
相关文章
- 下面小编就为大家带来一篇利用JS实现点击按钮后图片自动切换的简单方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-10-25
- 这篇文章主要为大家详细解析了BootStrap栅格系统、表单样式与按钮样式源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2017-01-23
- 这篇文章主要介绍了C#使用浏览按钮获得文件路径和文件夹路径的方法,结合实例形式分析了C#浏览器事件响应及文件操作相关技巧,需要的朋友可以参考下...2020-06-25
- 这篇文章主要为大家介绍了python编程使用PyQt5如何创建按钮及触发点击事件的示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步...2021-10-29
- 在淘宝等购物网站,我们都会看到一个发送短信倒计时的按钮,究竟是如何实现的呢?下面小编通过本篇文章给大家分享一段代码关于js实现手机短信按钮倒计时,需要的朋友参考下...2016-01-02
- 这篇文章主要为大家详细介绍了jquery mobile实现可折叠的导航按钮,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2017-03-13
- 这篇文章主要介绍了微信小程序将页面按钮悬浮固定在底部的实现代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-10-29
- javascript代码判断按钮是否被点击了在项目中经常会遇到这个需求,今天小编抽点时间给大家分享一段代码关于javascript判断按钮是否被点击的方法,感兴趣的朋友一起学习吧...2015-12-14
- 这篇文章主要介绍了javascript+css3 实现动态按钮菜单特效的相关资料,需要的朋友可以参考下...2016-02-12
- 下面小编就为大家带来一篇JS判断键盘是否按的回车键并触发指定按钮点击操作的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2017-02-19
- 这篇文章主要为大家详细介绍了vue实现自定义多选按钮,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-07-16
- 这篇文章主要介绍了如何在.Net版本UEditor中添加一个普通按钮,需要的朋友可以参考下...2021-09-22
- 这篇文章主要介绍了Angular2搜索和重置按钮过场动画,需要的朋友可以参考下...2017-05-27
- 本文给大家分享一段JS实例代码介绍动态创建按钮的方法,需要的朋友参考下本文...2016-02-01
- 这篇文章主要介绍了C#动态生成按钮及定义按钮事件的方法,涉及C#按钮操作的相关技巧,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了Unity 按钮添加OnClick事件操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-10
- 这是关于c#重写TabControl控件实现关闭按钮的例子,整理了一下,与大家分享。...2020-06-25
Flutter悬浮按钮FloatingActionButton使用详解
本文主要介绍了Flutter悬浮按钮FloatingActionButton使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-07-12- 关于利用ps制作非常精致的蓝色水晶按钮的教程小编在几年前就介绍过许多的相关教程了,今天我们一起再来看一篇水晶按钮制作效果吧。 最终效果 1、打开Adobe Photos...2016-09-14
- 这篇文章主要介绍了winform去掉右上角关闭按钮的方法,需要的朋友可以参考下...2020-06-25