Ankündigung

Einklappen
Keine Ankündigung bisher.

Edit-Control

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Edit-Control

    Hallo lieber Forum. WinApi -Frage (denke ich mal).
    Ich versuche seit ein Paar Tagen eine Zeile (2-te Zeile) Text aus Edit-Box (standarte Edit-Control) in ein Puffer (reserviert mit 'malloc'-Funktion) einzulesen. Es werden aber maximal nur 6 Zeichen Text aus 2-ter Zeile eingelesen. Wenn in der Zeile mehr als 6 Zeichen sind, werden 0 Zeichen in den Puffer eingelesen. Ich bin ziemlich ratlos... Compiler: Bloodshed 4.9.9.2 und C-Datei im Anhang. Würde mich über Ihre Hilfe freuen...
    Angehängte Dateien

  • #2
    Ich versuche noch mal die Code darzustellen, weil mit Anhängen ging irgendwie nicht:
    [php]
    #include <windows.h>
    #include <stdio.h> // sprintf
    #include <stdlib.h> // malloc, free
    //#include <string.h> // strcpy

    // Edit-Control-ID
    #define ID_EDIT 108 // Edit-Box-ID

    // Menu-Punkte-Nummer:
    #define IDM_FILE_NEW 100
    #define IDM_FILE_OPEN 101
    #define IDM_FILE_QUIT 102
    // +
    #define IDM_ADDTEXT 110
    #define IDM_DELTEXT 111
    // +
    #define IDM_LINECOUNTER 116
    #define IDM_LINEREAD 117
    // +
    #define IDM_INFO 104


    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    void AddMenus(HWND);
    void AppendText(HWND, LPCTSTR);


    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
    PSTR szCmdLine, int iCmdShow)
    {
    HWND hWnd;
    MSG msg;
    WNDCLASS wc;

    const char szAppName[] = "Editcontrol Tutorial";

    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WndProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH)GetStockObject(LTGRAY_BRUSH);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = szAppName;

    if(!RegisterClass(&wc))
    {
    MessageBox(NULL,"WC nicht registriert","ERROR", MB_OK|MB_ICONSTOP);
    return 0;
    }

    hWnd = CreateWindow( szAppName,
    "Editcontrol Tutorial",
    WS_OVERLAPPEDWINDOW,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    CW_USEDEFAULT,
    NULL,
    NULL,
    hInstance,
    NULL );

    ShowWindow(hWnd, iCmdShow);
    UpdateWindow(hWnd);

    while(GetMessage(&msg, NULL, 0, 0))
    {
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }

    return msg.wParam;
    }



    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    static HWND hEdit;
    static char szText[] = "keiner\r\nunsinniger\r\nZeilentext"; // Zeilenvorschub durch '\r\n'(2 Zeichen)
    static char szText2[40];
    static char szText3[40] = "Text3";
    LRESULT i; // Anzahl der eingelesener Zeichen aus der gewählten Zeile
    static int iCount; // für aufnahme von Zeilen-Zähler
    static int iOffset; // ZeichenNr. im Edit-Box (hängt nicht von ZeilenNr ab!)
    static int iLineLength; // Länge einer Zeile (wird für jede Zeile einzeln ermittelt)
    LPCSTR pszLineText; // Zeiger auf Speicherplatz mit Zeilen-Inhalt
    // (soll mit 'malloc' reserwiert und mit 'free'
    // wieder freigegeben werden.

    switch(message)
    {
    case WM_CREATE:
    hEdit = CreateWindow("edit", NULL, WS_CHILD | WS_VISIBLE | WS_HSCROLL|
    WS_VSCROLL | WS_BORDER | ES_LEFT | ES_MULTILINE |
    ES_AUTOVSCROLL | ES_AUTOHSCROLL,
    0, 0, 0, 0, hWnd, (HMENU) ID_EDIT,
    ((LPCREATESTRUCT) lParam) -> hInstance,
    NULL);
    AddMenus(hWnd); // Menü erzeugen und anzeigen
    break;

    case WM_SETFOCUS:
    SetFocus(hEdit);
    break;

    case WM_SIZE:
    MoveWindow(hEdit, 0, HIWORD(lParam)/3, LOWORD(lParam), HIWORD(lParam)*2/3, TRUE);
    break;

    case WM_COMMAND:
    switch(LOWORD(wParam))
    {
    case ID_EDIT:
    if(HIWORD(wParam) == EN_ERRSPACE || HIWORD(wParam)==EN_MAXTEXT)
    MessageBox(hWnd, "Edit-Speicherpletz voll!","ERROR (MAX erreicht)!",MB_OK|MB_ICONSTOP);
    break;

    case IDM_FILE_NEW: // nicht belegt
    case IDM_FILE_OPEN:
    case IDM_INFO:
    MessageBeep(MB_ICONINFORMATION);
    break;

    case IDM_ADDTEXT:
    // Text einfügen
    //SendMessage(hEdit, EM_REPLACESEL, 0, (LPARAM)szText);
    AppendText(hEdit, szText); // (Definition dieser Funktion ist weiter unten)
    //SendMessage(hEdit, EM_REPLACESEL, 0, (LPARAM)szNewLine);
    break;

    case IDM_DELTEXT: // nicht belegt
    break;

    case IDM_LINECOUNTER:
    iCount = SendMessage(hEdit, EM_GETLINECOUNT,0,0);
    sprintf(szText2, "Zeilen-Anzahl = %i", iCount);
    MessageBox(hWnd, szText2, "OK", MB_OK);
    // OK!
    break;

    case IDM_LINEREAD:
    iCount = 1; // erste Zeile hat Nr.: 0; 2-te Zeile hat Nr.: 1 u.s.w.
    iOffset = SendMessage(hEdit, EM_LINEINDEX, iCount, 0); // StartPunkt (erster Zeichen) einer Linie Nr 'iCount'
    iLineLength = SendMessage(hEdit, EM_LINELENGTH, iOffset, 0);
    sprintf(szText2,"Zeile %i hat Länge: %i\r\n iOffset = %i", iCount, iLineLength, iOffset);//pszLineText/*szText3*/);
    MessageBox(hWnd,szText2,"Zeile 2 Länge:", MB_OK);

    pszLineText = (char*/*PTSTR*/)malloc(iLineLength+2);//*sizeof(char));
    if(pszLineText == NULL)
    MessageBox(hWnd,"Kein Speicherplatz reserviert","ERROR", MB_OK);
    // bis hier OK!
    i = SendMessage(hEdit, EM_GETLINE, (WPARAM)iCount, (LPARAM)(LPCSTR)pszLineText);
    sprintf(szText3,"%i Zeichen eingelesen",i);
    // ab 6 Zeichen tut es nichtmehr
    MessageBox(hWnd,szText3,"Zeile 2 gelesen:", MB_OK);
    //pszLineText = &"LangerText"; //SpeicherPlatz-Test -> OK!
    strcpy(szText3, pszLineText);
    MessageBox(hWnd,szText3,"Zeile 2 gelesen:", MB_OK);
    free((char*)pszLineText);
    break;

    case IDM_FILE_QUIT:
    SendMessage(hWnd, WM_CLOSE, 0, 0);
    break;
    }//'case WM_COMMAND:'-Ende
    break;

    case WM_CLOSE:
    DestroyWindow(hWnd);
    break;

    case WM_DESTROY:
    PostQuitMessage(0);
    break;

    default: return DefWindowProc(hWnd, message, wParam, lParam);
    }
    return 0;
    }


    //++++++++++++++++++++++++++++++++++++++++++++++++++ +++++++++++++++++++++++++++
    //+++++++++ Menü ++++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++
    // Funktion: void AddMenus(HWND hwnd)
    // Zweck: erzeugt (dynamisch) Menü im Fenster, deren Handle als Parameter
    // übergeben wurde.
    //
    void AddMenus(HWND hwnd)
    {
    HMENU hMenubar; // Menü-Haupt-Leiste
    HMENU hMenuDatei; // Unter-Menü "Datei"
    HMENU hMenuText; // Unter-Menü "Text"
    HMENU hMenuLine; // Unter-Menu "Zeilen"

    hMenubar = CreateMenu();
    hMenuDatei = CreateMenu();
    hMenuText = CreateMenu();
    hMenuLine = CreateMenu();

    // 1-te Spalte
    AppendMenu(hMenubar, MF_POPUP, (UINT_PTR) hMenuDatei, "&Datei");
    AppendMenu(hMenuDatei, MF_STRING, IDM_FILE_NEW, "Neu");
    AppendMenu(hMenuDatei, MF_STRING, IDM_FILE_OPEN, "Öffnen");
    AppendMenu(hMenuDatei, MF_SEPARATOR, 0, NULL);
    AppendMenu(hMenuDatei, MF_STRING, IDM_FILE_QUIT, "Be&enden");

    // 2-te Spalte
    AppendMenu(hMenubar, MF_POPUP, (UINT_PTR) hMenuText, "Text");
    AppendMenu(hMenuText, MF_STRING, IDM_ADDTEXT, "Text einfügen");
    AppendMenu(hMenuText, MF_STRING, IDM_DELTEXT, "Text löschen");

    // 3-te Spalte
    AppendMenu(hMenubar, MF_POPUP, (UINT_PTR) hMenuLine, "Zeilen");
    AppendMenu(hMenuLine, MF_STRING, IDM_LINECOUNTER, "Zeilen-Zahl anzeigen");
    AppendMenu(hMenuLine, MF_STRING, IDM_LINEREAD, "Zeile Nr.2 einlesen");

    // 4-te Spalte
    AppendMenu(hMenubar, MF_STRING, IDM_INFO, "Info");

    SetMenu(hwnd, hMenubar);
    }

    void AppendText(HWND hEditWnd, LPCTSTR Text)
    {
    LPCTSTR szZeile = (LPCTSTR)&"\r\n"; // Nächste Zeilen (unter Windows; '\n' unter DOS
    int idx;

    idx = GetWindowTextLength(hEditWnd);
    SendMessage(hEditWnd, EM_SETSEL, (WPARAM)idx, (LPARAM)idx);
    SendMessage(hEditWnd, EM_REPLACESEL, 0, (LPARAM)Text);
    // Neue Zeile erzeugen:
    idx = GetWindowTextLength(hEditWnd);
    SendMessage(hEditWnd, EM_SETSEL, (WPARAM)idx, (LPARAM)idx);
    SendMessage(hEditWnd, EM_REPLACESEL, 0, (LPARAM)szZeile);
    }
    [\php]

    Kommentar


    • #3
      Servus.

      Ja, die gute alte WinAPI. Aber warum machst du dir das Leben so schwer und nutzt nicht C++?

      strcpy und sprintf sind auch nicht sicher und verursachen ein _CRT_SECURE_NO_WARNINGS.

      Soweit ich sehe, gibt es keinen Grund warum nur 6 Zeichen eingelesen werden. Bei mir funktioniert der Code auch mit mehr als 6 Zeichen.

      Das einzige Problem ist, dass du den Text mit strcpy kopierst ohne den Speicher vorher komplett mit \0 (Stringende) zu initialisieren.

      Bist du sicher, dass du die Anwendung nicht versehentlich in Unicode kompilierst? Da nimmt ein Zeichen mehr Byte ein!

      PHP-Code:
      strcpy(szText3pszLineText);
                  
      szText3[iLineLength] = '\0'
      Klicke auf die Grafik für eine vergrößerte Ansicht

Name: Editcontrol.png
Ansichten: 1
Größe: 7,8 KB
ID: 2433

      Kommentar

      Lädt...
      X