当我从documentation of WM_SETTEXT
获取时,它需要一个“指向以空字符结尾的字符串的指针”。
我想知道是否有一个等效的版本可用于非空终止的字符串,可能是一个指针(到字符串的开头)和一个数字(表示字符串的长度),但我可以找不到任何东西。我错过了什么?或者是否有更深层次的原因导致没有这样的设施?
答案 0 :(得分:1)
没有这样的功能,因为没有必要。如果您希望将窗口文本设置为程序中字符串的子字符串,则只需将该子字符串复制到新字符串并将其传递给WM_SETTEXT
。
请记住,Win32是一个低级API。它已经是一个非常大的API。如果它提供您正在寻找的那种便利方法,它会更大。如果您希望获得这样的便利,您可以自由地自行包装Win32功能。
这里也没有任何真正的性能影响。是的,将子字符串复制到以空值终止的缓冲区会花费您的成本,但与实际发送WM_SETTEXT
消息并更新UI的成本相比,这个成本是微不足道的。
与多行编辑控件的功能有些相关。因为它们包含比窗口标题,单行编辑,静态文本控件等更大量的文本,所以它们允许您对控件中的子字符串进行操作。例如,查看EM_REPLACESEL
消息,该消息允许您修改控件中的子字符串,而不是强制替换整个文本。这对于性能原因至关重要。
答案 1 :(得分:1)
这纯粹是出于C风格的原因。编程窗口的主要语言是在设计winapi时C和C只使用零终止字符串。
只需使用指针操作即可实现您想要的效果。
char s[] = "hey there";
char s2[32] = {0};
strncpy(s2, s + 4, 5); // s2 will contain "there\0\0\0\0..."
SendMessageA(hwnd, WM_SETTEXT, NULL, (LPARAM)s2);