⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aslider.cpp

📁 Audacity是一款用於錄音和編輯聲音的、免費的開放源碼軟體。它可以執行於Mac OS X、Microsoft Windows、GNU/Linux和其它作業系統
💻 CPP
📖 第 1 页 / 共 2 页
字号:
/**********************************************************************  Audacity: A Digital Audio Editor  ASlider.cpp  Dominic Mazzoni  This class is a custom slider, allowing for a   slicker look and feel by allowing you to use images  for the slider background and the thumb.**********************************************************************/#include <math.h>#include <wx/defs.h>#include <wx/dcclient.h>#include <wx/dcmemory.h>#include <wx/image.h>#include <wx/msgdlg.h>#include <wx/panel.h>#include <wx/tooltip.h>#include <wx/debug.h>#include <wx/textctrl.h>#include <wx/valtext.h>#include <wx/dialog.h>#include <wx/sizer.h>#include <wx/button.h>#include <wx/statline.h>#include <wx/sizer.h>#if defined(__WXMSW__) && !defined(__CYGWIN__)#define USE_POPUPWIN 1#endif#if USE_POPUPWIN#include <wx/popupwin.h>#endif#include "ASlider.h"#include "../AColor.h"#include "../ImageManipulation.h"#include "../Project.h"#include "../../images/SliderThumb.xpm"#include <iostream>#if defined __WXMSW__const int sliderFontSize = 10;#elseconst int sliderFontSize = 12;#endif//// TipPanel//#if USE_POPUPWINclass TipPanel : public wxPopupWindow#elseclass TipPanel : public wxPanel#endif{ public:   TipPanel(wxWindow * parent, wxWindowID id,            wxString label,            const wxPoint &pos);      void SetPos(const wxPoint &pos);   void OnPaint(wxPaintEvent & event);   wxString label;   wxString origLabel;   wxWindow *mParent;   DECLARE_EVENT_TABLE()};#if USE_POPUPWINBEGIN_EVENT_TABLE(TipPanel, wxPopupWindow)   EVT_PAINT(TipPanel::OnPaint)END_EVENT_TABLE()TipPanel::TipPanel(wxWindow *parent, wxWindowID id,                   wxString label, const wxPoint &pos):   wxPopupWindow(parent){   this->label = label;   this->origLabel = label;   mParent = parent;   SetPos(pos);}void TipPanel::SetPos(const wxPoint& pos){   int x = pos.x;   int y = pos.y;   if (mParent)      mParent->ClientToScreen(&x,&y);   wxClientDC dc(this);   wxFont labelFont(sliderFontSize, wxSWISS, wxNORMAL, wxNORMAL);   dc.SetFont(labelFont);   int width, height;   dc.GetTextExtent(origLabel, &width, &height);   height += 4;   SetSize(x - width/2, y, width, height);}#elseBEGIN_EVENT_TABLE(TipPanel, wxPanel)   EVT_PAINT(TipPanel::OnPaint)END_EVENT_TABLE()TipPanel::TipPanel(wxWindow *parent, wxWindowID id,                   wxString label,                   const wxPoint &pos):   wxPanel(parent, id){   this->label = label;   this->origLabel = label;   SetPos(pos);}void TipPanel::SetPos(const wxPoint& pos){   wxClientDC dc(this);   wxFont labelFont(sliderFontSize, wxSWISS, wxNORMAL, wxNORMAL);   dc.SetFont(labelFont);   int width, height;   dc.GetTextExtent(origLabel, &width, &height);   width += 4;   height += 4;   int left = pos.x - width/2;   if (left < 0)      left = 0;   SetSize(left, pos.y, width, height);   }#endifvoid TipPanel::OnPaint(wxPaintEvent& event){   wxPaintDC dc(this);   int width, height, textWidth, textHeight;   wxFont labelFont(sliderFontSize, wxSWISS, wxNORMAL, wxNORMAL);   dc.SetFont(labelFont);   GetClientSize(&width, &height);   dc.SetPen(*wxBLACK_PEN);   dc.SetBrush(AColor::tooltipBrush);   dc.DrawRectangle(0, 0, width, height);   dc.GetTextExtent(label, &textWidth, &textHeight);   dc.DrawText(label, (width-textWidth)/2, (height-textHeight)/2);}//////SliderDialog///#define ID_SLIDER 10000BEGIN_EVENT_TABLE(SliderDialog, wxDialog)   EVT_COMMAND(ID_SLIDER,wxEVT_COMMAND_SLIDER_UPDATED,SliderDialog::OnSlider)   EVT_TEXT_ENTER(SLIDER_DIALOG_TEXTCTRL,SliderDialog::OnEnter)   EVT_TEXT(SLIDER_DIALOG_TEXTCTRL,SliderDialog::OnKeyEvent)END_EVENT_TABLE()   ;SliderDialog::SliderDialog(wxWindow * parent, wxWindowID id,                           const wxString & title,                            wxPoint position,                           wxSize size,                           int style,                            float value):   wxDialog(NULL,id,title,position){   wxBeginBusyCursor();   //Use a vertical sizer   wxBoxSizer * vs = new wxBoxSizer(wxVERTICAL);      //Add the text   wxString * dummy = new wxString(wxString::Format(wxT("%2.2f"),value));   mTextCtrl = new wxTextCtrl(this,SLIDER_DIALOG_TEXTCTRL,*dummy,                              wxDefaultPosition,                              wxDefaultSize,                              wxTE_PROCESS_ENTER,                               wxTextValidator(wxFILTER_NUMERIC,dummy));   vs->Add(mTextCtrl,0,wxEXPAND|wxALL,5);   //Add a slider    mSlider = new ASlider(this,ID_SLIDER,title,wxDefaultPosition,size,style);   vs->Add(mSlider,wxEXPAND|wxLEFT|wxRIGHT, 5 );      //Create buttons    vs->Add(CreateStdDialogButtonSizer(wxOK|wxCANCEL),0,wxEXPAND|wxALL,5);         //lay it out   SetAutoLayout(true);   SetSizer(vs);   vs->SetSizeHints(this);   vs->Fit(this);   mTextCtrl->SetSelection(-1,-1);   mTextCtrl->SetFocus();   mSlider->Set(value);   wxEndBusyCursor();}SliderDialog::~SliderDialog(){   delete mSlider;   delete mTextCtrl;}void SliderDialog::OnSlider(wxCommandEvent & event){   mTextCtrl->SetValue(wxString::Format(wxT("%2.2f"),mSlider->Get()));   event.Skip(false);}void SliderDialog::OnKeyEvent(wxCommandEvent & event){   //Do not do anything here right now.  Possibly, better rounding   //and validation could go here.}void SliderDialog::OnEnter(wxCommandEvent & event){   wxString text = mTextCtrl->GetValue();   //Convert to a double   double val=0;   text.ToDouble(&val);   //Set the slider to the value.   mSlider->Set(val);   //Set the text value to the slider's   mTextCtrl->SetValue(wxString::Format(wxT("%2.2f"),mSlider->Get()));   OnOK(event);}float SliderDialog:: Get(){   return mSlider->Get();}//// LWSlider//// Construct customizable sliderLWSlider::LWSlider(wxWindow * parent,         wxString name,         const wxPoint &pos,         const wxSize &size,         float minValue,         float maxValue,         float stepValue,         bool canUseShift,         int style,         bool heavyweight /* = false */         ){   Init(parent, name, pos, size, minValue, maxValue,      stepValue, canUseShift, style, heavyweight);}// Construct predefined sliderLWSlider::LWSlider(wxWindow *parent,                   wxString name,                   const wxPoint &pos,                   const wxSize &size,                   int style,                   bool heavyweight /* = false */){   wxString leftLabel, rightLabel;   float minValue, maxValue, stepValue;   switch(style)   {   case PAN_SLIDER:      minValue = -1.0f;      maxValue = +1.0f;      stepValue = 0.1f;      break;   case DB_SLIDER:      minValue = -36.0f;      maxValue = 36.0f;      stepValue = 3.0f;      break;   case FRAC_SLIDER:      minValue = 0.0f;      maxValue = 1.0f;      stepValue = STEP_CONTINUOUS;      break;   case SPEED_SLIDER:      minValue = 0.0f;      maxValue = 3.0f;      stepValue = STEP_CONTINUOUS;      break;   default:      minValue = 0.0f;      maxValue = 1.0f;      stepValue = 0.0f;      wxASSERT(false); // undefined style   }   Init(parent, name, pos, size, minValue, maxValue, stepValue,        true, style, heavyweight);}void LWSlider::Init(wxWindow * parent,     wxString name,     const wxPoint &pos,     const wxSize &size,     float minValue,     float maxValue,     float stepValue,     bool canUseShift,     int style,     bool heavyweight /* = false */     ){   mName = name;   mStyle = style;   mIsDragging = false;   mWidth = size.x;   mHeight = size.y;   mParent = parent;   mHW = heavyweight;   mID = -1;   mMinValue = minValue;   mMaxValue = maxValue;   mStepValue = stepValue;   mCanUseShift = canUseShift;   mCurrentValue = 0.0f;   if (!(mWidth & 0))      mWidth--;   mCenterY = mHeight - 9;   wxMemoryDC *dc = new wxMemoryDC();   wxBitmap *bitmap = new wxBitmap(8, 8);   dc->SelectObject(*bitmap);   AColor::Medium(dc, false);   wxColour bkgnd = dc->GetPen().GetColour();   AColor::Medium(dc, true);      wxColour selBkgnd = dc->GetPen().GetColour();   wxImage *backgroundImage =      CreateSysBackground(mWidth, mHeight, 0, bkgnd);#if wxCHECK_VERSION(2, 5, 0)   wxBitmap backgroundBitmap(backgroundImage);#else   wxBitmap backgroundBitmap =      backgroundImage->ConvertToBitmap();#endif   wxImage *thumbImage = new wxImage(wxBitmap(SliderThumb).ConvertToImage());   wxImage *thumb1 = ChangeImageColour(thumbImage, bkgnd);   wxImage *thumb2 = ChangeImageColour(thumbImage, selBkgnd);   mThumbBitmap = new wxBitmap(thumb1);   mSelThumbBitmap = new wxBitmap(thumb2);   delete thumb1;   delete thumb2;   delete thumbImage;   delete dc;   delete bitmap;   mThumbWidth = mThumbBitmap->GetWidth();   mThumbHeight = mThumbBitmap->GetHeight();   mLeftX = mThumbWidth/2;   mRightX = mWidth - mThumbWidth/2 - 1;   mWidthX = mRightX - mLeftX;   int i;   for(i=0; i<2; i++) {      wxBitmap *bitmap;      bitmap = new wxBitmap(mWidth, mHeight);      wxMemoryDC *dc = new wxMemoryDC();      dc->SelectObject(*bitmap);      if (mHW) {         dc->DrawBitmap(backgroundBitmap, 0, 0);      }      else {         AColor::Medium(dc, i==1);         dc->DrawRectangle(0, 0, mWidth, mHeight);      }      AColor::Medium(dc, i==1);      dc->DrawLine(mLeftX, mCenterY, mRightX+2, mCenterY);      AColor::Dark(dc, false);      dc->DrawLine(mLeftX, mCenterY+1, mRightX+2, mCenterY+1);      int divs = 10;      double upp = divs / (double)(mWidthX-1);      double d = 0;      int int_d = -1;      for(int p=0; p<=mWidthX; p++) {         if (((int)d) > int_d) {            int_d = (int)d;            int ht = (int_d==0 || int_d==divs? 5: 3);            AColor::Light(dc, false);            dc->DrawLine(mLeftX+p, mCenterY-ht, mLeftX+p, mCenterY);            AColor::Dark(dc, false);            dc->DrawLine(mLeftX+p+1, mCenterY-ht+1, mLeftX+p+1, mCenterY);         }         d += upp;      }      if (style == PAN_SLIDER)      {         wxFont labelFont(sliderFontSize, wxSWISS, wxNORMAL, wxNORMAL);         dc->SetFont(labelFont);         /* i18n-hint: One-letter abbreviation for Left, in the Pan slider */         dc->DrawText(_("L"), mLeftX, 1);         /* i18n-hint: One-letter abbreviation for Right, in the Pan slider */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -