Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 如何在编辑控件上使用EM_SETHANDLE?_Winapi_Mfc_Text Processing_Editcontrol - Fatal编程技术网

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

Winapi 如何在编辑控件上使用EM_SETHANDLE?,winapi,mfc,text-processing,editcontrol,Winapi,Mfc,Text Processing,Editcontrol,我无法理解如何正确使用EM_SETHANDLE机制来设置编辑控件的文本。获取和设置窗口文本对于我的应用程序来说太慢 从文档中,我了解到分配的缓冲区将被控件起诉,并且它对我部分有效 在控件中输入文本时,可以在缓冲区中看到它,但是当使用memcpy等更新缓冲区时(代码中没有错误),更新的文本将无法正确显示。我甚至在每次更新后都尝试使用EM_SETHANDLE(SETHANDLE()),但几次尝试后都失败了。存在某种堆分配失败。RedrawWindow()也不起作用 我无法在网上获得有关使用情况的任何

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

提前感谢

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

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

看起来您需要使用
LocalAlloc
分配内存。请参阅附带消息EM_GETHANDLE:

看起来您需要使用
LocalAlloc
分配内存。请参阅附带消息EM_GETHANDLE:

您正在使用多行编辑控件,对吗?你没有发布足够的示例代码让我告诉你任何事情。您是否遵循了中给出的说明?在标题为“分配文本缓冲区”的部分下进行特别检查。这是一条在Windows版本2中使用的有趣消息。@Cody:1。是的,我使用多行编辑。2.我给的样品是它实际的样子。3.是的,我遵循了文章的内容。建议使用堆函数而不是LocalAlloc,因此我做了相应的操作。它没有解决任何实际问题,当用户使用它进行编辑时,控件仍然会拖泥带水。使用一个真正的文本编辑器控件,例如闪烁。几个KBs!!!SetWindowText会把它当早餐吃。这根本没什么。你使用的是多行编辑控件,对吗?你没有发布足够的示例代码让我告诉你任何事情。您是否遵循了中给出的说明?在标题为“分配文本缓冲区”的部分下进行特别检查。这是一条在Windows版本2中使用的有趣消息。@Cody:1。是的,我使用多行编辑。2.我给的样品是它实际的样子。3.是的,我遵循了文章的内容。建议使用堆函数而不是LocalAlloc,因此我做了相应的操作。它没有解决任何实际问题,当用户使用它进行编辑时,控件仍然会拖泥带水。使用一个真正的文本编辑器控件,例如闪烁。几个KBs!!!SetWindowText会把它当早餐吃。那绝对没什么。