5

私はwin32 APIを学ぼうとしています:)

DialogBox にエディット テキストを配置しており、0 より大きい浮動小数点数のみを受け入れるようにしたい

リソース ファイルでスタイル「ES_NUMBER」を使用することによってのみ、整数を受け入れる編集テキストを作成できましたが、正の浮動小数点値を受け入れるようにする方法が見つかりません。

4

3 に答える 3

4

EN_CHANGE通知の処理に加えて、ウィンドウをサブクラス化するオプションもあります。これにより、有効なキーストロークを制限し、数字、ドットなどのみを許可することができます。以下の例は、エディット コントロールを作成し、それをサブクラス化し、入力をフィルタリングして特定の文字のみを許可する方法を示しています。クリップボードからの貼り付けなどの操作は処理しないため、特定の要件に合わせて拡張する必要があります。

この方法の利点は、エディット コントロールをフィルター処理するために親ウィンドウにコードを追加する必要がないことです。これにより、多くのコードを複製することなく、アプリケーション全体で使用できます。もう 1 つの利点は、不要な文字を削除するためにコントロールの内容を更新することで発生するちらつきをなくすことです。

static WNDPROC OriginalEditCtrlProc = NULL;

LRESULT CALLBACK MyWindowProc(
    HWND hwnd,
    UINT uMsg,
    WPARAM wParam,
    LPARAM lParam)
{
    if(uMsg == WM_CHAR)
    {
        // Make sure we only allow specific characters
        if(!    ((wParam >= '0' && wParam <= '9')
                || wParam == '.'
                || wParam == VK_RETURN
                || wParam == VK_DELETE
                || wParam == VK_BACK))
        {
            return 0;
        }
    }

    return CallWindowProc(OriginalEditCtrlProc, hwnd, uMsg, wParam, lParam);
}

void CreateCustomEdit(HINSTANCE hInstance, HWND hParent, UINT id)
{
    HWND hwnd;

    hwnd = CreateWindowEx(
        WS_EX_CLIENTEDGE,
        _T("EDIT"),
        _T(""),
        WS_VISIBLE | WS_CHILD | WS_BORDER | ES_LEFT,
        0, 0, 200, 40,
        hParent,
        reinterpret_cast<HMENU>(id),
        hInstance,
        NULL);
    if(hwnd != NULL)
    {
        // Subclass the window so we can filter keystrokes
        WNDPROC oldProc = reinterpret_cast<WNDPROC>(SetWindowLongPtr(
            hwnd,
            GWLP_WNDPROC,
            reinterpret_cast<LONG_PTR>(MyWindowProc)));
        if(OriginalEditCtrlProc == NULL)
        {
            OriginalEditCtrlProc = oldProc;
        }
    }
}
于 2013-05-19T21:49:56.390 に答える
2

C++ には unsigned float がないので、ありえません!

おそらく、明示的に検証する必要があります。

于 2013-05-19T10:57:50.997 に答える