Mehrzeiliges Textfeld zeilenweise auffüllen?



  • wie kann ich ein mehrzeiliges Textfeld zeilenweise auffüllen - ohne MFC!!
    gibt es da keine bestimmte nachricht fürs anhängen von strings?

    bist jetzt habe ich das immer so gemacht

    bool Add2List(char *text)
    {
    if (WinMainClass.hDialog == NULL) return FALSE;
    
    HWND handle = GetDlgItem(WinMainClass.hDialog,IDC_LOGMEMO2);
    
    int len = GetWindowTextLength(handle);
    
    int cmplt;
    
    char *txt;
    
    if (text == NULL)
    txt = new char[1];
    else
    {
    cmplt = len+strlen(text)+2+1;
    txt = new char[cmplt];
    }
    strcpy(txt,"");
    
    if ((len > 0) && (text != NULL))
    {
    GetWindowText(handle,txt,len);
    strcat(txt,"\r\n");
    }
    
    if (text == NULL)
    txt = '\0';
    else
    strcat(txt,text);
    
    SendDlgItemMessage(WinMainClass.hDialog,IDC_LOGMEMO2,WM_SETTEXT,0,(LONG)txt);
    
    delete[] txt;
    
    return TRUE; 
    }
    

    THX



  • Schau mal auf www.winapi.net unter Codeschnipsel ziemlich weit unten, da gibt es "ein Edidfeld bearbeiten" oder so.

    ...ist 5 Zeilen groß, die Funktion und funzt wunderbar!



  • vielen Dank für den Tipp, der hat mir wirklich geholfen - die Site kannte ich ja noch garnicht.

    Also hier eine funktion, die Text an ein mehrzeiliges Editfeld anhängt!

    hDialog ist ein Handle auf den Dialog
    und MemoID die ID des Editfeldes wie es im Resourceneditor definiert wurde (resource.h).

    bool Add2List(char *text,int MemoID)
    {
      if (hDialog == NULL) return FALSE;
    
      HWND handle = GetDlgItem(hDialog,MemoID); 
      if ((text == NULL) || (strcmp(text,"") == 0))
      {
    	  SetWindowText(handle,"");
    	  return TRUE;
      }
    
      strcat(text,"\r\n");
    
      int len = SendMessage(handle, EM_GETLINECOUNT , 0, 0);  
      Edit_InsertLine(handle,len,text);
    
      return TRUE;		
    }
    


  • meine Version...

    void SetNewText(HWND hWnd, UINT nID, LPTSTR lpszText)
    {
    	char* szHardBreak = "\r\n", szBuffer[100];
    
    	int nLineCount = SendMessage(GetDlgItem(hWnd,nID),EM_GETLINECOUNT,0,0);
    	GetDlgItemText(GetDlgItem(hWnd,nID),szBuffer);
    
    	if (nLineCount > 1)
    		lstrcat(szBuffer,szHardBreak);
    
    	lstrcat(szBuffer,lpszText);
    	SetDlgItemText(GetDlgItem(hWnd,nID),szBuffer);
    }
    


  • dein szBuffer ist wohl etwas zu klein oder?



  • wenns nötig ist, kannst du die grösse des Arrays ändern, ist doch kein problem.



  • ja konstant ändern schon,
    aber die größe ändert sich während der laufzeit



  • War mal in einer abgewandelten Form im Forum zu finden:

    //-------------------------------------------------------------------------
    // Schreibt einen Text in ein Editfeld
    // hEdit   - Handle auf Editfeld
    // szText  - Text
    // Beginnt der Text mit \r\n so wird in eine neue Zeile geschrieben.
    // Wenn nicht, wird der Text unmittelbar an das Ende angehängt.
    //-------------------------------------------------------------------------
    void AddNewText (HWND hwndEdit, char *szText)
    {
    	// Text an die Editbox anhängen:
    	// 1. an das Ende springen
    	SendMessage (hwndEdit, EM_SETSEL, (WPARAM)-2, (LPARAM)-2); 
    	// 2. Text anhängen
    	SendMessage (hwndEdit, EM_REPLACESEL, (WPARAM)0 , (int)szText);
    	return;
    }
    

    Statt char kann man auch TCHAR verwenden.

    Blackbird


Anmelden zum Antworten