如何在编辑控件上使用EM_SETHANDLE?

时间:2011-03-31 13:00:41

标签: winapi mfc text-processing editcontrol

我无法弄清楚如何正确使用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(...)

提前致谢

2 个答案:

答案 0 :(得分:3)

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);
}

答案 1 :(得分:1)

看起来您需要使用LocalAlloc分配内存。请参阅随附消息EM_GETHANDLE:http://msdn.microsoft.com/en-us/library/bb761576(v=vs.85).aspx