Forum: PC-Programmierung WinAPI - Edit Control will kein "backspace" verarbeiten


von Timmo H. (masterfx)


Lesenswert?

Hallo zusammen.

Ich schreibe gerade ein kleines Terminal-Programm für den Silabs CP2110.
Das ganze mache ich direkt per WinAPI und kein MFC oder ähnliches.

Als Terminal-Ausgabe verwende ich das Edit Control
1
EDITTEXT        IDC_EDIT_TERMINAL, 9, 31, 334, 215, WS_VSCROLL | NOT WS_TABSTOP | ES_AUTOVSCROLL | ES_MULTILINE | ES_WANTRETURN
Ich habe einen Empfangsthread der die Daten vom CP2110 ausliest und 
direkt in das Edit Control schreibt:
1
int readThread(){
2
    char buffer[64];
3
    HID_UART_STATUS status;
4
    DWORD numBytesRead=0;
5
    char temp1[32];
6
    while(1){
7
        // canceled from main thread?
8
        if(connected == 0)
9
            return 0;
10
        status = HidUart_Read (m_hidUart, buffer,32, &numBytesRead);
11
12
        HidUart_CancelIo (m_hidUart);
13
        if (status == HID_UART_SUCCESS || status == HID_UART_READ_TIMED_OUT){
14
            if(numBytesRead > 0){
15
                rec_bytes += numBytesRead;
16
                buffer[numBytesRead] = 0;   //Terminate String
17
                Append_Text(buffer);
18
19
            }
20
        }
21
        sprintf(temp1,"%05d",rec_bytes);
22
        SendDlgItemMessage(hDlg, IDC_STATIC_BYTES, WM_SETTEXT,0,temp1);
23
        Sleep(20);
24
    }
25
26
}
27
28
void Append_Text(char *buf){
29
    HWND hEdit = GetDlgItem (hDlg, IDC_EDIT_TERMINAL);
30
    int ndx = GetWindowTextLength (hEdit);
31
    SetFocus (hEdit);
32
    SendMessage (hEdit, EM_SETSEL, (WPARAM)ndx, (LPARAM)ndx);
33
    SendMessage (hEdit, EM_REPLACESEL, 0, (LPARAM) ((LPSTR) buf));
34
35
}

Der µC hinter dem CP2110 gibt hierbei das Echo aus (also kein lokales 
Echo).Das ganze funktioniert auch zu 99%.
Denn wenn ich Backspace drücke wird an den µC "0x08" geschickt und auch 
direkt wieder zurück gesendet. Infolge dessen hätte ich nun erwartet, 
dass der Cursor im Edit Control auch das letzte Zeichen hinter der 
Cursor-Position löscht. Das Passiert aber nicht, sondern es wird ein 
kryptisches Sonderzeichen ausgegeben. Erwartet das Edit Control 
irgendwie einen anderen != 0x08 als Backspace code, oder woran kann das 
liegen?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das Editcontrol stellt das Zeichen dar, kryptisch sieht es aus, weil die 
verwendete Schriftart keinen Glyph für das Zeichen enthält.

Das Editcontrol ist kein Terminal, es interpretiert nur sehr wenige 
Steuerzeichen, nämlich CRLF und TAB, aber weder Backspace noch 
Cursorpositionierung o.ä.
 Wenn der Benutzer über die Tastatur dieses Zeichen sendet, wird es vom 
Editcontrol anders interpretiert, als wenn es Bestandteil des mit 
WM_SETTEXT übertragenen Textes ist.

Du wirst den an das Control gesendeten Text von derartigen Steuerzeichen 
bereinigen und die Steuerzeichen gegebenenfalls selbst interpretieren 
müssen.

von Timmo H. (masterfx)


Lesenswert?

Ahh, Ok. Dann werde ich das mal checken.
Hat mich nur gewundert, dass das WM_CHAR Event für das Edit Control ein 
BS (0x08) liefert. Aber das WM_CHAR Event gibt wohl direkt den Keycode 
der Tastatur auss und nicht das wie es vom Edit Control erkannt wird.

von Timmo H. (masterfx)


Lesenswert?

Ok, so gehts
1
void Append_Text(char *buf_in){
2
    int nr_bs=0;
3
    char *buf_ptr = buf_in;
4
    char *buf = buf_in;
5
    int ndx;
6
    HWND hEdit = GetDlgItem (hDlg, IDC_EDIT_TERMINAL);
7
    int len = strlen(buf_in);
8
9
    while(*buf_ptr){
10
        if(*buf_ptr == 0x08){
11
            *buf_ptr = 0;
12
            ndx = GetWindowTextLength (hEdit);
13
            SetFocus (hEdit);
14
            SendMessage (hEdit, EM_SETSEL, (WPARAM)ndx, (LPARAM)ndx);
15
            SendMessage (hEdit, EM_REPLACESEL, 0, (LPARAM) ((LPSTR) buf));
16
            SendMessage (hEdit, EM_SETSEL, (WPARAM)(ndx+(buf_ptr-buf)-1), (LPARAM)(ndx+(buf_ptr-buf)));
17
            SendMessage (hEdit, EM_REPLACESEL, 0, (LPARAM) ((LPSTR)""));
18
            buf = buf_ptr;
19
        }
20
        buf_ptr++;
21
22
    }
23
    if((buf -buf_in) < len){
24
        ndx = GetWindowTextLength (hEdit);
25
        SetFocus (hEdit);
26
        SendMessage (hEdit, EM_SETSEL, (WPARAM)ndx, (LPARAM)ndx);
27
        SendMessage (hEdit, EM_REPLACESEL, 0, (LPARAM) ((LPSTR) bufe));
28
29
    }
30
31
}

Muss wohl noch etwas optimiert werden, erscheint mir etwas umständlich 
so.

Danke für den Denkanstoß

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.