TNB Library
TnbMfcEditAscii.h
[詳解]
1#pragma once
11#include "TnbMfcCommon.h"
12#include <imm.h>
13#ifndef _WIN32_WCE
14 #pragma comment(lib,"imm32.lib")
15#endif
16
17
18
19//TNB Library
20namespace TNB {
21namespace MFC {
22
23
24
47class CEditAscii : public CEdit
48{
49 DEFSUPER(CEdit);
50public:
51
53 CEditAscii(void) : _super(), m_boCanCutPaste(true), m_boCanCallUpdate(true), m_boIsPasting(false)
54 , m_strValidChars( _T("!\x22#$%&'()=~|")
55 _T("1234567890-^\\")
56 _T("@[;:],./")
57 _T("`{+*}<>?_")
58 _T("abcdefghijklmnopqrstuvwxyz")
59 _T("ABCDEFGHIJKMNLOPQRSTUVWXYZ")
60 _T(" ") )
61 {
62 }
63
68 CEditAscii(LPCTSTR lpszValidChars) : _super(), m_boCanCutPaste(true), m_boCanCallUpdate(true), m_boIsPasting(false)
69 , m_strValidChars(lpszValidChars)
70 {
71 }
72
74 virtual ~CEditAscii()
75 {
76 }
77
82 CString GetText(void) const
83 {
84 CString s;
85 _super::GetWindowText(s);
86 return s;
87 }
88
95 void SetText(LPCTSTR lpszText, bool boIsNomoveSel = false)
96 {
97 if ( ! boIsNomoveSel )
98 {
99 _super::SetWindowText(lpszText);
100 }
101 else
102 {
103 int iCurSel = LOWORD(_super::GetSel());
104 _super::SetWindowText(lpszText);
105 _super::SetSel(iCurSel, iCurSel);
106 }
107 }
108
113 void SetValidChars(LPCTSTR chars)
114 {
115 m_strValidChars = chars;
116 }
117
122 CString GetValidChars(void) const
123 {
124 return m_strValidChars;
125 }
126
133 void SetCutPasteMode(bool r)
134 {
135 m_boCanCutPaste = r;
136 }
137
138protected:
139
146 virtual void PreSubclassWindow(void)
147 {
148 ::ImmAssociateContext(_super::m_hWnd, NULL); // IME入力禁止
149 _super::PreSubclassWindow();
150 }
151
161 virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
162 {
163 if ( message == WM_SETTEXT )
164 {
165 LRESULT l = _super::WindowProc(message, wParam, lParam);
166// GetParent()->SendMessage(WM_COMMAND, MAKEWPARAM(_super::GetDlgCtrlID(), EN_UPDATE), (LPARAM)m_hWnd);
167 MFCLIB::SendCommandMessage(this, EN_UPDATE);
168 return l;
169 }
170 else if ( message == WM_KEYDOWN )
171 {
172 if ( wParam == VK_TAB && ::GetAsyncKeyState(VK_CONTROL) < 0 )
173 {
174 return 0;
175 }
176 }
177 else if ( message == WM_CHAR )
178 {
179 if ( wParam == VK_TAB )
180 {
181 return 0;
182 }
183 UINT wp = down_cast<UINT>(wParam);
184 LONG lp = down_cast<LONG>(lParam);
185 if ( ! IsValidChar(wp, lp, GetText()) )
186 {
188 return 0;
189 }
190 }
191 else if ( message == WM_PASTE )
192 {
193 if ( ! m_boCanCutPaste )
194 {
195 return 0;
196 }
197 m_boIsPasting = true;
198 _super::SetRedraw(FALSE);
199 LRESULT l = _super::WindowProc(message, wParam, lParam);
200 m_boIsPasting = false;
201 _super::SetRedraw(TRUE);
202 _super::Invalidate();
203 return l;
204 }
205 else if ( message == WM_CONTEXTMENU )
206 {
207 if ( ! m_boCanCutPaste )
208 {
209 return 0;
210 }
211 }
212 else if ( message == WM_LBUTTONDOWN )
213 {
214 #ifdef _WIN32_WCE
215 return _super::DefWindowProc(message, wParam, lParam);
216 #endif
217 }
218 return _super::WindowProc(message, wParam, lParam);
219 }
220
234 virtual BOOL OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* _pResult)
235 {
236 if ( message == WM_COMMAND && lParam == reinterpret_cast<LPARAM>(m_hWnd) )
237 {
238 if ( m_boCanCallUpdate )
239 {
240 m_boCanCallUpdate = false;
241 int ctrlID = _super::GetDlgCtrlID();
242 if ( wParam == MAKEWPARAM(ctrlID, EN_UPDATE) )
243 {
244 if ( m_boIsPasting )
245 {
246 OnPasteChar();
247 }
248 OnUpdateChar();
249 }
250 else if ( wParam == MAKEWPARAM(ctrlID, EN_SETFOCUS) )
251 {
252 OnEditStart();
253 }
254 else if ( wParam == MAKEWPARAM(ctrlID, EN_KILLFOCUS) )
255 {
256 OnEditEnd();
257 }
258 m_boCanCallUpdate = true;
259 }
260 }
261 return _super::OnChildNotify(message, wParam, lParam, _pResult);
262 }
263
267 virtual void OnPasteChar(void)
268 {
269 CString s = GetText();
270 LONG lTemp = 0;
271 UINT nChar;
272 //
273 int i = 0;
274 bool boHasInvalidChar = false;
275 while ( i < s.GetLength() )
276 {
277 nChar = s[i];
278 _super::SetSel(i, i);
279 if ( ! IsValidChar(nChar, lTemp, s.Left(i)) )
280 {
281 s.Delete(i);
282 boHasInvalidChar = true;
283 }
284 else
285 {
286 s.SetAt(i, static_cast<TCHAR>(nChar));
287 i++;
288 }
289 }
290 if ( boHasInvalidChar )
291 {
293 }
294 SetText(s);
295 _super::SetSel(i, i);
296 }
297
306 virtual bool IsValidChar(UINT& _nChar, LONG& _lFlags, const CString& strNowText)
307 {
308 bool r = (_lFlags & 1) != 0;
309 if ( r && _nChar == 0x03 ) //Ctrl + C
310 {
311 return true;
312 }
313 if ( m_boCanCutPaste )
314 {
315 if ( r && _nChar == 0x18 ) //Ctrl + X
316 {
317 return true;
318 }
319 if ( r && _nChar == 0x16 ) //Ctrl + V
320 {
321 return true;
322 }
323 }
324 if ( _nChar == '\b' || _nChar == VK_RETURN )
325 {
326 return true;
327 }
328 if ( m_strValidChars.Find(static_cast<TCHAR>(_nChar)) >= 0 )
329 {
330 return true;
331 }
332 return false;
333 }
334
338 virtual void OnInputInvalidChar(void)
339 {
340 ::MessageBeep(MB_OK);
341 }
342
348 virtual void OnUpdateChar(void)
349 {
350 }
351
357 virtual void OnEditStart(void)
358 {
359 }
360
366 virtual void OnEditEnd(void)
367 {
368 }
369
370private:
371 bool m_boCanCutPaste;
372 CString m_strValidChars;
373 bool m_boCanCallUpdate;
374 bool m_boIsPasting;
375};
376
377
378
389class CEditHex : public CEditAscii
390{
391 DEFSUPER(CEditAscii);
392public:
393
395 CEditHex(void) : _super()
396 {
397 _super::SetValidChars(_T("1234567890") _T("abcdef") _T("ABCDEF"));
398 }
399
400protected:
409 virtual bool IsValidChar(UINT& _nChar, LONG& _lFlags, const CString& strNowText)
410 {
411 if ( _nChar >= 'a' && _nChar <= 'f' )
412 {
413 _nChar -= ('a' - 'A');
414 }
415 return _super::IsValidChar(_nChar, _lFlags, strNowText);
416 }
417};
418
419
420
433{
434 DEFSUPER(CEditAscii);
435public:
436
438 CEditFileName(void) : _super()
439 {
440 _super::SetValidChars(
441 _T("!#$%&'()=~")
442 _T("1234567890-^")
443 _T("@[;],.")
444 _T("`{+}_")
445 _T("abcdefghijklmnopqrstuvwxyz")
446 _T("ABCDEFGHIJKMNLOPQRSTUVWXYZ")
447 _T(" ") );
448 }
449};
450
451
452
453}; //MFC
454}; //TNB
MFCコントロール共通のヘッダ
Editコントロール.
ASCII文字専用Editコントロール
void SetText(LPCTSTR lpszText, bool boIsNomoveSel=false)
[設定] 文字列設定
virtual BOOL OnChildNotify(UINT message, WPARAM wParam, LPARAM lParam, LRESULT *_pResult)
[通知] for notifications from parent
void SetValidChars(LPCTSTR chars)
[設定] 入力可能文字設定.
virtual void OnInputInvalidChar(void)
[通知] 禁止文字入力発生時に通知.
virtual void OnEditStart(void)
[通知] フォーカスを得た時に通知
virtual void OnPasteChar(void)
[通知] ペーストされた時
virtual bool IsValidChar(UINT &_nChar, LONG &_lFlags, const CString &strNowText)
[確認] 入力許可チェック
virtual void PreSubclassWindow(void)
[通知] subclassing/unsubclassing functions.
CEditAscii(void)
コンストラクタ
virtual ~CEditAscii()
デストラクタ
virtual LRESULT WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
[通知] for processing Windows messages.
CEditAscii(LPCTSTR lpszValidChars)
コンストラクタ
virtual void OnEditEnd(void)
[通知] フォーカスを失った時に通知
virtual void OnUpdateChar(void)
[通知] 入力時に通知
CString GetValidChars(void) const
[取得] 入力可能文字取得.
void SetCutPasteMode(bool r)
[設定] カットペーストモード.
CString GetText(void) const
[取得] 入力文字取得
ASCIIファイル名Editコントロール
CEditFileName(void)
コンストラクタ
HEX文字オンリーEditコントロール
virtual bool IsValidChar(UINT &_nChar, LONG &_lFlags, const CString &strNowText)
[確認] 入力許可チェック
CEditHex(void)
コンストラクタ
LRESULT SendCommandMessage(CWnd *pCtrl, UINT cmd)
[処理] WM_COMMAND送信.
Definition: TnbMfcCommon.h:475
TNB Library
Definition: TnbDoxyTitle.txt:2