EM_SETHANDLE,EM_GETHANDLE作品,未经DS_LOCALEDIT
问题描述:
我提出了类似的在Windows 10,使用Visual Studio社区2017年它采用CreateWindow的创建与以下样式编辑控件到记事本程序:EM_SETHANDLE,EM_GETHANDLE作品,未经DS_LOCALEDIT
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开始,微软不再需要DS_LOCALEDIT
?
答
因为任何人的答案,我决定回答我自己...
使用启发式方法,我来到了以下结论,这不像是怎么写的MSDN文档:
- DS_LOCALEDIT并不是EM_SETHANDLE或EM_GETHANDLE的先决条件,这意味着即使您不习惯管理缓冲区,也可以使用EM_XXXHANDLE。
- 当您只需在编辑控件中引用部分文本时,EM_GETHANDLE似乎是比WM_GETTEXT更好的选择。
- DS_LOCAEDIT似乎已经过时了,因为我可以在没有它的情况下设置自己的自定义缓冲区。 (作为一个方面说明,所有我需要做的,以增加自定义缓存,响应EN_MAXTEXT,就是送EM_SETLIMITTEXT消息,新的大小参数)
对我来说,第二个是实现文本时尤为重要使用FindText和ReplaceText查找/替换;你不想复制编辑控件中的所有文本,使用WM_GETTEXT,只是为了搜索某个关键字,对吗?
我还没有测试过,如果普通旧new
可以用EM_SETHANDLE设置自定义缓冲区时替代LocalAlloc
。
此外,我知道LocalAlloc是坏的,它是从16位时代;为什么编辑控件仍然在使用它?可能是控件的内部缓冲区使用的效率更高,但使用EM_SETHANDLE传递给它的自定义缓冲区只能用LocalAlloc进行分配。 –
* LocalAlloc很差* - 这是绝对错误的 – RbMm
像编辑控件这样的非常老的马MSDN文档有一个陈旧的诀窍。那种对话风格今天不再有任何意义。 [从文档:](https://msdn.microsoft.com/en-us/library/windows/desktop/ff729172(v = vs.85).aspx),“仅适用于16位应用程序”。也是最后一次LocalAlloc与HeapAlloc不一样。 Afaik你仍然可以在32位版本的Windows上运行这样的代码,但是找到一个工作的16位编译器来测试这将是一个努力:)无论如何,开始有错误,风格标志将适用于父级,而不是控制。 –