在C ++中将文本附加到Win32 EditBox

时间:2011-08-26 04:54:57

标签: c++ windows winapi

我有一个EditBox HWND tbLog和以下函数(不起作用):

void appendLogText(char* newText)
{
  int len = GetWindowTextLength(tbLog);

  char* logText = new char[len + strlen(newText) + 1];
  GetWindowText(tbLog, logText, len);

  strcat(logText, newText);

  SendMessage(tbLog, WM_SETTEXT, NULL, (LPARAM)TEXT(logText));

  delete[] logText;
}

我称之为:

appendLogText("Put something in the Edit box.\r\n");
appendLogText("Put something else in the Edit box.\r\n");

首先,TEXT()实际上做了什么?我尝试过/不使用它:(LPARAM)logText(LPARAM)TEXT(logText)并且就我所见,没有任何区别。

其次,我在追加函数中做错了什么?如果我注释掉我的delete行,那么第一次运行追加功能时,我的编辑框中会出现垃圾,然后是消息。我第二次运行它,程序崩溃了。如果我没有注释掉它,那么它第一次就会崩溃。

2 个答案:

答案 0 :(得分:10)

我会在C中重写函数,如下所示:

void appendLogText(LPCTSTR newText)
{
  DWORD l,r;
  SendMessage(tbLog, EM_GETSEL,(WPARAM)&l,(LPARAM)&r);
  SendMessage(tbLog, EM_SETSEL, -1, -1);
  SendMessage(tbLog, EM_REPLACESEL, 0, (LPARAM)newText);
  SendMessage(tbLog, EM_SETSEL,l,r);
}

保存和恢复现有选择或控件非常重要,任何人都可以使用谁来选择并从控件中复制一些文本。

此外,使用LPCTSTR可确保在使用多字节或unicode字符集构建时可以调用该函数。

TEXT宏不合适,应该用于包装字符串文字:

LPCTSTR someString = TEXT("string literal");

Windows NT操作系统本身是unicode,因此构建多字节应用程序效率很低。在字符串文字上使用TEXT(),而用LPTSTR代替'char *'有助于将此转换为unicode。但实际上,在Windows上显式切换到unicode编程可能是最有效的:代替char,strlen,std :: string,使用wchar_t,std :: wstring,wsclen和L“string literals”。

将项目构建设置切换为Unicode将使所有Windows API函数都需要unicode字符串。


由于EM_SETSEL的WPARAM仅仅取消选择任何选择但不移动插入点,因此引起了我的迟来的注意。所以答案应该被修改为(也是未经测试的):

void appendLogText(HWND hWndLog, LPCTSTR newText)
{
  int left,right;
  int len = GetWindowTextLength(hWndLog);
  SendMessage(hWndLog, EM_GETSEL,(WPARAM)&left,(LPARAM)&right);
  SendMessage(hWndLog, EM_SETSEL, len, len);
  SendMessage(hWndLog, EM_REPLACESEL, 0, (LPARAM)newText);
  SendMessage(hWndLog, EM_SETSEL,left,right);
}

答案 1 :(得分:0)