从剪贴板获取文本后将一个字符串插入另一个字符串所需的建议

2024-05-10

简介及相关信息:

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

我决定通过以下方式实现这一点subclassing.

The WM_CHAR处理程序似乎运行良好,我需要处理其他几条消息以完全保护用户免于输入无效文本。其中一条消息是WM_PASTE.

到目前为止,我能够正确地从clipboard并根据复制的字符串是否确实是十进制数字来丢弃或传递消息。

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

I use pure Winapi and C++。没有像这样的图书馆boost等都是允许的。

PROBLEM:

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

编辑控件中的文本: 12345678.9

剪贴板文本: -1A

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

这是我需要帮助的部分:

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

问题:

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

  2. 有没有一个函数可以为我做有效性测试(它应该了解区域设置! ) ?

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

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

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

  2. 至于第二个问题,我发现std:: strtod通过浏览堆栈溢出问题,似乎它可以用来检查字符串的有效性。它似乎也能感知区域设置,但我不确定这是否是我所寻求的。

为了使这篇文章尽可能简短,我提供了链接我的这个问题 https://stackoverflow.com/questions/22263612/properly-handle-wm-paste-in-subclass-procedure有相关的代码片段。

感谢您的时间和帮助。

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

此致。


尝试这样的事情:

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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从剪贴板获取文本后将一个字符串插入另一个字符串所需的建议 的相关文章