2014-05-08 35 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"); 

我只得到最後的消息,而不是第一消息和第二在新的生產線。

這也有問題,因爲如果serv retreive WM_ACCEPT消息,我想每次都在新行中顯示「Connected」。

+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'來恢復它。 –