エディットBOXの入力制限について

[戻る]
まさ 2005/06/21(火) 12:47:33
WindowsXP SP2
VC++6.0

ダイアログベースのアプリケーションを開発しております。
そこでお聞きしたいのですが、
エディットBOXがいくつか存在しており、数値のみ入力させたいのですが、
ある文字をコピーし、貼り付けをするとエディットBOXに入力されてしまいます。
(キーボードでの入力は受け付けないようチェックしております)

文字は入力不可という仕様なので、貼り付け不可能にしたいのですが、
何か良い実現方法がありましたら、教えて頂けると助かります。

宜しくお願い致します。

tib 2005/06/21(火) 13:41:41
・CWnd::PreTransMessage( MSG* pMsg )をつかって、
・pMsg->message == WM_CHAR の時に、
・pMsg->wParam が数字であるかどうかを調べて、
・もし数字でなかったら即刻return TRUEする。

で行けると思います。

まさ 2005/06/21(火) 15:17:31
回答有難うございました。
確かに貼り付けできなくなりました。

ただ、もう1点問題がありまして、、
右クリックからの貼り付けを選択すると
貼り付けができてしまいます・・。

これは、制限するのは難しいでしょうか・・。

sugar 2005/06/21(火) 15:42:24
エディットコントロールをサブクラス化して、
WM_PASTEをハンドルしてできないかな・・・?

R-Cradle 2005/06/21(火) 15:46:55
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);
    }

R-Cradle 2005/06/21(火) 15:50:07
sugarさんとニアミスしてしまいました。 orz
↑のサンプルは、sugarさんのおっしゃるように、サブクラス化してから追加してくださ
い。

まさ 2005/06/21(火) 16:16:44
[[解決]]
WM_PASTEのハンドラを追加して、
クリップボードのデータを判定する方法で解決いたしました。

sugarさん、R-Cradleさん、アドバイスどうも有難うございました。

古いスレッドには追加発言できません。