3

简介及相关资料:

我有一个edit control只需要接受带符号的十进制数字(类似-12.35)。

我决定通过subclassing.

WM_CHAR处理程序似乎运行良好,我需要处理其他几条消息以完全保护用户不输入无效文本。一个这样的消息是WM_PASTE

到目前为止,我能够正确地从中获取文本clipboard并丢弃或传递消息,具体取决于复制的字符串是否确实是十进制数。

编辑控件将输入限制为 12 个字符。这是通过EM_SETLIMITTEXT消息完成的。

我使用pure WinapiC++boost不允许使用诸如etc之类的库。

问题:

到目前为止,我测试了编辑控件为空的情况,如果内容无效则放弃粘贴。但是,用户可以在编辑控件中选择部分文本,然后进行粘贴。像这样的东西(灰色字符代表选择):

编辑控件中的文本: 123 45678.9

剪贴板文本: -1A

如果我允许粘贴,结果字符串将是 123-1A78.9,这是无效格式。

这是我需要帮助的部分:

我的解析正确地识别了有效格式,但我不知道如何正确地将两个字符串合并为一个,以便我可以测试它。

问题:

  1. 如何正确形成粘贴的结果字符串,以便测试其有效性?

  2. 有没有可以为我做有效性测试的功能(它应该知道语言环境!)?

注意:我不介意自己解析文本,但如果不需要,为什么要“重新发明轮子”?

我为解决这个问题所做的努力:

  1. 通过 Internet 浏览,我发现了许多std::连接/切断/等字符串的函数,但它们似乎都不能满足我形成结果字符串的需求。我找到的最接近的东西是,string:: insert(...)但我不知道如何使用它。

  2. 至于第二个问题,我std:: strtod是通过浏览StackOverflow问题发现的,似乎可以用来检查字符串的有效性。而且它似乎也可以感知语言环境,但我不确定它是否是我所寻求的。

为了使这篇文章尽可能简短,我提供了指向我的这个问题的链接,其中包含相关的代码片段。

感谢您的时间和帮助。

如果需要更多信息,我会更新帖子。

此致。

4

1 回答 1

2

尝试这样的事情:

case WM_PASTE:
{
    std::wstring cbtext;

    if( !OpenClipboard(hwnd) ) // open clipboard
        return 0;

    // get clipboard data
    HANDLE hClipboardData = GetClipboardData(CF_UNICODETEXT);
    if( hClipboardData )
    {
        // Call GlobalLock so that to retrieve a pointer
        // to the data associated with the handle returned
        // from GetClipboardData.

        cbtext = (LPWSTR) GlobalLock(hClipboardData);

        // Unlock the global memory.
        GlobalUnlock(hClipboardData);
    }

    // Finally, when finished I simply close the Clipboard
    // which has the effect of unlocking it so that other
    // applications can examine or modify its contents.

    CloseClipboard();

    if (cbtext.empty())
        return 0;

    // format the new text with the clipboard data inserted as needed

    int len = GetWindowTextLengthW(hwnd);
    std::wstring newtext(len, 0);
    if (len > 0)
        GetWindowTextW(hWnd, &newtext[0], len);

    DWORD start, end;
    SendMessageW(hwnd, EM_GETSEL, (WPARAM)&start, (LPARAM)&end);

    if (end > start)
        newtext.replace(start, end-start, cbtext);
    else
        newtext.insert(start, cbtext);

    // parse the new text for validity

    // code for parsing text 
    if( IsTextValid )
        SetWindowTextW( hwnd, newtext.c_str() );

    return 0;
}
于 2014-03-13T03:55:58.630 回答