WindowsXP SP2
VC++6.0
ダイアログベースのアプリケーションを開発しております。
そこでお聞きしたいのですが、
エディットBOXがいくつか存在しており、数値のみ入力させたいのですが、
ある文字をコピーし、貼り付けをするとエディットBOXに入力されてしまいます。
(キーボードでの入力は受け付けないようチェックしております)
文字は入力不可という仕様なので、貼り付け不可能にしたいのですが、
何か良い実現方法がありましたら、教えて頂けると助かります。
宜しくお願い致します。
・CWnd::PreTransMessage( MSG* pMsg )をつかって、
・pMsg->message == WM_CHAR の時に、
・pMsg->wParam が数字であるかどうかを調べて、
・もし数字でなかったら即刻return TRUEする。
で行けると思います。
回答有難うございました。
確かに貼り付けできなくなりました。
ただ、もう1点問題がありまして、、
右クリックからの貼り付けを選択すると
貼り付けができてしまいます・・。
これは、制限するのは難しいでしょうか・・。
エディットコントロールをサブクラス化して、
WM_PASTEをハンドルしてできないかな・・・?
WM_PASTEのハンドラを追加して、クリップボードのデータを判定してみては。
具体的には、COleDataObjectを使ってクリップボードのデータを調べます。言葉では説
明しにくいので、
簡単なサンプルを。エラー処理は省いてありますので、参考程度に。
// 単純に不正な文字を含む貼り付けを無効にする例
COleDataObject obj;
if (obj.AttachClipboard() && obj.IsDataAvailable(CF_TEXT)) {
HGLOBAL hMem = obj.GetGlobalData(CF_TEXT);
LPCTSTR psz = (LPCTSTR)::GlobalLock(hMem);
CString sPaste(psz);
::GlobalUnlock(hMem);
// ここで、貼り付け文字列sPasteを判定する。
if (不正な文字は含まれていない)
Default();
else
MessageBeep((UINT)-1);
}
sugarさんとニアミスしてしまいました。 orz
↑のサンプルは、sugarさんのおっしゃるように、サブクラス化してから追加してくださ
い。
WM_PASTEのハンドラを追加して、
クリップボードのデータを判定する方法で解決いたしました。
sugarさん、R-Cradleさん、アドバイスどうも有難うございました。