【发布时间】:2016-02-01 16:34:25
【问题描述】:
SetWindowText 函数的文档没有对可用作窗口标题的字符串长度进行限制。
在WM_SETTEXT(调用SetWindowText发送的消息)的文档中,注意到该消息的处理返回值可能是:
FALSE(用于编辑控件)、LB_ERRSPACE(用于列表框)或 CB_ERRSPACE(用于组合框)(如果不足)空间可用于设置编辑控件中的文本。
但是,它没有说明设置窗口标题的情况。是否设置了严格的限制,还是由程序员使用常识来提供自己的标题长度限制?
我发布这个是因为我正在开发一个图形引擎,它允许用户为主窗口提供他们自己的标题。这个想法是我会定义一个常量,例如
const static int MAX_APP_TITLE_LENGTH = /* ??? */;
在我的应用程序类中,检查用户提供的标题字符串的长度。
如果标题字符串太长,我可以抛出警告消息并截断它,而不是直接将其传递给 SetWindowText 并产生意想不到的后果。
编辑:在cmets中经过一番讨论,似乎windows即使使用长度为100,000的字符串作为窗口标题也不会报错,所以这个问题不值得担心(超出当然是对输入的基本清理)!
【问题讨论】:
-
这个问题的动机是什么?
-
我不认为操作系统施加了限制。你可以设置任何你想要的长度。相同的 API 用于设置控件中的文本,例如 Edit 控件,它可以存储大量文本(可能是 64k?为什么听起来正确?)。如果您想确定要分配的缓冲区大小,可以使用
WM_GETTEXTLENGTH消息来检索长度。 -
刚刚尝试使用 100'000 字符字符串。有用。应该够了。
-
我认为你在考虑这个问题。只需让用户提供他们想要的名称即可。如果他们提供的名称太长,他们无论如何都看不到它。早在系统抱怨之前,屏幕的像素就会耗尽。
-
你打算无缘无故地破坏Zero one infinity rule。让用户传递一个
std::wstring,不要强加任意限制。如果发送WM_SETTEXT失败,则抛出异常。
标签: winapi