wxWidgets自定义按钮的方法
场景:
1.现在的软件上的按钮都不是标准的按钮了,因为基本上是贴图上去的,正常情况下一种图片,鼠标移上去之后按钮显示另一种效果,按下去之后又是另一种效果。
2.wx的做法其实和mfc的按钮原理是一样的,就是给按钮贴图和重绘背景。
以下是源文件.
dh_bitmap_button.h
/* *File:dh_bitmap_button.h *Author:Sai * *Createdon2009年12月29日,下午4:08 */ #ifndef_DH_BITMAP_BUTTON_H #define_DH_BITMAP_BUTTON_H #include"wx/wx.h" enumDhBitmapButtonStatus { kDhBitmapButtonNormal, kDhBitmapButtonEnter, kDhBitmapButtonDown, kDhBitmapButtonUp, kDhBitmapButtonLeave, kDhBitmapButtonDClick, kDhBitmapButtonDisable }; classDhBitmapButton:publicwxControl { DECLARE_DYNAMIC_CLASS(DhBitmapButton) DECLARE_EVENT_TABLE() public: DhBitmapButton(); virtual~DhBitmapButton(); DhBitmapButton(wxWindow*parent,wxWindowIDid, constwxPoint&pos=wxDefaultPosition, constwxSize&size=wxDefaultSize, longstyle=wxBORDER_NONE, constwxValidator&validator=wxDefaultValidator); boolCreate(wxWindow*parent,wxWindowIDid, constwxPoint&pos=wxDefaultPosition, constwxSize&size=wxDefaultSize, longstyle=wxSUNKEN_BORDER, constwxValidator&validator=wxDefaultValidator); wxSizeDoGetBestSize()const; voidOnPaint(wxPaintEvent&event); virtualvoidOnEnter(wxMouseEvent&event); virtualvoidOnLeave(wxMouseEvent&event); virtualvoidOnDown(wxMouseEvent&event); virtualvoidOnDClick(wxMouseEvent&event); virtualvoidOnUp(wxMouseEvent&event); virtualboolEnable(boolenable=true); virtualboolDisable(); /** *设置正常图片 * *@parambitmap */ DhBitmapButton*set_normal_bitmap(wxBitmap*bitmap); /** *1.设置按钮按下时的切换图片 */ DhBitmapButton*set_down_bitmap(wxBitmap*bitmap); /** *1.设置按钮按经过时的切换图片 */ DhBitmapButton*set_enter_bitmap(wxBitmap*bitmap); /** *1.设置Disable图片. * *@parambitmap *@returnthis */ DhBitmapButton*set_disable_bitmap(wxBitmap*bitmap); DhBitmapButton*set_background(constwxBitmap&bitmap); boolSetBackgroundColour(constwxColour&colour); protected: voidDrawExistBitmap(wxDC*dc,wxBitmap*image1,wxBitmap*exist_image); private: wxBitmapbackground_; boolis_used_bg_; wxBitmap*normal_bitmap_; wxBitmap*down_bitmap_; wxBitmap*enter_bitmap_; wxBitmap*disable_bitmap_; intbutton_status_; wxStringtext_; wxFonttext_font_; voidDrawBackground(wxDC*dc); }; #endif/*_DH_BITMAP_BUTTON_H*/
dh_bitmap_button.cpp
/* *File:DhBitmapButton.cpp *Author:Sai * *Createdon2009年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,wxWindowIDid, constwxPoint&pos, constwxSize&size, longstyle, constwxValidator&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_); } boolDhBitmapButton::Create(wxWindow*parent,wxWindowIDid, constwxPoint&pos, constwxSize&size, longstyle, constwxValidator&validator) { normal_bitmap_=NULL; down_bitmap_=NULL; enter_bitmap_=NULL; disable_bitmap_=NULL; if(!wxControl::Create(parent,id,pos,size,style,validator)) { returnfalse; } SetBackgroundStyle(wxBG_STYLE_PAINT); is_used_bg_=false; returntrue; } wxSizeDhBitmapButton::DoGetBestSize()const { returnGetSize(); } voidDhBitmapButton::DrawExistBitmap(wxDC*dc,wxBitmap*image1, wxBitmap*exist_image) { if(image1) { dc->DrawBitmap(*image1,0,0,true); }else { dc->DrawBitmap(*exist_image,0,0,true); } } voidDhBitmapButton::OnPaint(wxPaintEvent&event) { wxPaintDCdc(this); DrawBackground(&dc); //1.状态控制绘画,好处就是可以调用Refresh连背景一起刷新. switch(button_status_) { casekDhBitmapButtonNormal: dc.DrawBitmap(*normal_bitmap_,0,0,true); break; casekDhBitmapButtonEnter: if(!enter_bitmap_) { intwidth=DoGetBestSize().GetWidth(); intheight=DoGetBestSize().GetHeight(); wxClientDCdc(this); dc.SetPen(*wxRED_PEN); dc.SetBrush(*wxTRANSPARENT_BRUSH); dc.DrawRectangle(0,0,width,height); break; } dc.DrawBitmap(*enter_bitmap_,0,0,true); break; casekDhBitmapButtonDown: DrawExistBitmap(&dc,down_bitmap_,normal_bitmap_); break; casekDhBitmapButtonUp: dc.DrawBitmap(*normal_bitmap_,0,0,true); break; casekDhBitmapButtonLeave: dc.DrawBitmap(*normal_bitmap_,0,0,true); break; casekDhBitmapButtonDClick: DrawExistBitmap(&dc,down_bitmap_,normal_bitmap_); break; casekDhBitmapButtonDisable: DrawExistBitmap(&dc,disable_bitmap_,normal_bitmap_); break; default: dc.DrawBitmap(*normal_bitmap_,0,0,true); break; } } voidDhBitmapButton::DrawBackground(wxDC*dc) { if(is_used_bg_) { dc->DrawBitmap(background_,0,0,true); }else { wxBrushbrush(GetBackgroundColour()); wxPenpen(GetBackgroundColour()); dc->SetBrush(brush); dc->SetPen(pen); dc->DrawRectangle(0,0,GetSize().x,GetSize().y); } } voidDhBitmapButton::OnEnter(wxMouseEvent&event) { button_status_=kDhBitmapButtonEnter; Refresh(); Update(); } voidDhBitmapButton::OnLeave(wxMouseEvent&event) { if(!IsEnabled()) { return; } button_status_=kDhBitmapButtonLeave; Refresh(); Update(); } voidDhBitmapButton::OnDClick(wxMouseEvent&event) { button_status_=kDhBitmapButtonDown; Refresh(false); Update(); } voidDhBitmapButton::OnDown(wxMouseEvent&event) { button_status_=kDhBitmapButtonDown; Refresh(); Update(); } voidDhBitmapButton::OnUp(wxMouseEvent&event) { if(kDhBitmapButtonDown!=button_status_) { return; } button_status_=kDhBitmapButtonUp; Refresh(); Update(); wxCommandEventmyEvent(wxEVT_COMMAND_BUTTON_CLICKED,GetId()); myEvent.SetEventObject(this); GetEventHandler()->ProcessEvent(myEvent); } DhBitmapButton*DhBitmapButton::set_normal_bitmap(wxBitmap*bitmap) { normal_bitmap_=bitmap; returnthis; } DhBitmapButton*DhBitmapButton::set_down_bitmap(wxBitmap*bitmap) { down_bitmap_=bitmap; returnthis; } DhBitmapButton*DhBitmapButton::set_enter_bitmap(wxBitmap*bitmap) { enter_bitmap_=bitmap; returnthis; } boolDhBitmapButton::Enable(boolenable) { if(enable) { button_status_=kDhBitmapButtonNormal; }else { button_status_=kDhBitmapButtonDisable; } Refresh(false); Update(); returnwxControl::Enable(enable); } boolDhBitmapButton::Disable() { returnEnable(false); } DhBitmapButton*DhBitmapButton::set_disable_bitmap(wxBitmap*bitmap) { disable_bitmap_=bitmap; returnthis; } DhBitmapButton*DhBitmapButton::set_background(constwxBitmap&bitmap) { is_used_bg_=true; background_=bitmap; returnthis; } boolDhBitmapButton::SetBackgroundColour(constwxColour&colour) { is_used_bg_=false; returnwxControl::SetBackgroundColour(colour); }
调用方式和wxButton一样.
1.先注册事件映射宏.
EVT_BUTTON(Minimal_StartSimplePopup,MyFrame::OnStartSimplePopup)
2.调用代码.
wxBitmap*normal=newwxBitmap("./resources/start/start_normal.png", wxBITMAP_TYPE_PNG); wxBitmap*down=newwxBitmap("./resources/start/start_pressed.png", wxBITMAP_TYPE_PNG); wxBitmap*enter=newwxBitmap("./resources/start/start_current.png", wxBITMAP_TYPE_PNG); wxBitmap*disable=newwxBitmap("./resources/start/stop_normal.png", wxBITMAP_TYPE_PNG); wxBitmapbg=GetPositionBackgroundBitmap(0,0,normal->GetWidth(),normal->GetHeight()); start=newDhBitmapButton(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); wxBitmapMyFrame::GetPositionBackgroundBitmap(intx,inty, intwidth,intheight) { wxRectrect; rect.x=x; rect.y=y; rect.width=width; rect.height=height; wxBitmaptemp=this->bg.GetSubBitmap(rect); returntemp; }
3.当然我觉得有更好的方式.
比如重载这个类.wxBit
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。