Editbox WinApi Frage



  • Schönen guten Abend 🙂
    Ich habe folgende Frage. Ich versuche mich zur Zeit an WinApi
    und versuche ein wenig auszuprobieren und alles zu lesen.
    Habe in einem Tutorial in einem Main Window eine Editbox und möchte
    gerne das diese Editbox nicht maximiert ist sonder nur einen
    von mir definierten Bereich abdeckt. Welchen Parameter muss ich verändern,
    damit das der Fall ist? Habe nun alle Funktionen in MSDN durchgelesen
    und versuchsweise viele Parameter mal verändert mit anderen die in MSDN
    aufgelistet versucht. Auch die Integer von x und y Koordinaten habe
    ich verändert, aber es kommt nicht das gewünschte Ergebnis.

    Vielleicht kann mir ja einer helfen. Vielen Dank schon mal im Voraus.

    Zu meinem Code:

    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    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;
    
        RegisterClass(&wc);
    
        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;
    
        switch(message)
        {
        case WM_CREATE:
            {
                            FILE *fz;
                char *buffer = NULL;
                int iFileSize;
    
                fz = fopen("text.txt", "rb");
                if(fz != NULL)
                {
                    fseek(fz, 0, SEEK_END);
                    iFileSize = ftell(fz);
                    buffer = (char*)malloc(iFileSize);
    
                    fseek(fz, 0, SEEK_SET);
                    fread(buffer, 1, iFileSize, fz);
                    fclose(fz);
                }
                            hEdit = CreateWindowEx(WS_EX_DLGMODALFRAME,
                                       "edit",
                                       buffer,    // <- das ist der Inhalt der Editfelds
                                       WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE |
                                                  ES_AUTOVSCROLL,
                                       150, 200, 150, 400,
                                       hWnd,
                                       NULL,
                                       ((LPCREATESTRUCT) lParam) -> hInstance,
                                       NULL);
    
                free(buffer);
    
                return 0;
            }
        case WM_SIZE:
            {
                            MoveWindow(hEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
                return 0;
            }
        case WM_CLOSE:
            {
                            FILE *fz;
                char *buffer = NULL;
                int iLength;
    
                iLength = GetWindowTextLength(hEdit);
    
                buffer = (char*)malloc(iLength);
    
                GetWindowText(hEdit, buffer, iLength+1);
    
                fz = fopen("text.txt", "wb");
                fwrite(buffer, 1, iLength, fz);
                fclose(fz);
    
                free(buffer);
    
                DestroyWindow(hWnd);
                return 0;
            }
        case WM_DESTROY:
            {
                PostQuitMessage(0);
                return 0;
            }
        }
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    


  • beim Create gibst Du die ursprüngliche Größe und Position mit, in Deinem Beispiel:

    150, 200, 150, 400,
    

    Aber wenn Dein Hauptfenster eine WM_SIZE - Message bekommt, veränderst Du die Größe des Edit-Feldes via:

    MoveWindow(hEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
    

    auf die Maße des Hauptfensters.



  • Belli schrieb:

    beim Create gibst Du die ursprüngliche Größe und Position mit, in Deinem Beispiel:

    150, 200, 150, 400,
    

    Aber wenn Dein Hauptfenster eine WM_SIZE - Message bekommt, veränderst Du die Größe des Edit-Feldes via:

    MoveWindow(hEdit, 0, 0, LOWORD(lParam), HIWORD(lParam), TRUE);
    

    auf die Maße des Hauptfensters.

    Vielen Dank Belli 🙂
    Kannst du mir eventuell erklären was dieses LOW und Highword ist?

    https://msdn.microsoft.com/de-de/library/windows/desktop/ms632659(v=vs.85).aspx
    

    Habe hier schon gelesen und auch die MoveWindow Function separat aber ich werde
    daraus irgendwie nicht schlau.
    Liebe Grüße



  • buu2188 schrieb:

    Kannst du mir eventuell erklären was dieses LOW und Highword ist?

    https://msdn.microsoft.com/de-de/library/windows/desktop/ms632659(v=vs.85).aspx
    

    Habe hier schon gelesen und auch die MoveWindow Function separat aber ich werde
    daraus irgendwie nicht schlau.
    Liebe Grüße

    LOWORD und HIWORD extrahieren aus dem 32-bit parameter die beiden 16-Bit-hälften. Mehr nicht.



  • mgaeckler schrieb:

    buu2188 schrieb:

    Kannst du mir eventuell erklären was dieses LOW und Highword ist?

    https://msdn.microsoft.com/de-de/library/windows/desktop/ms632659(v=vs.85).aspx
    

    Habe hier schon gelesen und auch die MoveWindow Function separat aber ich werde
    daraus irgendwie nicht schlau.
    Liebe Grüße

    LOWORD und HIWORD extrahieren aus dem 32-bit parameter die beiden 16-Bit-hälften. Mehr nicht.

    Danke mgaeckler 🙂

    Und für was muss man diese Operation durchführen?



  • Dieser Thread wurde von Moderator/in Arcoth aus dem Forum C++ (alle ISO-Standards) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • buu2188 schrieb:

    Und für was muss man diese Operation durchführen?

    Na, um die beiden Hälften aus lParam zu extrahieren.
    Aus der MSDN zu WM_SIZE:

    lParam

    The low-order word of lParam specifies the new width of the client area.

    The high-order word of lParam specifies the new height of the client area.

    Es sind also zwei Informationen in lParam, und um die herauszufummeln, kann man die Makros HIWORD bzw. LOWORD benutzen.



  • Belli schrieb:

    buu2188 schrieb:

    Und für was muss man diese Operation durchführen?

    Na, um die beiden Hälften aus lParam zu extrahieren.
    Aus der MSDN zu WM_SIZE:

    lParam

    The low-order word of lParam specifies the new width of the client area.

    The high-order word of lParam specifies the new height of the client area.

    Es sind also zwei Informationen in lParam, und um die herauszufummeln, kann man die Makros HIWORD bzw. LOWORD benutzen.

    Aber für was brauche ich das? Habe im Tutorial nichts gefunden darüber.
    Wenn man sich die MoveWindow Function mal anschaut erwartet er doch als
    als übergebene Parameter 4 Integer. Wenn ich die ersten beiden für x und y = 0 lasse und die anderen beiden z.B 500 mache passiert das was ich wollte.
    Aber was explizit das mit diesem HIWORD und LOWORD seinen soll, verstehe ich nicht.

    BOOL WINAPI MoveWindow(
      _In_ HWND hWnd,
      _In_ int  X,
      _In_ int  Y,
      _In_ int  nWidth,
      _In_ int  nHeight,
      _In_ BOOL bRepaint
    );
    


  • Auch diese Frage zeigt, daß du wohl mit der WinAPI überfordert bist (wie bei deiner Frage zum "Chat Programm programmieren").

    buu2188 schrieb:

    und möchte gerne das diese Editbox nicht maximiert ist sonder nur einen von mir definierten Bereich abdeckt

    Wenn du die TextBox nicht verändern willst (bei der Größenänderung des Fensters), dann laß einfach den Aufruf von MoveWindow weg...



  • buu2188 schrieb:

    Wenn man sich die MoveWindow Function mal anschaut erwartet er doch als
    als übergebene Parameter 4 Integer. Wenn ich die ersten beiden für x und y = 0 lasse und die anderen beiden z.B 500 mache passiert das was ich wollte.

    Jo ... und warum machst Du das dann nicht?
    So, wie Du das machst, mit HIWORD und LOWORD aus lParam, ist es halt dafür gedacht, die Größe an das Fenster, das die WM_SIZE - Message bekommt, anzupassen.
    Denn genau diese Information steht in lParam, wie ich Dir weiter oben schon schrieb unter
    Aus der MSDN zu WM_SIZE:



  • Ok hab's verstanden.
    Vielen vielen Dank


Anmelden zum Antworten