5

我正在尝试学习win32 api :)

我在 DialogBox 中放置了一些编辑文本,我希望它只接受大于 0 的浮点数

我只能通过在资源文件中使用样式“ES_NUMBER”来使编辑文本接受整数,但我找不到任何方法让它接受正浮点值,我需要你的帮助谢谢

4

3 回答 3

4

除了处理EN_CHANGE通知之外,您还可以选择子类化窗口。这将允许您限制哪些击键是有效的,并且只允许数字、点等。下面的示例显示了如何创建一个编辑控件、对其进行子类化和过滤输入,以便只允许特定的字符。它不处理诸如从剪贴板粘贴之类的操作,因此您需要对其进行扩展以满足您的特定要求。

这种方法的好处是您不需要向父窗口添加任何额外的代码来过滤编辑控件。这使您可以在整个应用程序中使用它,而无需复制大量代码。另一个好处是它消除了更新控件内容以删除不需要的字符时可能出现的闪烁。

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 回答
3

使用 EN_UPDATE 通知,如果用户键入减号,只需将其删除。最终效果将正是您想要的:一个只接受正浮点数的控件。不要使用 EN_CHANGE,因为它是在重绘控件之后发送的,然后更改输入将需要再次重绘,这将给人以控件闪烁的印象。

于 2013-05-19T20:27:09.537 回答
2

c++ 中没有无符号浮点数,所以不可能!

您可能必须明确验证。

于 2013-05-19T10:57:50.997 回答