📄 timetextctrl.cpp
字号:
if (handleDelim) { bool goToFrac = false; if (!inFrac && delimStr[delimStr.Length()-1]=='.') { goToFrac = true; if (delimStr.Length() > 1) delimStr = delimStr.BeforeLast('.'); } if (inFrac) { if (mFracFields.GetCount() == 0) { // Should never happen return; } if (handleNum && mFracFields.GetCount() > 1) mFracFields[mFracFields.GetCount()-2].label = delimStr; else mFracFields[mFracFields.GetCount()-1].label = delimStr; } else { if (mWholeFields.GetCount() == 0) mPrefix = delimStr; else { mWholeFields[mWholeFields.GetCount()-1].label = delimStr; } } if (goToFrac) inFrac = true; delimStr = wxT(""); } } for(i=0; i<mWholeFields.GetCount(); i++) mWholeFields[i].CreateDigitFormatStr(); for(i=0; i<mFracFields.GetCount(); i++) mFracFields[i].CreateDigitFormatStr();}void TimeTextCtrl::PrintDebugInfo(){ unsigned int i; printf("%s", (const char *)mPrefix.mb_str()); for(i=0; i<mWholeFields.GetCount(); i++) printf("(t / %d) %% %d '%s' ", mWholeFields[i].base, mWholeFields[i].range, (const char *)mWholeFields[i].label.mb_str()); for(i=0; i<mFracFields.GetCount(); i++) printf("(t * %d) %% %d '%s' ", mFracFields[i].base, mFracFields[i].range, (const char *)mFracFields[i].label.mb_str()); printf("\n");}wxString TimeTextCtrl::GetTimeString(){ int t_int = int(mTimeValue); double t_frac = (mTimeValue - t_int); wxString result; unsigned int i; result = mPrefix; for(i=0; i<mWholeFields.GetCount(); i++) { int value = (t_int / mWholeFields[i].base); if (mWholeFields[i].range > 0) value = value % mWholeFields[i].range; result += wxString::Format(mWholeFields[i].formatStr, value); result += mWholeFields[i].label; } for(i=0; i<mFracFields.GetCount(); i++) { int value = (int)(t_frac * mFracFields[i].base); if (mFracFields[i].range > 0) value = value % mFracFields[i].range; result += wxString::Format(mFracFields[i].formatStr, value); result += mFracFields[i].label; } return result;}void TimeTextCtrl::DeleteControls(){ unsigned int i; if (mPrefixStaticText) { mPrefixStaticText->Destroy(); mPrefixStaticText = NULL; } for(i=0; i<mWholeFields.GetCount(); i++) { mWholeFields[i].textCtrl->Destroy(); mWholeFields[i].staticCtrl->Destroy(); } for(i=0; i<mFracFields.GetCount(); i++) { mFracFields[i].textCtrl->Destroy(); mFracFields[i].staticCtrl->Destroy(); }}void TimeTextCtrl::CreateControls(){ wxBoxSizer *mainSizer; wxTextCtrl *text; wxStaticText *stat; unsigned int i; int width; int digits; if (sTextHeight == 0) ComputeTextExtents(); mainSizer = new wxBoxSizer(wxHORIZONTAL); if (mPrefix != wxT("")) { stat = new wxStaticText(this, -1, mPrefix); mainSizer->Add(stat, 0, wxALL | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT, 1); mPrefixStaticText = stat; } for(i=0; i<mWholeFields.GetCount(); i++) { digits = mWholeFields[i].digits; if (digits < 1) digits = 3; if (digits > 10) digits = 10; width = sTextWidth[digits]; text = new wxTextCtrl(this, AnyTextCtrlID, wxT(""), wxDefaultPosition, wxSize(width, -1), wxTE_RIGHT); //if (mWholeFields[i].digits > 0) // text->SetMaxLength(mWholeFields[i].digits); mainSizer->Add(text, 0, wxALL, 0); mWholeFields[i].textCtrl = text; stat = new wxStaticText(this, -1, mWholeFields[i].label); mainSizer->Add(stat, 0, wxALL | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT, 1); mWholeFields[i].staticCtrl = stat; } for(i=0; i<mFracFields.GetCount(); i++) { digits = mFracFields[i].digits; if (digits < 1) digits = 5; if (digits > 10) digits = 10; width = sTextWidth[digits]; text = new wxTextCtrl(this, AnyTextCtrlID, wxT(""), wxDefaultPosition, wxSize(width, -1), wxTE_RIGHT); //if (mFracFields[i].digits > 0) // text->SetMaxLength(mFracFields[i].digits); mainSizer->Add(text, 0, wxALL, 0); mFracFields[i].textCtrl = text; stat = new wxStaticText(this, -1, mFracFields[i].label); mainSizer->Add(stat, 0, wxALL | wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT, 1); mFracFields[i].staticCtrl = stat; } SetAutoLayout(true); SetSizer(mainSizer); mainSizer->Fit(this); mainSizer->SetSizeHints(this);}void TimeTextCtrl::ValueToControls(){ long sel0, sel1; double theValue = mTimeValue * mScalingFactor; int t_int = int(theValue); double t_frac = (theValue - t_int); wxString str; unsigned int i; mModifyingText = true; for(i=0; i<mWholeFields.GetCount(); i++) { int value = (t_int / mWholeFields[i].base); if (mWholeFields[i].range > 0) value = value % mWholeFields[i].range; str.Printf(mWholeFields[i].formatStr, value); if (mWholeFields[i].str != str) { mWholeFields[i].str = str; mWholeFields[i].textCtrl->GetSelection(&sel0, &sel1); mWholeFields[i].textCtrl->SetValue(str); mWholeFields[i].textCtrl->SetSelection(sel0, sel1); } } for(i=0; i<mFracFields.GetCount(); i++) { int value = (int)(t_frac * mFracFields[i].base); if (mFracFields[i].range > 0) value = value % mFracFields[i].range; str.Printf(mFracFields[i].formatStr, value); if (mFracFields[i].str != str) { mFracFields[i].str = str; mFracFields[i].textCtrl->GetSelection(&sel0, &sel1); mFracFields[i].textCtrl->SetValue(str); mFracFields[i].textCtrl->SetSelection(sel0, sel1); } } mModifyingText = false;}void TimeTextCtrl::ControlsToValue(){ unsigned int i; double t = 0.0; for(i=0; i<mWholeFields.GetCount(); i++) { long val; mWholeFields[i].str = mWholeFields[i].textCtrl->GetValue(); mWholeFields[i].str.ToLong(&val); t += (val * (double)mWholeFields[i].base); } for(i=0; i<mFracFields.GetCount(); i++) { long val; mFracFields[i].str = mFracFields[i].textCtrl->GetValue(); mFracFields[i].str.ToLong(&val); t += (val / (double)mFracFields[i].base); } t /= mScalingFactor; mTimeValue = t;}void TimeTextCtrl::OnText(wxCommandEvent &event){ // Don't trigger an event if we were the ones who modified the text if (mModifyingText) { return; } double oldValue = mTimeValue; ControlsToValue(); if (oldValue == mTimeValue) return; //Create an event for the parent window to process. wxCommandEvent *e = new wxCommandEvent(wxEVT_COMMAND_TEXT_UPDATED, GetId()); GetParent()->AddPendingEvent(*e); delete e;}bool TimeTextCtrl::HasAnyFocus(){ unsigned int i; wxWindow *focus = FindFocus(); if (focus == this) return true; for(i=0; i<mWholeFields.GetCount(); i++) if (focus == mWholeFields[i].textCtrl) return true; for(i=0; i<mFracFields.GetCount(); i++) if (focus == mFracFields[i].textCtrl) return true; return false;}void TimeTextCtrl::ComputeTextExtents(){ // Figure out the font used in text controls, and measure it to // determine how many pixels wide (and tall) we need to make a // TextCtrl in order to have room for any number of digits // from 1 to 10. Because the text control has a margin and border, // we need to add some constant pixels to this, which is currently // a hardcoded number per platform. #if defined(__WXGTK__) int xBorder = 2; int yBorder = 2; #elif defined(__WXMSW__) int xBorder = 6; int yBorder = 2; #elif defined(__WXMAC__) int xBorder = 2; int yBorder = 2; #else int xBorder = 2; int yBorder = 2; #endif wxChar str[11]; wxTextCtrl *text; wxCoord width=0, height=0; unsigned int i; text = new wxTextCtrl(this, -1, wxT("")); wxTextAttr attr = text->GetDefaultStyle(); wxMemoryDC dc; wxBitmap bitmap(300, 100); dc.SelectObject(bitmap); if (attr.HasFont()) dc.SetFont(attr.GetFont()); else dc.SetFont(text->GetFont()); for(i=0; i<=10; i++) { str[i] = wxT('0'); str[i+1] = 0; dc.GetTextExtent(str, &width, &height); sTextWidth[i] = width + xBorder; sTextHeight = height + yBorder; } text->Destroy();}// Indentation settings for Vim and Emacs.// Please do not modify past this point.//// Local Variables:// c-basic-offset: 3// indent-tabs-mode: nil// End://// vim: et sts=3 sw=3//
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -