亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

wxWidgets自定義按鈕的方法

2020-01-26 13:31:31
字體:
來源:轉載
供稿:網友

場景:

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

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.狀態控制繪畫,好處就是可以調用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

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
少妇高潮久久久久久潘金莲| 亚洲激情在线视频| 日韩欧美高清视频| 欧美日韩视频在线| 国产成人一区二| 91精品国产一区| 97在线免费视频| 亚洲精品日韩av| 国内自拍欧美激情| 色综合色综合网色综合| 欧美日本黄视频| 国产精品夫妻激情| 国产成人一区三区| 国产精品久久久久久久电影| 欧美激情在线有限公司| 国产精品www| 亚洲欧美国产另类| 国产视频丨精品|在线观看| 日韩视频中文字幕| 视频在线观看一区二区| 中文字幕亚洲无线码a| 奇米四色中文综合久久| 日韩一区av在线| 国产丝袜一区二区三区| 欧美另类极品videosbestfree| 成人欧美一区二区三区黑人孕妇| 日韩欧美高清在线视频| 亚洲人在线视频| 亚洲bt欧美bt日本bt| 国产精品日韩欧美大师| 欧美成人手机在线| 日韩成人黄色av| 高清欧美一区二区三区| 92裸体在线视频网站| 国产精品入口免费视频一| 欧美成人激情视频| 亚洲理论在线a中文字幕| 国内精品视频一区| 最近2019中文字幕一页二页| 日韩动漫免费观看电视剧高清| 黑人巨大精品欧美一区二区| 久久综合久久美利坚合众国| 中文字幕欧美专区| 久久精品在线播放| 成人午夜在线视频一区| 欧美亚洲激情在线| 国产999精品久久久影片官网| 日韩美女福利视频| 日韩中文字幕在线看| 91香蕉国产在线观看| 亚洲欧美一区二区三区久久| 91成人性视频| 欧美日本高清视频| 国产亚洲精品va在线观看| 在线观看国产欧美| 国产在线精品自拍| 欧美日韩亚洲高清| 国产精品九九久久久久久久| 欧美成人午夜影院| 日韩亚洲欧美中文高清在线| 欧美另类极品videosbest最新版本| 亚洲第一网中文字幕| 国产精品爱啪在线线免费观看| 亚洲视频欧洲视频| 国产精品伦子伦免费视频| 亚洲国产精品久久精品怡红院| 欧美乱妇高清无乱码| 国产精品爽黄69天堂a| 国产精品白丝jk喷水视频一区| 亚洲成人久久一区| 中文字幕av一区| 久久精品中文字幕一区| 热久久美女精品天天吊色| 亚洲xxxx在线| 不卡伊人av在线播放| 91精品久久久久久久久不口人| 日韩高清av一区二区三区| 欧美在线不卡区| 久久久视频免费观看| 97视频免费观看| 日韩欧美在线视频免费观看| 亚洲尤物视频网| 亚洲男子天堂网| 国产精品久久久久久久久久尿| 国产一区私人高清影院| 国产精品白丝jk喷水视频一区| 国产午夜精品一区二区三区| 国产精品久久久久久久av大片| 国产欧美久久一区二区| 美女少妇精品视频| 精品国偷自产在线| 欧美人成在线视频| 国产精品日韩在线观看| 久久频这里精品99香蕉| 国产视频观看一区| 亚洲福利视频网站| 久久久国产影院| 国产xxx69麻豆国语对白| 91精品国产自产在线老师啪| 中文字幕欧美日韩va免费视频| 欧美日韩国产成人在线| 国产综合福利在线| 不卡在线观看电视剧完整版| 日韩经典一区二区三区| 亚洲毛片在线观看| 神马国产精品影院av| 91高清在线免费观看| 日韩高清电影免费观看完整版| 最近中文字幕日韩精品| 亚洲天堂成人在线视频| 国产精品一区二区av影院萌芽| 欧美丝袜一区二区| 日韩电影大全免费观看2023年上| 麻豆成人在线看| 欧美激情在线狂野欧美精品| 日韩男女性生活视频| 高跟丝袜欧美一区| 欧美国产极速在线| 亚洲精品99久久久久| 日韩av中文字幕在线| 久久视频国产精品免费视频在线| 国产精品久久久久久久9999| 日本精品免费一区二区三区| 欧美极品美女电影一区| 国产成人精品一区二区| 欧美国产日韩中文字幕在线| 亚洲综合中文字幕68页| 亚洲午夜精品视频| 欧美多人乱p欧美4p久久| 亚洲精品一区二区三区婷婷月| 日韩av在线电影网| 国产精品户外野外| 亚洲欧美视频在线| 国产视频精品在线| 2023亚洲男人天堂| 日韩精品在线影院| 久久人人爽亚洲精品天堂| 欧美激情视频免费观看| 欧美性黄网官网| 韩国三级电影久久久久久| 欧美专区在线视频| 亚洲色图激情小说| 成人日韩在线电影| 国产精品一区二区性色av| 国产69精品久久久久9| 欧美日本亚洲视频| 国产精品男人的天堂| 欧美亚洲一区在线| 91中文字幕在线观看| 国产精品羞羞答答| 欧美又大又硬又粗bbbbb| 亚洲性生活视频在线观看| 亚洲综合成人婷婷小说| 国产精品美女www爽爽爽视频| 国产日韩在线视频| 亚洲自拍高清视频网站| 国产精品极品美女在线观看免费| 91国产美女在线观看| 91久久精品国产91性色| 国产成人精品一区二区在线| 成人日韩av在线| 日韩精品视频观看| 国产精品美女久久久久av超清| 欧美精品少妇videofree|