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
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。