欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

wxWidgets自定義按鈕的方法

 更新時間:2019年02月20日 14:34:48   作者:infoworld  
這篇文章主要為大家詳細介紹了wxWidgets自定義按鈕的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下

場景:

1.現(xiàn)在的軟件上的按鈕都不是標準的按鈕了,因為基本上是貼圖上去的,正常情況下一種圖片,鼠標移上去之后按鈕顯示另一種效果,按下去之后又是另一種效果。

2.wx的做法其實和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();
  /**
   * 設置正常圖片
   *
   * @param bitmap
   */
  DhBitmapButton* set_normal_bitmap(wxBitmap* bitmap);
 
  /**
   * 1.設置按鈕按下時的切換圖片
   */
  DhBitmapButton* set_down_bitmap(wxBitmap* bitmap);
 
  /**
   * 1.設置按鈕按經過時的切換圖片
   */
  DhBitmapButton* set_enter_bitmap(wxBitmap* bitmap);
 
  /**
   * 1.設置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)控制繪畫,好處就是可以調用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);
}

調用方式和wxButton一樣.

1.先注冊事件映射宏.

EVT_BUTTON(Minimal_StartSimplePopup, MyFrame::OnStartSimplePopup)

2.調用代碼.

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.當然我覺得有更好的方式.

比如重載這個類.wxBit

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:

相關文章

  • C語言關鍵字總結解析

    C語言關鍵字總結解析

    這篇文章主要介紹了C語言關鍵字總結解析,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是本文的詳細內容,需要的朋友可以參考下
    2021-07-07
  • 基于select、poll、epoll的區(qū)別詳解

    基于select、poll、epoll的區(qū)別詳解

    本篇文章是對select、poll、epoll之間的區(qū)別進行了詳細的分析介紹。需要的朋友參考下
    2013-05-05
  • 求解旋轉數(shù)組的最小數(shù)字

    求解旋轉數(shù)組的最小數(shù)字

    這篇文章主要介紹了求解旋轉數(shù)組的最小數(shù)字的相關資料,需要的朋友可以參考下
    2017-05-05
  • Opencv光流運動物體追蹤詳解

    Opencv光流運動物體追蹤詳解

    這篇文章主要為大家詳細介紹了Opencv光流運動物體追蹤的相關資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 好用的C++ string Format“函數(shù)”介紹

    好用的C++ string Format“函數(shù)”介紹

    大家好,本篇文章主要講的是好用的C++ string Format“函數(shù)”介紹,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • C/C++實現(xiàn)捕獲所有信號的示例詳解

    C/C++實現(xiàn)捕獲所有信號的示例詳解

    Linux的信號機制大部分情況下用不到,但是由于大部分信號的默認處理是終止進程,不正確處理會惹麻煩,所以我們來看看如何使用C/C++實現(xiàn)捕獲所有信號吧
    2024-03-03
  • C語言庫函數(shù)qsort的使用詳解

    C語言庫函數(shù)qsort的使用詳解

    C語言庫函數(shù)中的qsort的是一個回調函數(shù),回調函數(shù)就是一個通過函數(shù)指針調用的函數(shù),這篇文章主要介紹了C語言庫函數(shù)qsort的使用,需要的朋友可以參考下
    2022-06-06
  • C語言字符串函數(shù)操作(strlen,strcpy,strcat,strcmp)詳解

    C語言字符串函數(shù)操作(strlen,strcpy,strcat,strcmp)詳解

    大家好,本篇文章主要講的是C語言字符串函數(shù)操作(strlen,strcpy,strcat,strcmp)詳解,感興趣的同學趕快來看一看吧
    2021-12-12
  • OpenCV圖像特征提取之Shi-Tomasi角點檢測算法詳解

    OpenCV圖像特征提取之Shi-Tomasi角點檢測算法詳解

    Harris角點檢測算法就是對角點響應函數(shù)R進行閾值處理,Shi-Tomasi原理幾乎和Harris一樣的,只不過最后計算角點響應的公式發(fā)生了變化。本文將和大家詳細說說Shi-Tomasi角點檢測算法的原理與實現(xiàn),需要的可以參考一下
    2022-09-09
  • C++  boost 時間與日期處理詳細介紹

    C++ boost 時間與日期處理詳細介紹

    這篇文章主要介紹了C++ boost 時間與日期處理詳細介紹的相關資料,這里提供實例代碼,及實現(xiàn)效果,需要的朋友可以參考下
    2016-11-11

最新評論