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

+0

此外,我知道LocalAlloc是坏的,它是从16位时代;为什么编辑控件仍然在使用它?可能是控件的内部缓冲区使用的效率更高,但使用EM_SETHANDLE传递给它的自定义缓冲区只能用LocalAlloc进行分配。 –

+1

* LocalAlloc很差* - 这是绝对错误的 – RbMm

+1

像编辑控件这样的非常老的马MSDN文档有一个陈旧的诀窍。那种对话风格今天不再有任何意义。 [从文档:](https://msdn.microsoft.com/en-us/library/windows/desktop/ff729172(v = vs.85).aspx),“仅适用于16位应用程序”。也是最后一次LocalAlloc与HeapAlloc不一样。 Afaik你仍然可以在32位版本的Windows上运行这样的代码,但是找到一个工作的16位编译器来测试这将是一个努力:)无论如何,开始有错误,风格标志将适用于父级,而不是控制。 –

因为任何人的答案,我决定回答我自己...

使用启发式方法,我来到了以下结论,这不像是怎么写的MSDN文档:

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

对我来说,第二个是实现文本时尤为重要使用FindTextReplaceText查找/替换;你不想复制编辑控件中的所有文本,使用WM_GETTEXT,只是为了搜索某个关键字,对吗?

我还没有测试过,如果普通旧new可以用EM_SETHANDLE设置自定义缓冲区时替代LocalAlloc