C++ 子字符串的WM_SETTEXT对应项

C++ 子字符串的WM_SETTEXT对应项,c++,string,windows,winapi,C++,String,Windows,Winapi,正如我从中得到的,它需要指向以null结尾的字符串的指针 我想知道是否有一个等效的版本可以处理非空终止的字符串,可能是一个指向字符串开头的指针和一个表示字符串长度的数字,但我找不到任何东西。我错过什么了吗?或者说没有这样的设施还有更深层次的原因吗?没有这样的功能是因为它不是必需的。如果希望将窗口文本设置为程序中字符串的子字符串,只需将该子字符串复制到新字符串并将其传递给WM_SETTEXT即可 请记住,Win32是一个低级API。它已经是一个非常大的API。如果它能提供你正在寻找的那种方便的方法

正如我从中得到的,它需要指向以null结尾的字符串的指针


我想知道是否有一个等效的版本可以处理非空终止的字符串,可能是一个指向字符串开头的指针和一个表示字符串长度的数字,但我找不到任何东西。我错过什么了吗?或者说没有这样的设施还有更深层次的原因吗?

没有这样的功能是因为它不是必需的。如果希望将窗口文本设置为程序中字符串的子字符串,只需将该子字符串复制到新字符串并将其传递给WM_SETTEXT即可

请记住,Win32是一个低级API。它已经是一个非常大的API。如果它能提供你正在寻找的那种方便的方法,它会更大。如果您希望有这样的方便,您完全可以自行包装Win32功能

这里也没有任何真正的性能含义。是的,将子字符串复制到以null结尾的缓冲区将花费您的成本,但与实际发送WM_SETTEXT mesage和进行UI更新的成本相比,这一成本是微不足道的


多行编辑控件的功能有些相关。由于这些控件包含的文本量远远大于窗口标题、单行编辑、静态文本控件等,因此它们允许您对控件内的子字符串进行操作。例如,查看消息,它允许您修改控件中的子字符串,而不是强制替换整个文本。出于性能原因,这是必不可少的。

这纯粹是出于C风格的原因。在winapi设计的时候,编程windows的主要语言是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);

如果您指的是像std::string_view这样的东西,那么winapi是非常古老的,在C-sytel API中传递以null结尾的字符串是一种常见的做法。我不认为有任何现有的WM_SETTEXT等价物可以使用指向缓冲区和大小的指针。除非您引入一些自定义消息并编写自己的处理程序来处理它。相关: