TNB Library
TnbMfcEditFloat.h
[詳解]
1#pragma once
11#include "TnbMfcEditValue.h"
12#include <math.h>
13#include <wchar.h>
14
15
16
17//TNB Library
18namespace TNB {
19namespace MFC {
20
21
22
23#ifndef _TnbDOXYGEN
24
26template<UINT n> struct TPowerValue {
27 enum {
28 VALUE = TPowerValue<n - 1>::VALUE * 10
29 };
30};
31template<> struct TPowerValue<0> {
32 enum {VALUE = 1};
33};
34#define _POW10(X) (TPowerValue<X>::VALUE)
35
36#endif //_TnbDOXYGEN
37
38
39
61template<int POW = 1>
62class CEditFloatT : public CEditValueT<double, 0, 0>
63{
65protected:
66 enum { POWER = _POW10(POW) };
75 virtual bool IsValidChar(UINT& _nChar, LONG& _lFlags, const CString& strNowText)
76 {
77 if ( _nChar == '.' && strNowText.Find('.') < 0 )
78 {
79 return true;
80 }
81 return _super::IsValidChar(_nChar, _lFlags, strNowText);
82 }
83
88 virtual void OnUpdateChar(void)
89 {
90 }
91
96 virtual void OnEditEnd(void)
97 {
98 CString s = _super::GetText();
99 if ( ! s.IsEmpty() )
100 {
101 double d = _tcstod(s, NULL);
102 double dd = d;
103 double mx = static_cast<double>(m_xMax) / POWER;
104 double mn = static_cast<double>(m_xMin) / POWER;
105 if ( d > mx )
106 {
107 d = mx;
108 }
109 else if ( d < mn )
110 {
111 d = mn;
112 }
113 LONGLONG i = ToInteger(s);
114 LONGLONG ii = AdjustValue(i);
116 if ( i != ii || d != dd )
117 {
118 ::MessageBeep(MB_ICONASTERISK); //入力制限より内容が変化した時
119 }
120 }
121 }
122
129 virtual CString ToString(LONGLONG ll) const
130 {
131 double r = static_cast<double>(ll) / POWER;
132 CString str;
133 if ( m_iZeroPlace > 0 )
134 {
135 CString s;
136 s.Format(_T("%%0%d.%df"), m_iZeroPlace, POW);
137 str.Format(s, r);
138 }
139 else
140 {
141 CString s;
142 s.Format(_T("%%.%df"), POW);
143 str.Format(s, r);
144 }
145 return str;
146 }
147
154 virtual LONGLONG ToInteger(LPCTSTR s) const
155 {
156 double d = _tcstod(s, NULL) * POWER;
157 d += (d < 0.0) ? -0.5 : 0.5;
158 return static_cast<LONGLONG>(d);
159 }
160
161public:
162
165 {
166 m_xMin = 0;
167 m_xMax = 0;
168 m_step = 1;
169 }
170
176 virtual CString ValueToString(double xValue) const
177 {
178 double d = xValue * POWER;
179 d += (d < 0.0) ? -0.5 : 0.5;
180 LONGLONG l = AdjustValue(static_cast<LONGLONG>(d));
181 return ToString(l);
182 }
183
188 virtual void SetValue(double xValue)
189 {
191 }
192
199 virtual bool GetValue(double& _xValue) const
200 {
201 CString s = _super::GetText();
202 if ( s.IsEmpty() )
203 {
204 return false;
205 }
206 _xValue = static_cast<double>(AdjustValue(ToInteger(s))) / POWER;
207 return true;
208 }
209
216 virtual void SetRange(double xMin, double xMax, double step = 0.0)
217 {
218 m_xMin = static_cast<LONGLONG>(xMin * POWER);
219 m_xMax = static_cast<LONGLONG>(xMax * POWER);
220 if ( m_xMin > m_xMax )
221 {
223 }
224 if ( step <= 0.0 )
225 {
226 step = 1.0 / POWER;
227 }
228 m_step = static_cast<int>(step * POWER);
229 }
230};
231
232
233
234}; //MFC
235}; //TNB
236
数値専用入力Edit関係のヘッダ
void SetText(LPCTSTR lpszText, bool boIsNomoveSel=false)
[設定] 文字列設定
CString GetText(void) const
[取得] 入力文字取得
小数点付き数値専用Editコントロールテンプレート
virtual void SetValue(double xValue)
[設定] 値設定
virtual CString ValueToString(double xValue) const
[変換] 値文字列化
virtual CString ToString(LONGLONG ll) const
[変換] 数値から文字列作成.
virtual LONGLONG ToInteger(LPCTSTR s) const
[変換] 文字列から数値作成.
virtual bool IsValidChar(UINT &_nChar, LONG &_lFlags, const CString &strNowText)
[確認] 入力許可チェック
virtual void SetRange(double xMin, double xMax, double step=0.0)
[設定] 範囲指定
virtual void OnEditEnd(void)
[通知] フォーカスを失った時にコール
virtual void OnUpdateChar(void)
[通知] 入力時にコール
virtual bool GetValue(double &_xValue) const
[取得] 値取得
CEditFloatT(void)
コンストラクタ
数値専用 Edit コントロールテンプレート
int m_iZeroPlace
ゼロパディング
LONGLONG m_xMin
入力可能最小値
virtual LONGLONG AdjustValue(LONGLONG l) const
[変換] 数値丸め.
virtual bool IsValidChar(UINT &_nChar, LONG &_lFlags, const CString &strNowText)
[確認] 入力許可チェック
LONGLONG m_xMax
入力可能最大値
void Swap(T &t1, T &t2)
[変換] スワッパー.
Definition: TnbDef.h:963
TNB Library
Definition: TnbDoxyTitle.txt:2