溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

使用wxWidgets怎么自定義按鈕

發(fā)布時(shí)間:2021-05-19 16:24:48 來(lái)源:億速云 閱讀:195 作者:Leah 欄目:編程語(yǔ)言

本篇文章為大家展示了使用wxWidgets怎么自定義按鈕,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過(guò)這篇文章的詳細(xì)介紹希望你能有所收獲。

場(chǎng)景:

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)過(guò)時(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)控制繪畫(huà),好處就是可以調(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.先注冊(cè)事件映射宏.

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;
}

上述內(nèi)容就是使用wxWidgets怎么自定義按鈕,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI