wxWidgets實現(xiàn)圖片和文件按鈕
在wxWidgets中,想要通過其本身的控件來實現(xiàn)圖片+文件的按鈕,貌似不太容易做到。但是可以通過重載wxControl來自繪圖片+文件按鈕。下面給出的是已經(jīng)封裝好的按鈕類:
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();
//設(shè)置正常圖片
wxBitmapButtonEx* set_normal_bitmap(wxBitmap* bitmap);
//設(shè)置按鈕按下時的切換圖片
wxBitmapButtonEx* set_down_bitmap(wxBitmap* bitmap);
//設(shè)置按鈕按經(jīng)過時的切換圖片
wxBitmapButtonEx* set_enter_bitmap(wxBitmap* bitmap);
//設(shè)置Disable圖片.
wxBitmapButtonEx* set_disable_bitmap(wxBitmap* bitmap);
//設(shè)置背景圖片
wxBitmapButtonEx* set_background(const wxBitmap& bitmap);
//設(shè)置背景顏色
bool set_background_colour(const wxColour& colour);
//設(shè)置按鈕文字
void set_button_text(wxString str);
//設(shè)置文字字體
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.狀態(tài)控制繪畫,好處就是可以調(diào)用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;
}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
C語言之關(guān)于二維數(shù)組在函數(shù)中的調(diào)用問題
這篇文章主要介紹了C語言之關(guān)于二維數(shù)組在函數(shù)中的調(diào)用問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-07-07
C++實現(xiàn)string存取二進(jìn)制數(shù)據(jù)的方法
這篇文章主要介紹了C++實現(xiàn)string存取二進(jìn)制數(shù)據(jù)的方法,針對STL中string的用法進(jìn)行了較為詳細(xì)的分析,需要的朋友可以參考下2014-10-10
利用C++?OpenCV?實現(xiàn)從投影圖像恢復(fù)仿射特性
我們通過相機(jī)拍攝的圖片存在各種畸變,其中投影畸變使得原本平行的直線不再平行,就會產(chǎn)生照片中近大遠(yuǎn)小的效果。本文將具體介紹如何利用OPenCV實現(xiàn)從投影圖像恢復(fù)仿射特性,接下來跟著小編一起學(xué)習(xí)吧2021-11-11
C++使用MySQL-Connector/C++連接MySQL出現(xiàn)LNK2019錯誤的解決方法
這篇文章主要介紹了C++使用MySQL-Connector/C++連接MySQL出現(xiàn)LNK2019錯誤的解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-03-03

