最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

wxWidgets自定義按鈕的方法

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

場景:

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

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();
  /**
   * 設(shè)置正常圖片
   *
   * @param bitmap
   */
  DhBitmapButton* set_normal_bitmap(wxBitmap* bitmap);
 
  /**
   * 1.設(shè)置按鈕按下時的切換圖片
   */
  DhBitmapButton* set_down_bitmap(wxBitmap* bitmap);
 
  /**
   * 1.設(shè)置按鈕按經(jīng)過時的切換圖片
   */
  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)然我覺得有更好的方式.

比如重載這個類.wxBit

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:

相關(guān)文章

  • C語言解讀數(shù)組循環(huán)右移問題

    C語言解讀數(shù)組循環(huán)右移問題

    這篇文章主要介紹了C語言解讀數(shù)組循環(huán)右移問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • 深入理解c/c++ 內(nèi)存對齊

    深入理解c/c++ 內(nèi)存對齊

    這篇文章主要介紹了c/c++ 內(nèi)存對齊,有需要的朋友可以參考一下
    2014-01-01
  • QT實現(xiàn)定時關(guān)閉消息提示框

    QT實現(xiàn)定時關(guān)閉消息提示框

    這篇文章主要介紹了軟件利用Qt簡單實現(xiàn)消息提示框可定時自動關(guān)閉,文中的示例代碼講解詳細(xì),對我們;了解QT有一定的幫助,感興趣的可以學(xué)習(xí)一下
    2022-01-01
  • 深入了解C語言冒泡排序優(yōu)解

    深入了解C語言冒泡排序優(yōu)解

    這篇文章主要介紹了C語言冒泡排序法的實現(xiàn)(升序排序法),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-07-07
  • C語言動態(tài)內(nèi)存的分配實例詳解

    C語言動態(tài)內(nèi)存的分配實例詳解

    動態(tài)內(nèi)存管理同時還具有一個優(yōu)點,當(dāng)程序在具有更多內(nèi)存的系統(tǒng)上需要處理更多數(shù)據(jù)時,不需要重寫程序,下面這篇文章主要給大家介紹了關(guān)于C語言動態(tài)內(nèi)存分配的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • C++算法實現(xiàn)leetcode 1252奇數(shù)值單元格數(shù)目

    C++算法實現(xiàn)leetcode 1252奇數(shù)值單元格數(shù)目

    這篇文章為大家主要介紹了C++實現(xiàn)leetcode 1252奇數(shù)值單元格的數(shù)目題解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • C語言實現(xiàn)簡單酒店管理系統(tǒng)

    C語言實現(xiàn)簡單酒店管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)簡單酒店管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • linux中查詢dns示例

    linux中查詢dns示例

    這篇文章主要介紹了linux中查詢dns示例,需要的朋友可以參考下
    2014-04-04
  • 利用Qt實現(xiàn)獲取計算機的硬件信息

    利用Qt實現(xiàn)獲取計算機的硬件信息

    在開發(fā)時,常常會需要用到計算機的相關(guān)信息。利用這些信息,我們可以開發(fā)一些輔助模塊。本文將利用Qt實現(xiàn)獲取計算機的硬件信息,感興趣的可以嘗試一下
    2022-12-12
  • C語言實現(xiàn)變色進(jìn)度條

    C語言實現(xiàn)變色進(jìn)度條

    這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)一個變色的進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01

最新評論

伊金霍洛旗| 赤峰市| 临夏市| 威信县| 丰都县| 香港 | 宜州市| 平谷区| 牙克石市| 深水埗区| 北辰区| 吕梁市| 浑源县| 扎兰屯市| 元谋县| 汉中市| 开封市| 许昌市| 花莲市| 美姑县| 揭阳市| 柘荣县| 中西区| 昌图县| 吉安县| 喀喇沁旗| 三亚市| 舒城县| 普兰店市| 兴海县| 原阳县| 博爱县| 南宁市| 遂宁市| 乡城县| 乐山市| 钦州市| 清远市| 光山县| 二连浩特市| 自贡市|