gpt4 book ai didi

c++ - EM_SETHANDLE、EM_GETHANDLE 在没有 DS_LOCALEDIT 的情况下工作

转载 作者:行者123 更新时间:2023-11-30 05:08:25 25 4
gpt4 key购买 nike

我在 Windows 10 上使用 Visual Studio Community 2017 制作了一个类似于记事本的程序。它使用使用 CreateWindow 创建的具有以下样式的编辑控件:

WS_CHILD | WS_VISIBLE | WS_HSCROLL | WS_VSCROLL 
| WS_BORDER | ES_LEFT | ES_MULTILINE | ES_AUTOHSCROLL | ES_AUTOVSCROLL

如您所见,没有 DS_LOCALEDIT。但是,使用 EM_SETHANDLE 或 EM_GETHANDLE 访问编辑控件中的缓冲区似乎可以完美地工作。以下是一段代码,它为本应使用 DS_LOCALEDIT 创建的编辑控件进行初始缓冲区分配:

HLOCAL hEditMem = ::LocalAlloc(LPTR, sizeof(wchar_t) * 51);
wchar_t* pszEdit = reinterpret_cast<wchar_t*>(::LocalLock(hEditMem));
const std::wstring strData(L"Hello");
std::char_traits<wchar_t>::copy(pszEdit, strData.c_str(), strData.size());
::SendMessageW(hwndEdit, EM_SETHANDLE, reinterpret_cast<WPARAM>(hEditMem), 0);
::SendMessageW(hwndEdit, EM_SETMODIFY, TRUE, 0);

文档 here 明确指出:

An application that uses the default allocation behavior (that is, does not use the
DS_LOCALEDIT style must not send EM_SETHANDLE and EM_GETHANDLE messages to the edit
control.

从 Windows 10 或 VS 2017 开始,Microsoft 中可能有人不显眼地让 DS_LOCALEDIT 不再需要?

最佳答案

既然没有人回答,我决定自己回答......

使用启发式方法,我得出了以下结论,这与 MSDN 文档中所写的不同:

  1. DS_LOCALEDIT 不是 EM_SETHANDLE 或 EM_GETHANDLE 的先决条件,这意味着即使您没有按惯例管理缓冲区,也可以使用 EM_XXXHANDLE。
  2. EM_GETHANDLE 似乎是比 WM_GETTEXT 更好的选择,当您需要做的只是在编辑控件中引用一部分文本时。
  3. DS_LOCAEDIT 似乎已过时,因为我可以在没有它的情况下设置自己的自定义缓冲区。 (作为旁注,为了响应 EN_MAXTEXT,我需要做的就是增加自定义缓冲区,发送带有新大小作为参数的 EM_SETLIMITTEXT 消息)

对我来说,在使用 FindText 实现文本查找/替换时,第二个特别重要和 ReplaceText ;您不想使用 WM_GETTEXT 复制编辑控件中的所有文本,只是为了搜索特定关键字,对吗?

当使用 EM_SETHANDLE 设置自定义缓冲区时,我还没有测试普通的旧 new 是否可以替代 LocalAlloc

关于c++ - EM_SETHANDLE、EM_GETHANDLE 在没有 DS_LOCALEDIT 的情况下工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46861043/

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