gpt4 book ai didi

c++ - 从剪贴板获取文本后,需要将一个字符串插入另一个字符串的建议

转载 作者:太空狗 更新时间:2023-10-29 21:43:36 25 4
gpt4 key购买 nike

简介及相关信息:

我有一个编辑控件,它只需要接受带符号的十进制数(类似于-12.35)。

我已决定通过子类化 来实现它。

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

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

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

我使用纯 WinapiC++。不允许使用 boost 等库。

问题:

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

编辑控件中的文本: 12345678.9

剪贴板文本: -1A

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

这是我需要帮助的部分:

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

问题:

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

  2. 是否有可以为我进行有效性测试的函数(它应该是区域设置感知的!)?

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

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

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

  2. 关于第二个问题,我在StackOverflow 问题中找到了std::strtod,似乎可以用来检查有效性字符串。而且它似乎也可以识别区域设置,但我不确定这是否是我想要的。

为了使这篇文章尽可能简短,我提供了指向包含相关代码片段的 this question of mine 的链接。

感谢您的宝贵时间和帮助。

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

最好的问候。

最佳答案

尝试这样的事情:

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

关于c++ - 从剪贴板获取文本后,需要将一个字符串插入另一个字符串的建议,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22341284/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com