2014-05-08 2 views
0

Моя проблема заключается в простом поле редактирования. Она определяется следующим образом:win32 редактирование окна в новых строках

hEditIn=CreateWindowEx(WS_EX_CLIENTEDGE, 
      L"EDIT", 
      L"", 
      WS_CHILD|WS_VISIBLE|ES_MULTILINE| 
      ES_AUTOVSCROLL|ES_AUTOHSCROLL, 
      50, 
      120, 
      400, 
      200, 
      hWnd, 
      (HMENU)IDC_EDIT_IN, 
      GetModuleHandle(NULL), 
      NULL); 

После этого, когда я называю SendMessage как это:

SendMessage(hEditIn, 
          WM_SETTEXT, 
          NULL, 
          (LPARAM)L"Connected\r\n"); 

SendMessage(hEditIn, 
          WM_SETTEXT, 
          NULL, 
          (LPARAM)L"TESTSTR"); 

я получаю только последнее сообщение вместо первого сообщения и второй в новой строке.

Это также проблематично, потому что я хочу отображать «Подключено» каждый раз в новой строке, если сообщение servreveive WM_ACCEPT.

+5

'WM_SETTEXT' называется именно так, потому что, эм, задает текст, не добавляет его. Если вы хотите использовать последнее поведение, рассмотрите возможность чтения документов в ['WM_GETTEXTLENGTH'] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms632628.aspx) и [' WM_GETTEXT'] (http : //msdn.microsoft.com/en-us/library/windows/desktop/ms632627.aspx) – Joulukuusi

ответ

2

WM_SETTEXT заменяет все содержимое элемента управления Edit новым текстом. Чтобы добавить новый текст в существующий текст, используйте EM_SETSEL, чтобы переместить курсор в конец существующего текста, затем используйте EM_REPLACESEL, чтобы вставить новый текст в текущую позицию каретки.

void appendTextToEdit(HWND hEdit, LPCWSTR newText) 
{ 
    int TextLen = SendMessage(hEdit, WM_GETTEXTLENGTH, 0, 0); 
    SendMessage(hEdit, EM_SETSEL, (WPARAM)TextLen, (LPARAM)TextLen); 
    SendMessage(hEdit, EM_REPLACESEL, FALSE, (LPARAM)newText); 
} 

appendTextToEdit(hEditIn, L"Connected\r\n"); 
appendTextToEdit(hEditIn, L"TESTSTR"); 
+1

Я всегда боялся использовать эту технику, поскольку пользователь может взаимодействовать с полем редактирования и изменять выбор в то же время, когда вы добавляете. –

+2

Пользовательское взаимодействие проходит через очередь сообщений. Этот код не позволяет очереди сообщений обрабатывать новые сообщения. Таким образом, пользователь не может прервать этот код (если вы не вызываете этот код в рабочем потоке, который вам не нужно делать. Отправьте сообщение с текстом в основной поток, а затем вызовите этот код в этом обработчике сообщений). Однако этот код может прервать пользователя, если он вызван между сообщениями, создаваемыми пользователем. Простой способ справиться с этим - использовать «EM_GETSEL» для извлечения текущего выбора пользователя, а затем использовать «EM_SETSEL», чтобы восстановить его после добавления текста. –

Смежные вопросы