掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
エディットボックスの入力バイト数を指定するには? (ID:60770)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
>参考にしようとしてたどり着きましたが・・・。 >最後に答えは無しですか・・。 一応、作ったコードが残っていたので載せときます。 なんせ1年ほど前なので記憶がほぼないです。 開発環境:WindowsXp Pro SP2/VS2005 Pro ◎ByteLimitEdit.h #pragma once // CByteLimitEdit class CByteLimitEdit : public CEdit { DECLARE_DYNAMIC(CByteLimitEdit) public: CByteLimitEdit(); virtual ~CByteLimitEdit(); protected: DECLARE_MESSAGE_MAP() public: afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags); LRESULT OnPaste( WPARAM, LPARAM ); public: // 入力最大バイト数 unsigned int m_nLimit; public: // 最大入力バイト数 void SetLimitLength(unsigned int nLimit); // 入力可能バイト数 int GetBlankLength(void); // 選択中文字列バイト数取得 int GetSelectionByteLength(void); }; ◎ByteLimitEdit.cpp // ByteLimitEdit.cpp : 実装ファイル // #include "stdafx.h" #include "ByteLimitEditTest.h" #include "ByteLimitEdit.h" #include <afxole.h> // CByteLimitEdit IMPLEMENT_DYNAMIC(CByteLimitEdit, CEdit) CByteLimitEdit::CByteLimitEdit() : m_nLimit(0) { } CByteLimitEdit::~CByteLimitEdit() { } BEGIN_MESSAGE_MAP(CByteLimitEdit, CEdit) ON_WM_CHAR() ON_MESSAGE( WM_PASTE, OnPaste ) END_MESSAGE_MAP() // CByteLimitEdit メッセージ ハンドラ void CByteLimitEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags) { // TODO: ここにメッセージ ハンドラ コードを追加するか、既定の処理を呼び出します。 if ( m_nLimit && !_istcntrl( nChar ) ) { int nBlank = this->GetBlankLength(); if ( nBlank <= 0 ) { ::MessageBeep( MB_OK ); return; } if ( nBlank == 1 ) { #ifdef _UNICODE // ※UNICODEサロゲート無視! WCHAR szTemp[ 2 ] = { nChar }; if ( ::WideCharToMultiByte( CP_ACP, 0, szTemp, -1, NULL, 0, NULL, NULL ) > 2 ) { ::MessageBeep( MB_OK ); return; } #else static bool bMultiByteChar = false; if ( !bMultiByteChar && _ismbblead( nChar ) ) { bMultiByteChar = true; ::MessageBeep( MB_OK ); return; } if ( bMultiByteChar ) { bMultiByteChar = false; return; } #endif } } CEdit::OnChar(nChar, nRepCnt, nFlags); } // 最大入力バイト数 void CByteLimitEdit::SetLimitLength(unsigned int nLimit) { m_nLimit = nLimit; } // 入力可能バイト数 int CByteLimitEdit::GetBlankLength(void) { return m_nLimit - ::GetWindowTextLengthA( m_hWnd ) + this->GetSelectionByteLength(); } // 選択中文字列バイト数取得 int CByteLimitEdit::GetSelectionByteLength(void) { int nStart, nEnd; this->GetSel( nStart, nEnd ); const int nLength = nEnd - nStart; if ( !nLength ) { return 0; } // 現在のテキストの取得 LPSTR lpszBuff = new CHAR[ m_nLimit + 1 ]; ::GetWindowTextA( m_hWnd, lpszBuff, m_nLimit + 1 ); // 選択開始位置までインクリメント UCHAR* p = _mbsninc( static_cast< const UCHAR* >( static_cast< const void* >( lpszBuff ) ), nStart ); // 終了位置よりバイト数を算出 int nByteLength = static_cast< int >( _mbsninc( p, nLength ) - p ); delete [] lpszBuff; return nByteLength; } HRESULT CByteLimitEdit::OnPaste( WPARAM, LPARAM ) { COleDataObject obj; if ( obj.AttachClipboard() && obj.IsDataAvailable( CF_TEXT ) ) { HGLOBAL hMem = obj.GetGlobalData( CF_TEXT ); LPCSTR lpszText = ( LPCSTR )::GlobalLock( hMem ); size_t nLength = strlen( lpszText ); ::GlobalUnlock( hMem ); if ( GetBlankLength() >= static_cast< int >( nLength ) ) { return Default(); } } ::MessageBeep( MB_OK ); return 0; }
←解決時は質問者本人がここをチェックしてください。
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.