簡體   English   中英

EM_SETHANDLE, EM_GETHANDLE 在沒有 DS_LOCALEDIT 的情況下工作

[英]EM_SETHANDLE, EM_GETHANDLE works without DS_LOCALEDIT

我在 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);

此處的文檔明確指出:

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不再需要DS_LOCALEDIT嗎?

由於沒有任何人的回答,我決定回答我自己的......

使用啟發式方法,我得出了以下結論,這與 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可以替代LocalAlloc設置自定義與EM_SETHANDLE緩沖區時。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM