wxWidgets实现图片和文件按钮
更新时间:2020年4月25日 17:26 点击:1749
在wxWidgets中,想要通过其本身的控件来实现图片+文件的按钮,貌似不太容易做到。但是可以通过重载wxControl来自绘图片+文件按钮。下面给出的是已经封装好的按钮类:
wxBitmapButtonEx.h
#ifndef _BITMAP_BUTTON_EX_H #define _BITMAP_BUTTON_EX_H #include "wx/wx.h" enum eBitmapButtonStatus { BitmapButtonNormal, BitmapButtonEnter, BitmapButtonDown, BitmapButtonUp, BitmapButtonLeave, BitmapButtonDClick, BitmapButtonDisable }; class wxBitmapButtonEx : public wxControl { DECLARE_DYNAMIC_CLASS(wxBitmapButtonEx) DECLARE_EVENT_TABLE() public: wxBitmapButtonEx(); virtual ~wxBitmapButtonEx(); wxBitmapButtonEx(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(); //设置正常图片 wxBitmapButtonEx* set_normal_bitmap(wxBitmap* bitmap); //设置按钮按下时的切换图片 wxBitmapButtonEx* set_down_bitmap(wxBitmap* bitmap); //设置按钮按经过时的切换图片 wxBitmapButtonEx* set_enter_bitmap(wxBitmap* bitmap); //设置Disable图片. wxBitmapButtonEx* set_disable_bitmap(wxBitmap* bitmap); //设置背景图片 wxBitmapButtonEx* set_background(const wxBitmap& bitmap); //设置背景颜色 bool set_background_colour(const wxColour& colour); //设置按钮文字 void set_button_text(wxString str); //设置文字字体 void set_text_font(wxFont font); protected: void DrawExistBitmap(wxDC* dc,wxBitmap* image1,wxBitmap* exist_image); private: wxBitmap background_bitmap; 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 /* _BITMAP_BUTTON_EX_H */
wxBitmapButtonEx.cpp
#include "wxBitmapButtonEx.h" #include <wx/settings.h> BEGIN_EVENT_TABLE(wxBitmapButtonEx, wxControl) EVT_PAINT(wxBitmapButtonEx::OnPaint) EVT_ENTER_WINDOW(wxBitmapButtonEx::OnEnter) EVT_LEAVE_WINDOW(wxBitmapButtonEx::OnLeave) EVT_LEFT_DOWN(wxBitmapButtonEx::OnDown) EVT_LEFT_DCLICK(wxBitmapButtonEx::OnDClick) EVT_LEFT_UP(wxBitmapButtonEx::OnUp) END_EVENT_TABLE() IMPLEMENT_DYNAMIC_CLASS(wxBitmapButtonEx, wxControl) wxBitmapButtonEx::wxBitmapButtonEx() { } wxBitmapButtonEx::wxBitmapButtonEx(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); } wxBitmapButtonEx::~wxBitmapButtonEx() { wxDELETE(normal_bitmap); wxDELETE(enter_bitmap); wxDELETE(down_bitmap); } bool wxBitmapButtonEx::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; button_status = BitmapButtonNormal; if (!wxControl::Create(parent, id, pos, size, style, validator)) { return false; } SetBackgroundStyle(wxBG_STYLE_SYSTEM); is_used_bg = false; text_font.Create(12,wxSWISS,wxFONTSTYLE_NORMAL,wxNORMAL,false,_T("System"),wxFONTENCODING_DEFAULT); return true; } wxSize wxBitmapButtonEx::DoGetBestSize() const { return GetSize(); } void wxBitmapButtonEx::DrawExistBitmap(wxDC* dc, wxBitmap* image1, wxBitmap* exist_image) { int width = DoGetBestSize().GetWidth(); int height = DoGetBestSize().GetHeight(); //wxClientDC dc(this); dc->SetPen(*wxBLACK_PEN); wxColour clr(2,18,245); dc->SetTextForeground(*wxWHITE); //dc->SetBrush(*wxTRANSPARENT_BRUSH); //dc->SetBrush(*wxBLUE_BRUSH); //wxSystemSettings::GetColour(wxSYS_COLOUR_ACTIVECAPTION) wxBrush brush(clr);// dc->SetBrush(brush); dc->DrawRectangle(0, 0, width, height); /*wxRect rc = wxRect(0, 0, width, height); dc->DrawRoundedRectangle(rc,5);*/ int x = normal_bitmap->GetWidth(); int y = (height-normal_bitmap->GetHeight())/2.0; if (image1) { dc->DrawBitmap(*image1, width-x-5, y, true); //dc->DrawBitmap(*image1, 0, 0, true); } else { dc->DrawBitmap(*exist_image, width-x-5, y, true); //dc->DrawBitmap(*exist_image, 0, 0, true); } if (text.IsEmpty()) { return; } if (!text_font.IsNull()) { dc->SetFont(text_font); } int pointsize = text_font.GetPointSize(); //dc.SetLayoutDirection(wxLayout_Default); int bit = text.Find('\n'); if (bit!=-1) { wxString str; str = text.Left(bit); dc->DrawText(str,5,height/2-pointsize-2); int length = text.Length(); str = text.Mid(bit+1,length-bit-1); dc->DrawText(str,5,height/2); } else { dc->DrawText(text,5,height/2-7); } } void wxBitmapButtonEx::OnPaint(wxPaintEvent& event) { wxPaintDC dc(this); DrawBackground(&dc); //1.状态控制绘画,好处就是可以调用Refresh连背景一起刷新. switch (button_status) { case BitmapButtonNormal: case BitmapButtonUp: case BitmapButtonLeave: { int width = DoGetBestSize().GetWidth(); int height = DoGetBestSize().GetHeight(); wxClientDC dc(this); dc.SetPen(*wxGREY_PEN); dc.SetBrush(*wxTRANSPARENT_BRUSH); dc.DrawRectangle(0, 0, width, height); /*wxRect rc = wxRect(0, 0, width, height); dc.DrawRoundedRectangle(rc,5);*/ wxPoint pt[3]; pt[0].x = 1; pt[0].y = height-1; pt[1].x = pt[1].y = 1; pt[2].x = width-1; pt[2].y = 1; dc.SetPen(*wxWHITE_PEN); dc.DrawLines(3,pt); pt[1].x = width-1; pt[1].y = height-1; dc.SetPen(*wxBLACK_PEN); dc.DrawLines(3,pt); int x = normal_bitmap->GetWidth(); int y = (height-normal_bitmap->GetHeight())/2.0; dc.DrawBitmap(*normal_bitmap, width-x-5, y, true); if (!text_font.IsNull()) { dc.SetFont(text_font); } int pointsize = text_font.GetPointSize(); //dc.SetLayoutDirection(wxLayout_Default); int bit = text.Find('\n'); if (bit!=-1) { wxString str; str = text.Left(bit); dc.DrawText(str,5,height/2-pointsize-2); int length = text.Length(); str = text.Mid(bit+1,length-bit-1); dc.DrawText(str,5,height/2); } else { dc.DrawText(text,5,height/2-7); } } //dc.DrawBitmap(*normal_bitmap, 0, 0, true); break; case BitmapButtonEnter: // 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); //wxRect rc = wxRect(0, 0, width, height); //dc.DrawRoundedRectangle(rc,5); // // break; // } // dc.DrawBitmap(*enter_bitmap_, 0, 0, true); break; case BitmapButtonDown: DrawExistBitmap(&dc,down_bitmap,normal_bitmap); break; case BitmapButtonDClick: //DrawExistBitmap(&dc,down_bitmap,normal_bitmap); break; case BitmapButtonDisable: //DrawExistBitmap(&dc,disable_bitmap,normal_bitmap); break; default: { int width = DoGetBestSize().GetWidth(); int height = DoGetBestSize().GetHeight(); wxClientDC dc(this); dc.SetPen(*wxGREY_PEN); dc.SetBrush(*wxTRANSPARENT_BRUSH); dc.DrawRectangle(0, 0, width, height); /*wxRect rc = wxRect(0, 0, width, height); dc.DrawRoundedRectangle(rc,5);*/ wxPoint pt[3]; pt[0].x = 1; pt[0].y = height-1; pt[1].x = pt[1].y = 1; pt[2].x = width-1; pt[2].y = 1; dc.SetPen(*wxWHITE_PEN); dc.DrawLines(3,pt); pt[1].x = width-1; pt[1].y = height-1; dc.SetPen(*wxBLACK_PEN); dc.DrawLines(3,pt); int x = normal_bitmap->GetWidth(); int y = (height-normal_bitmap->GetHeight())/2.0; dc.DrawBitmap(*normal_bitmap, width-x-5, y, true); if (text.IsEmpty()) { break; } if (!text_font.IsNull()) { dc.SetFont(text_font); } int pointsize = text_font.GetPointSize(); //dc.SetLayoutDirection(wxLayout_Default); int bit = text.Find('\n'); if (bit!=-1) { wxString str; str = text.Left(bit); dc.DrawText(str,5,height/2-pointsize-2); int length = text.Length(); str = text.Mid(bit+1,length-bit-1); dc.DrawText(str,5,height/2); } else { dc.DrawText(text,5,height/2-7); } } break; } } void wxBitmapButtonEx::DrawBackground(wxDC* dc) { if (is_used_bg) { dc->DrawBitmap(background_bitmap, 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 wxBitmapButtonEx::OnEnter(wxMouseEvent& event) { /* button_status = BitmapButtonEnter; Refresh(); Update();*/ } void wxBitmapButtonEx::OnLeave(wxMouseEvent& event) { if (!IsEnabled()) { return; } button_status = BitmapButtonLeave; Refresh(); Update(); } void wxBitmapButtonEx::OnDClick(wxMouseEvent& event) { /* button_status = BitmapButtonDown; Refresh(false); Update();*/ } void wxBitmapButtonEx::OnDown(wxMouseEvent& event) { button_status = BitmapButtonDown; Refresh(); Update(); } void wxBitmapButtonEx::OnUp(wxMouseEvent& event) { if (BitmapButtonDown != button_status) { return; } button_status = BitmapButtonUp; Refresh(); Update(); wxCommandEvent myEvent(wxEVT_COMMAND_BUTTON_CLICKED, GetId()); myEvent.SetEventObject(this); GetEventHandler()->ProcessEvent(myEvent); } wxBitmapButtonEx* wxBitmapButtonEx::set_normal_bitmap(wxBitmap* bitmap) { normal_bitmap = bitmap; return this; } wxBitmapButtonEx* wxBitmapButtonEx::set_down_bitmap(wxBitmap* bitmap) { down_bitmap = bitmap; return this; } wxBitmapButtonEx* wxBitmapButtonEx::set_enter_bitmap(wxBitmap* bitmap) { enter_bitmap = bitmap; return this; } bool wxBitmapButtonEx::Enable(bool enable) { if (enable) { button_status = BitmapButtonNormal; } else { button_status = BitmapButtonDisable; } Refresh(false); Update(); return wxControl::Enable(enable); } bool wxBitmapButtonEx::Disable() { return Enable(false); } wxBitmapButtonEx* wxBitmapButtonEx::set_disable_bitmap(wxBitmap* bitmap) { disable_bitmap = bitmap; return this; } wxBitmapButtonEx* wxBitmapButtonEx::set_background(const wxBitmap& bitmap) { is_used_bg = true; background_bitmap = bitmap; return this; } bool wxBitmapButtonEx::set_background_colour(const wxColour& colour) { is_used_bg = false; return wxControl::SetBackgroundColour(colour); } // void wxBitmapButtonEx::set_button_text(wxString str) { text = str; } // void wxBitmapButtonEx::set_text_font(wxFont font) { text_font = font; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持猪先飞。
上一篇: C语言链表实现歌手评分系统
相关文章
- 下面小编就为大家带来一篇利用JS实现点击按钮后图片自动切换的简单方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2016-10-25
- 这篇文章主要为大家详细解析了BootStrap栅格系统、表单样式与按钮样式源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2017-01-23
- 这篇文章主要介绍了C#使用浏览按钮获得文件路径和文件夹路径的方法,结合实例形式分析了C#浏览器事件响应及文件操作相关技巧,需要的朋友可以参考下...2020-06-25
- 在淘宝等购物网站,我们都会看到一个发送短信倒计时的按钮,究竟是如何实现的呢?下面小编通过本篇文章给大家分享一段代码关于js实现手机短信按钮倒计时,需要的朋友参考下...2016-01-02
- 这篇文章主要为大家介绍了python编程使用PyQt5如何创建按钮及触发点击事件的示例解析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步...2021-10-29
- 这篇文章主要为大家详细介绍了jquery mobile实现可折叠的导航按钮,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2017-03-13
- 这篇文章主要介绍了微信小程序将页面按钮悬浮固定在底部的实现代码,代码简单易懂,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-10-29
- javascript代码判断按钮是否被点击了在项目中经常会遇到这个需求,今天小编抽点时间给大家分享一段代码关于javascript判断按钮是否被点击的方法,感兴趣的朋友一起学习吧...2015-12-14
- 这篇文章主要介绍了javascript+css3 实现动态按钮菜单特效的相关资料,需要的朋友可以参考下...2016-02-12
- 这篇文章主要为大家详细介绍了vue实现自定义多选按钮,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2020-07-16
- 这篇文章主要介绍了如何在.Net版本UEditor中添加一个普通按钮,需要的朋友可以参考下...2021-09-22
- 下面小编就为大家带来一篇JS判断键盘是否按的回车键并触发指定按钮点击操作的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2017-02-19
- 这篇文章主要介绍了Angular2搜索和重置按钮过场动画,需要的朋友可以参考下...2017-05-27
- 这篇文章主要介绍了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
- 本文给大家分享一段JS实例代码介绍动态创建按钮的方法,需要的朋友参考下本文...2016-02-01