2011-03-31 70 views
0

我無法弄清楚如何正確使用EM_SETHANDLE機制來設置編輯控件的文本。獲取和設置窗口文本對於我的應用程序來說太慢了。如何在編輯控件上使用EM_SETHANDLE?

從文檔我明白,分配的緩衝區將被控制起訴,它對我有一定的作用。

當文本輸入到控件中時,它會在緩衝區中看到,但是當使用memcpy等更新緩衝區時(代碼中沒有錯誤),更新的文本將無法正確顯示。我甚至在每次更新之後都嘗試過EM_SETHANDLE(SetHandle()),但是經過幾次嘗試後失敗了。有一些堆分配失敗。 RedrawWindow()也不起作用。

我無法獲得有關使用情況的任何適當的信息。幫幫我!

我的代碼,留下應用程序的具體細節,看起來像這樣。

// init 
HANDLE m_hMem = HeapAlloc(...) 
m_edit.SetHandle(m_hMem) 

// on some event 
char *pbuf = (char*)m_hMem; 
memcpy(...) 

在此先感謝

+0

您正在使用多行編輯控件,對嗎?你沒有真正發佈足夠的示例代碼讓我告訴任何事情。您是否按照[本MSDN文章](http://msdn.microsoft.com/zh-cn/library/bb775456.aspx)中給出的說明進行操作?特別檢查標題爲「分配文本緩衝區」的部分。 – 2011-03-31 13:11:33

+2

這是在Windows版本2中使用有趣的消息。 – 2011-03-31 13:42:00

+0

@Cody:1.是的,我使用多行編輯。 2.我給出的樣本實際上是這樣的。是的,我遵循了這篇文章所說的話。建議使用堆函數而不是LocalAlloc,因此我已經做了相應的處理。 – joseph 2011-03-31 15:21:34

回答

1

該文檔爲EM_GETHANDLE告訴你,這個內存必須通過LocalAlloc分配的移動存儲。

我想你可以用這樣的僥倖:

int cbCh = sizeof(TCHAR) > 1 ? sizeof(TCHAR) : IsUsingComCtlV6() ? sizeof(WCHAR) : sizeof(char); 
HLOCAL hOrgMem = SendMessage(hEdit,EM_GETHANDLE,0,0); 
HLOCAL hNewMem = LocalReAlloc(hOrgMem,cbCh * cchYourTextLength,LMEM_MOVEABLE); 
if (hNewMem) 
{ 
    //LocalLock, assign string, LocalUnlock 
    SendMessage(hEdit,EM_SETHANDLE,(WPARAM)hNewMem,0); 
}