17 #define _TnbEDIT_Spin_Horz
74template<
typename TYP, LONGLONG TMIN, LONGLONG TMAX>
84 : _super(_T(
"-0123456789")), m_boOnPaint(false),
m_iZeroPlace(0)
92 if ( ::IsWindow(*
this) )
94 _super::DestroyWindow();
105 LONGLONG l =
AdjustValue(
static_cast<LONGLONG
>(xValue));
171 m_xMin =
static_cast<LONGLONG
>(xMin);
172 m_xMax =
static_cast<LONGLONG
>(xMax);
208 if ( ! ::IsWindow(m_spin) )
211 _super::GetClientRect(&rect);
212 m_spinHeight = rect.Height();
213 DWORD style = UDS_ALIGNRIGHT | UDS_ARROWKEYS | UDS_NOTHOUSANDS;
214 #ifdef _TnbEDIT_Spin_Horz
217 m_spin.Create(style, rect,
this, 1000);
225 m_spin.SetAccel(4, udacl);
226 m_spin.SetRange(10000, -10000);
228 m_AdjustSpinAndEdit();
245 virtual BOOL
OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* _pResult)
247 NMUPDOWN* pNmUpDown =
reinterpret_cast<NMUPDOWN *
>(lParam);
248 if ( pNmUpDown->hdr.code == UDN_DELTAPOS )
250 if ( pNmUpDown->iDelta != 0 )
252 m_SetDelta(pNmUpDown->iDelta);
257 return _super::OnNotify(wParam, lParam, _pResult);
274 virtual BOOL
OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* _pResult)
276 if ( message == WM_CTLCOLORSTATIC || message == WM_CTLCOLOREDIT )
278 if ( ::IsWindow(m_spin) && m_spin.IsWindowVisible() )
280 HDC dc =
reinterpret_cast<HDC
>(wParam);
284 _super::ClientToScreen(&winPos);
290 _super::GetWindowRect(&winRect);
291 winPos = winRect.TopLeft();
294 m_spin.GetWindowRect(&spinRect);
295 CPoint po = spinRect.TopLeft() - winPos;
296 HRGN rgn = ::CreateRectRgnIndirect(CRect(po, spinRect.Size()));
297 ::ExtSelectClipRgn(dc, rgn, RGN_DIFF);
301 return _super::OnChildNotify(message, wParam, lParam, _pResult);
315 virtual LRESULT
WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
317 if ( ::IsWindow(m_spin) )
319 if ( message == WM_TIMER )
321 if ( lParam == TIMERID_SPIN_REPOS )
323 KillTimer(TIMERID_SPIN_REPOS);
324 m_AdjustSpinAndEdit();
327 else if ( message == 0x031A )
329 SetTimer(TIMERID_SPIN_REPOS, 1, NULL);
331 else if ( message == WM_MOUSEWHEEL )
333 short d = HIWORD(wParam);
341 else if ( message == WM_KEYDOWN || message == WM_KEYUP )
343 if ( wParam == VK_DOWN || wParam == VK_UP )
345 UINT msg = (message == WM_KEYDOWN) ? WM_LBUTTONDOWN : WM_LBUTTONUP;
346 #ifndef _TnbEDIT_Spin_Horz
348 int y = (wParam == VK_DOWN) ? m_spinHeight - 1 : 0;
350 int x = (wParam == VK_DOWN) ? m_spinHeight + 1 : 0;
353 m_spin.SendMessage(msg, 0, MAKELONG(x, y));
357 if ( message == WM_KEYDOWN && (wParam == VK_LEFT || wParam == VK_RIGHT) )
360 LRESULT r = _super::WindowProc(message, wParam, lParam);
361 CWnd* pPrev = GetParent();
362 if ( s1 == GetSel() && pPrev != NULL )
364 CWnd* P = pPrev->GetNextDlgTabItem(
this, (wParam == VK_LEFT));
367 LRESULT cd = P->SendMessage(WM_GETDLGCODE);
368 if ( (cd & DLGC_HASSETSEL) != 0 )
370 P->SendMessage(EM_SETSEL, 0, 0x7FFFFFFE);
379 else if ( message == WM_PAINT || message == WM_PRINT )
382 LRESULT r = _super::WindowProc(message, wParam, lParam);
383 m_spin.RedrawWindow(NULL, NULL, RDW_INVALIDATE | RDW_UPDATENOW);
386 else if ( message == WM_DESTROY )
388 m_spin.SetParent(GetParent());
390 else if ( message == WM_PRINTCLIENT )
393 LRESULT r = _super::WindowProc(message, wParam, lParam);
394 if ( m_spin.IsWindowVisible() )
396 HDC dc =
reinterpret_cast<HDC
>(wParam);
398 _super::ClientToScreen(&winPos);
399 CPoint clientPos(0, 0);
400 m_spin.ClientToScreen(&clientPos);
402 ::GetWindowOrgEx(dc, &orgOrg);
403 CPoint po = orgOrg - (clientPos - winPos);
404 ::SetWindowOrgEx(dc, po.x, po.y, NULL);
405 m_spin.SendMessage(WM_PRINT, wParam, lParam);
406 ::SetWindowOrgEx(dc, orgOrg.x, orgOrg.y, NULL);
411 else if ( message == EM_SETREADONLY )
413 m_spin.EnableWindow(wParam == 0);
415 else if ( message == WM_ENABLE )
417 m_spin.EnableWindow(wParam != 0);
419 else if ( message == WM_GETDLGCODE )
422 return _super::WindowProc(message, wParam, lParam) | DLGC_WANTARROWS;
426 return _super::WindowProc(message, wParam, lParam);
437 virtual bool IsValidChar(UINT& _nChar, LONG& _lFlags,
const CString& strNowText)
445 DWORD g =_super::GetSel();
446 if ( strNowText.Find(
'-') >= 0 )
448 if ( LOWORD(g) == 0 && HIWORD(g) > 0 )
454 return LOWORD(g) == 0;
456 return _super::IsValidChar(_nChar, _lFlags, strNowText);
478 ::MessageBeep(MB_ICONASTERISK);
488 CString s = _super::GetText();
494 if ( _super::GetText() != s )
500 ::MessageBeep(MB_ICONASTERISK);
529 str.Format(_T(
"%I64d"), ll);
595 TIMERID_SPIN_REPOS = 1
598 CSpinButtonCtrl m_spin;
605 void m_SetDelta(
int delta)
607 if ( (
GetStyle() & ES_READONLY) != 0 )
611 ASSERTLIB( delta != 0 );
613 LONGLONG d0 = (d < 0) ? -d : d;
640 void m_AdjustSpinAndEdit(
void)
643 _super::GetClientRect(&rect);
645 m_spin.GetWindowRect(&rc);
647 ASSERT( rc.Height() == m_spinHeight );
648 #ifdef _TnbEDIT_Spin_Horz
652 _super::SetMargins(3, 3 + h);
654 m_spin.ShowWindow(SW_SHOW);
802template<
typename TYP,
size_t WIDTH>
811 _super::SetValidChars(_T(
"1234567890") _T(
"abcdef") _T(
"ABCDEF"));
820 _super::AddSpinButton(dummy);
828 ReferSpinButton().SetAccel(4, udacl);
841 s.Format(_T(
"%08I64X"), ll);
842 return s.Right(WIDTH);
857 if ( c >=
'a' && c <=
'f' )
861 else if ( c >=
'A' && c <=
'F' )
865 else if ( c >=
'0' && c <=
'9' )
970template<
typename TYP>
981 if ( _super::GetText().IsEmpty() )
983 _super::SetValue(
static_cast<TYPE
>(_super::m_xMin));
994 _super::SetText(
ToString(_super::m_xMin));
995 _super::PreSubclassWindow();
1004 if ( _super::GetText().IsEmpty() )
1006 _super::SetValue(
static_cast<TYPE
>(_super::m_xMin));
1008 _super::OnEditEnd();
DWORD GetStyle(void) const
[取得] ウィンドウスタイル取得.
タップ&ホールドジェスチャー禁止アドイン(CE専用).
void SetText(LPCTSTR lpszText, bool boIsNomoveSel=false)
[設定] 文字列設定
CString GetText(void) const
[取得] 入力文字取得
BYTE 型数値 HEX入力 Edit コントロール
CEditHexByte(void)
コンストラクタ
DWORD 型数値 HEX入力 Edit コントロール
CEditHexDword(void)
コンストラクタ
CEditHexValueT(void)
コンストラクタ
virtual CString ToString(LONGLONG ll) const
[変換] 数値から文字列作成
virtual LONGLONG ToInteger(LPCTSTR s) const
[変換] 文字列から数値作成
void AddSpinButton(int dummy=0)
[設定] スピンボタン追加
WORD 型数値 HEX入力 Edit コントロール
CEditHexWord(void)
コンストラクタ
ULONGLONG 型数値 Edit コントロール
CEditULongLong(void)
コンストラクタ
virtual CString ValueToString(TYPE xValue) const
[変換] 値文字列化
virtual BOOL OnNotify(WPARAM wParam, LPARAM lParam, LRESULT *_pResult)
[通知] for notifications from parent
CSpinButtonCtrl & ReferSpinButton(void)
[参照] スピンボタン参照.
virtual void OnChangeRange(void)
[通知] レンジが変わったときにコール
virtual ~CEditValueT(void)
デストラクタ
virtual BOOL OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam, LRESULT *_pResult)
[通知] for notifications from parent
virtual CString ToString(LONGLONG ll) const
[変換] 数値から文字列作成.
void SetPlace(int ii)
[設定] ゼロパディング桁数設定
virtual LONGLONG ToInteger(LPCTSTR s) const
[変換] 文字列から数値作成.
virtual bool GetValue(TYPE &_xValue) const
[取得] 値取得
virtual void SetRange(TYPE xMin, TYPE xMax, TYPE step=0)
[設定] 範囲指定
virtual LONGLONG AdjustValue(LONGLONG l) const
[変換] 数値丸め.
virtual bool IsValidChar(UINT &_nChar, LONG &_lFlags, const CString &strNowText)
[確認] 入力許可チェック
void AddSpinButton(int dummy=0)
[設定] スピンボタン追加
virtual void SetValue(TYPE xValue)
[設定] 値設定
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
[通知] for processing Windows messages.
virtual void OnEditEnd(void)
[通知] フォーカスを失った時にコール
void GetRange(TYPE &_xMin, TYPE &_xMax, TYPE &_step)
[取得] 範囲取得
virtual void OnUpdateChar(void)
[通知] 入力時にコール
TYPE GetValue(void) const
[取得] 値取得
空状態無し 数値入力 Editコントロールテンプレート
virtual void OnChangeRange(void)
[通知] レンジが変わったときにコール
virtual void PreSubclassWindow(void)
[通知] subclassing/unsubclassing functions.
virtual void OnEditEnd(void)
[通知] フォーカスを失った時にコール
bool ChangeClientSize(CWnd *pWnd, int cx=-1, int cy=-1)
[設定] クライアントサイズ設定.
bool SetControlPos(CWnd *pWnd, int x, int y, bool boIsRepaint=false)
[設定] コントロール位置設定.
int ToInt(LPCSTR lpsz, int iBase=10)
[変換] INT変換(ASCII/SJIS用).
void Swap(T &t1, T &t2)
[変換] スワッパー.
CStr ToString(const CSingleSetT< TYP > &v, TCHAR period=_T(','))
[変換] 文字列化.