wxWidgets自定義按鈕的方法
場景:
1.現(xiàn)在的軟件上的按鈕都不是標(biāo)準(zhǔn)的按鈕了,因?yàn)榛旧鲜琴N圖上去的,正常情況下一種圖片,鼠標(biāo)移上去之后按鈕顯示另一種效果,按下去之后又是另一種效果。
2.wx的做法其實(shí)和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();
/**
* 設(shè)置正常圖片
*
* @param bitmap
*/
DhBitmapButton* set_normal_bitmap(wxBitmap* bitmap);
/**
* 1.設(shè)置按鈕按下時(shí)的切換圖片
*/
DhBitmapButton* set_down_bitmap(wxBitmap* bitmap);
/**
* 1.設(shè)置按鈕按經(jīng)過時(shí)的切換圖片
*/
DhBitmapButton* set_enter_bitmap(wxBitmap* bitmap);
/**
* 1.設(shè)置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.狀態(tài)控制繪畫,好處就是可以調(diào)用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);
}
調(diào)用方式和wxButton一樣.
1.先注冊事件映射宏.
EVT_BUTTON(Minimal_StartSimplePopup, MyFrame::OnStartSimplePopup)
2.調(diào)用代碼.
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.當(dāng)然我覺得有更好的方式.
比如重載這個(gè)類.wxBit
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
QT實(shí)現(xiàn)定時(shí)關(guān)閉消息提示框
這篇文章主要介紹了軟件利用Qt簡單實(shí)現(xiàn)消息提示框可定時(shí)自動關(guān)閉,文中的示例代碼講解詳細(xì),對我們;了解QT有一定的幫助,感興趣的可以學(xué)習(xí)一下2022-01-01
C++算法實(shí)現(xiàn)leetcode 1252奇數(shù)值單元格數(shù)目
這篇文章為大家主要介紹了C++實(shí)現(xiàn)leetcode 1252奇數(shù)值單元格的數(shù)目題解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08
C語言實(shí)現(xiàn)簡單酒店管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡單酒店管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
利用Qt實(shí)現(xiàn)獲取計(jì)算機(jī)的硬件信息
在開發(fā)時(shí),常常會需要用到計(jì)算機(jī)的相關(guān)信息。利用這些信息,我們可以開發(fā)一些輔助模塊。本文將利用Qt實(shí)現(xiàn)獲取計(jì)算機(jī)的硬件信息,感興趣的可以嘗試一下2022-12-12

