Win32 API:如何使编辑文本仅在c ++中接受无符号浮点数?

时间:2013-05-19 10:54:26

标签: c++ winapi textbox

我正在尝试学习win32 api:)

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

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

3 个答案:

答案 0 :(得分:4)

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

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

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;
        }
    }
}

答案 1 :(得分:3)

使用EN_UPDATE通知,如果用户键入减号,只需将其删除即可。净效果将正是您想要的:一个只接受正浮动的控件。不要使用EN_CHANGE因为在重绘控件后发送,然后更改输入将需要另一次重绘,这会给控件闪烁的印象。

答案 2 :(得分:2)

c ++中没有unsigned float,所以不可能!

您可能需要明确验证。