gpt4 book ai didi

c++ - 在 C++ 中将文本附加到 Win32 EditBox

转载 作者:可可西里 更新时间:2023-11-01 14:41:31 25 4
gpt4 key购买 nike

我有一个 EditBox HWND tbLog,以及以下函数(不起作用):

void appendLogText(char* newText)
{
int len = GetWindowTextLength(tbLog);

char* logText = new char[len + strlen(newText) + 1];
GetWindowText(tbLog, logText, len);

strcat(logText, newText);

SendMessage(tbLog, WM_SETTEXT, NULL, (LPARAM)TEXT(logText));

delete[] logText;
}

我这样调用它:

appendLogText("Put something in the Edit box.\r\n");
appendLogText("Put something else in the Edit box.\r\n");

首先,TEXT() 到底做了什么?我尝试过使用/不使用它:(LPARAM)logText(LPARAM)TE​​XT(logText) 据我所知没有区别。

其次,我的追加函数做错了什么?如果我注释掉我的 delete 行,那么在我第一次运行附加函数时,我的 Editbox 中会出现垃圾,然后是消息。第二次运行时,程序崩溃了。如果我没有将其注释掉,那么即使是第一次它也会崩溃。

最佳答案

我会用 C 重写函数,如下所示:

void appendLogText(LPCTSTR newText)
{
DWORD l,r;
SendMessage(tbLog, EM_GETSEL,(WPARAM)&l,(LPARAM)&r);
SendMessage(tbLog, EM_SETSEL, -1, -1);
SendMessage(tbLog, EM_REPLACESEL, 0, (LPARAM)newText);
SendMessage(tbLog, EM_SETSEL,l,r);
}

保存和恢复现有选择很重要,否则对于想要选择和复制控件外的某些文本的任何人来说,控件会变得非常烦人。

此外,使用 LPCTSTR 可确保在使用多字节或 unicode 字符集构建时可以调用该函数。

TEXT 宏不合适,应该用来包装字符串文字:

LPCTSTR someString = TEXT("string literal");

Windows NT 操作系统本身是 unicode,因此构建多字节应用程序效率低下。在字符串文字上使用 TEXT() 并使用 LPTSTR 代替“char*”有助于转换为 unicode。但实际上,在 Windows 上显式切换到 unicode 编程可能是最有效的:代替 char、strlen、std::string,使用 wchar_t、std::wstring、wsclen 和 L“字符串文字”。

将项目build设置切换为 Unicode 将使所有 Windows API 函数都需要 unicode 字符串。


我很晚才注意到,将 -1 作为 EM_SETSEL 的 WPARAM 传递只会取消选择任何选择,但不会移动插入点。所以答案应该修改为(也未经测试):

void appendLogText(HWND hWndLog, LPCTSTR newText)
{
int left,right;
int len = GetWindowTextLength(hWndLog);
SendMessage(hWndLog, EM_GETSEL,(WPARAM)&left,(LPARAM)&right);
SendMessage(hWndLog, EM_SETSEL, len, len);
SendMessage(hWndLog, EM_REPLACESEL, 0, (LPARAM)newText);
SendMessage(hWndLog, EM_SETSEL,left,right);
}

关于c++ - 在 C++ 中将文本附加到 Win32 EditBox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7200137/

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