Auf Speicherbereich eines Editfields zugreifen ?



  • ⚠ Vorgeschichte:
    Ich bin gerade dabei einen kleines Chat-tool zu programmieren, um etwas mit WinSock vertraut zu werden. Damit es wenigstens eine kleine Besonderheit hat, werden nicht nur endgueltige Nachrichten versendet, sondern bereits der aktuelle Eingabestring. Mit andern Worten, im Durchschnitt muss der Inhalt meines Editfields - das ich zur Anzeige benutze - 50 Mal in der Sekunde geaendert werden 😮

    Ich hab bisher einige Methoden gefunden den Text des Edits zu aendern:

    // 1. Einfach mit SetWindowText:
    TCHAR szText[] = TEXT("Put some text in there!");
    SetWindowText(hwndEdit,szText);
    
    // 2. Mit der WM_SETTEXT message
    TCHAR newText[] = TEXT("WM_SETTEXT for the win.");
    SendMessage(hwndEdit,WM_SETTEXT,0,(LPARAM)newText);
    
    // 3.Mit der Funktion SetDlgItemText
    TCHAR theText[] = TEXT("Indeed, also this method will work!");
    SetDlgItemText(hwnd,ID_EDIT,theText);
    

    Ich bezweifel allerdings das sich diese Verfahren grundlegend Unterscheiden, sie alle geben dem Textfeld einen neuen Inhalt und der alte wird rausgeschmissen.
    Bei meinem Umfang an Text und Aenderungen, sollte man sich so langsam um Performance Sorgen machen! Den eigentlichen Inhalt des Editfields speicher ich in einem externen Puffer, der viele Tausend Byte gross wird und staending geaendert und dann ans Edit gesendet wird.
    (Bisher dachte ich das Fenster speichert lediglich einen Verweis, aber offensichtlich fuehrt Windows ne Menge Kopieraktionen durch)

    Was ich gerne naeher wuesste ist, was es mit einem Lock auf sich hat:

    HLOCAL hLocal = (HLOCAL)SendMessage(hwndEdit,EM_GETHANDLE,0,0);
    TCHAR* buffer = (TCHAR*)LocalLock(hLocal);
    // Schreibaktionen		  
    LocalUnlock(hLocal);
    

    Theoretisch sollte diese Methode ja direkten Schreibzugriff ermoeglichen, aber so recht trau ich dem Ganzen noch nicht.
    Was ausgesprochen seltsam ist: Per Lock krieg ich keine Zeilenumbrueche hin (Ja, ich verwende "\r\n")

    Kann mir jemand einen Tipp geben ?



  • Ich weiß zwar nicht, wie das intern abgearbeitet wird, aber schau dir mal das hier an: http://www.winapi.net/index.php?inhalt=s10



  • Danke fuer den Link, wenn man nur Text zu einem Editfield hinzufuegen will, ist das sicher ne praktische Methode. Ich wuerde aber gerne den Speicher des Editfields selbst verwalten, also einfach ein WCHAR-Array das vom Editfield angezeigt wird.
    Dazu hab ich ein paar Fragen:

    1. Wenn ich den Speicherbereich von EM_GETHANDLE per LocalLock Sperre, dann manipuliere und mit LocalUnlock wieder freigebe, muessten die Aenderungen ja eigentlich im Textfeld zu sehen sein. Aber das ist nicht immer der Fall (hab 2 Testanwendungen die unterschiedlich reagieren). Kann mir das jemand erklaeren ?
    2. Ist der Buffer den mir LocalLock zurueckliefert der wirkliche Speicherbereich, oder ist es nur eine Kopie, die mit dem Aufruf von LocalUnlock wieder mit dem Orginal "abgeglichen" wird ?
    3. Die EM_SETHANDLE Nachricht verlangt einen Parameter vom Typ HLOCAL. Wenn ich solch einen Speicherbereich mit LocalAlloc erstelle gibt es auch keine Probleme - aber gibt es auch eine Moeglichkeit einen bereits vorhandenen Speicherbereich in einen von Windows verwalteten Speicherbereich umzuwanden, sodass ich einen HLOCAL-Pointer auf diesen habe ? Das waere ja schon eine Loesung meines Problems.

    Edit: Und noch eine Verstaendnisfrage: folgender Code haette die gleiche Funktionalitaet wie SetWindowText(hwnd_edit,temp);

    HLOCAL content = LocalAlloc(LPTR,temp_bytes);
    WCHAR* buffer = (WCHAR*)LocalLock(content);
    memcpy(buffer,temp,temp_bytes);
    LocalUnlock(content);
    SendMessage(hwnd_edit,EM_SETHANDLE,(LPARAM)content,0);
    

    Stimmt das ungefaehr ?


Anmelden zum Antworten