Inhalt aus Editfenster mit SendMessage(..) per Button an Hauptfenster übergeben



  • **Hallo ich hab da ein Problem den Inhalt des Editfensters
    an die Variable(Pointer) *pText in Zeile 64 zu übergeben.
    Wenn ich den Button hButtonRead aus Zeile 145

    SendMessage(hEditH, WM_GETTEXT, 5, (LPARAM)pText);
    

    klicke, soll der Inhalt vom Editfenster ausgelesen und als Text im Hauptfenster
    ausgegeben werden siehe Zeile 86

    TextOut(hDC, 50,100, pText, sizeof(pText));
    

    .
    Wenn ich das Programm starte läuft noch alles, doch sobald ich den
    Button drücke stürzt das Programm ab.**

    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    
    //#include <string.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[] = "PC Herunterfahren 1.0";
    
        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  = CreateSolidBrush(RGB(128, 184, 223)); //(HBRUSH)GetStockObject(LTGRAY_BRUSH);
        wc.lpszMenuName   = NULL;
        wc.lpszClassName  = szAppName;
    
        RegisterClass(&wc);
    
        hWnd = CreateWindow( szAppName,
                             szAppName,
                             WS_OVERLAPPED | WS_SYSMENU, //WS_OVERLAPPEDWINDOW,
                             CW_USEDEFAULT,          /* X-Position auf dem Monitor ,Zahl oder CW_USEDEFAULT*/
                             CW_USEDEFAULT,          /* Y-Position auf dem Monitor */
                             400,          /* Fensterbreite              */
                             300,          /* Fensterhoehe               */
                             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 hEditH;	 //Edithandle wird erstellt
    	static HWND hButton; //Buttonhandle wird erstellt
    	static HWND hButtonRead;
    
    	char buffer[2];
    	const char *pConst = "leer";
    	char *pText = new char[];
    	pText = const_cast<char*>(pConst);
    
        switch(message)
        {
    
    	case WM_PAINT:
          {
             PAINTSTRUCT ps;
             HDC         hDC;
             const char  szText[] = "Hallo, dies ist der Text.";
    
    		 //SYSTEMTIME tm; GetSystemTime(&tm);
    		 //long Zeit = (long) GetCurrentTime();
    		 //GetSystemTime(), GetLocalTime()	//GetTickCount();
    		 //sprintf(buffer, "%d", 5);
    		 itoa(123456, buffer, 10);	//itoa(Zahl, -> char[], Basis);
    
             hDC = BeginPaint(hWnd, &ps);
             {
    			SetBkMode(hDC, TRANSPARENT); //setzt die Texthintergrundfarbe auf transparent
    			TextOut(hDC, 50, 10, szText, sizeof(szText) - 1);
    			TextOut(hDC, 50,100, pText, sizeof(pText));
    			TextOut(hDC, 50,150,"ABC ", 50);
    			TextOut(hDC, 50,200,buffer, sizeof(buffer)+8 );
    			SetPixel(hDC, 2,2, BLACK_BRUSH);
             }
             EndPaint(hWnd, &ps);
    
             return 0;
          }
        case WM_CREATE:
            {
                hEditH = CreateWindowEx(WS_EX_CLIENTEDGE,
                                       "edit",
                                       NULL,    // <- das ist der Inhalt des Editfelds
                                       WS_CHILD | WS_VISIBLE, //| WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL,
                                       0, 0, 0, 0,
                                       hWnd,
                                       NULL,
                                       ((LPCREATESTRUCT) lParam) -> hInstance,
                                       NULL);
    
    			hButton = CreateWindow(  "button",
                                      "Beenden",
                                      WS_CHILD | WS_VISIBLE,
                                      0, 0, 0, 0,
                                      hWnd,
                                      NULL,
                                      ((LPCREATESTRUCT) lParam) -> hInstance,
                                      NULL);
    
    			hButtonRead = CreateWindow(  "button",
                                      "read",
                                      WS_CHILD | WS_VISIBLE,
                                      0, 0, 0, 0,
                                      hWnd,
                                      NULL,
                                      ((LPCREATESTRUCT) lParam) -> hInstance,
                                      NULL);
                return 0;
            }
        case WM_SIZE:
            {
                MoveWindow(hEditH, 80, 50, 100, 20, TRUE);
    // MoveWindow(hEdit, 20, 50, LOWORD(lParam), HIWORD(lParam), TRUE);
    // static bool MoveWindow(IntPtr handle, int x, int y, int width, int height, bool redraw);
    			MoveWindow(hButton, LOWORD(lParam) / 2 - 50, HIWORD(lParam) - 30, 100, 22, TRUE);
    			MoveWindow(hButtonRead, 200, 50, 50, 22, TRUE);
    			return 0;
            }
    
    	case WM_COMMAND:
    		{
    			if (lParam == (LPARAM)hButton)
    				{
    					if (HIWORD(wParam) == BN_CLICKED) SendMessage(hWnd, WM_CLOSE, 0, 0);
    				}
    
    			if (lParam == (LPARAM)hButtonRead)
    				{
    				if (HIWORD(wParam) == BN_CLICKED)	{  SendMessage(hEditH, WM_GETTEXT, 5, (LPARAM)pText);
    /*
    														//Textlänge ermitteln (die 1 für Terminierung)
    														int le = SendMessage(hEditH,WM_GETTEXTLENGTH,0,0) + 1;
    
    														//Entsprechend Speicher belegen
    														char* buf = new char[le];
    
    														//Window - Text in Buffer kopieren
    														SendMessage(hEditH,WM_GETTEXT,(WPARAM)le,(LPARAM)buf);
    
    														text = buf;
    														//SendMessage(hwndEdit2, WM_GETTEXT, msize(textstring), (long) textstring);
    
    														//in ein Integer konvertieren
    														//int myVal = atoi(buf);
    														//Speicher freigeben;
    														//delete [] buf; 
    */
    													}
    				}
    
             return 0;
    		}
        case WM_CLOSE:
            {
                DestroyWindow(hWnd);
                return 0;
            }
        case WM_DESTROY:
            {
                PostQuitMessage(0);
                return 0;
            }
        }
        return DefWindowProc(hWnd, message, wParam, lParam);
    }
    
    /*
    char *buffer = NULL;
                int iLength;
    
                iLength = GetWindowTextLength(hEdit);
    
                buffer = (char*) malloc(iLength);
    
                GetWindowText(hEdit, buffer, iLength+1);
    
    SENDMESSAGE()
    Eine sehr breit einsetzbare Funktion ist SendMessage(...). Die allgemeine Syntax ist:
    LRESULT SendMessage (  HWND hWnd,  UINT Msg,  WPARAM wParam,   LPARAM lParam );
    
    Der erste Parameter legt das Fenster fest, an das die Nachricht gesendet werden soll. 
    Dann folgt die Nachricht und ihre beiden Parameter.
    Wir senden also die Nachricht EM_SETREADONLY mit den Parametern wParam = TRUE und lParam = 0. 
    In MSDN finden Sie die betreffenden Informationen: 
    
    */
    

    **Wer kann mir helfen das Programm zum laufen zubringen?
    Ich habe leider keine Erfahrung damit, war schon schwer genug das Programm so hinzubekommen wie es jetzt ist, und hab schon nach Lösungen in anderen vergleichbaren Threads gesucht doch nichts passendes gefunden.

    Vielen Dank im Voraus für Hilfe.** 🙂

    Grüsse rom4o



  • if (lParam == (LPARAM)hButtonRead)
                    {
                    if (HIWORD(wParam) == BN_CLICKED)    {  SendMessage(hEditH, WM_GETTEXT, 5, (LPARAM)pText);
    /*
                                                            //Textlänge ermitteln (die 1 für Terminierung)
                                                            int le = SendMessage(hEditH,WM_GETTEXTLENGTH,0,0) + 1;
    
                                                            //Entsprechend Speicher belegen
                                                            char* buf = new char[le];
    
                                                            //Window - Text in Buffer kopieren
                                                            SendMessage(hEditH,WM_GETTEXT,(WPARAM)le,(LPARAM)buf);
    
                                                            text = buf;
                                                            //SendMessage(hwndEdit2, WM_GETTEXT, msize(textstring), (long) textstring);
    
                                                            //in ein Integer konvertieren
                                                            //int myVal = atoi(buf);
                                                            //Speicher freigeben;
                                                            //delete [] buf;
    */
                                                        }
                    }
    

    an dieser stelle ist pText nich groß genug allokiert...


  • Mod

    1. Lerne C++, der folgene Code ist absoluter Unsinn:

    char *pText = new char[];
    pText = const_cast<char*>(pConst);
    Und das auch noch mit jeder Nachricht.
    

    2. Du kannst doch nicht erwarten in einen konstanten Speicher Daten einzulesen!
    3. Warum machst Du es nicht so, wie es da in dem auskommentierten Textsteht?



  • Hallo, erst mal danke für die Antworten bisher.

    @BorisDieKlinge
    ich verstehe nicht wie du das meinst

    pText nich groß genug allokiert

    Was soll ich denn ändern dass es funktioniert?
    Ich habe folgendes probiert Zeile 64 statt

    char *pText = new char[];
    

    habe ich einen größeren Zeichenbereich reserviert

    char *pText = new char[50];
    

    hat aber nix gebracht.

    @Martin Richter
    *pText ist doch garnicht konstant, der Pointer zeigt ja nur auf eine Konstante
    weil ich zu begin den String leer ausgeben möchte, sobald der Button gedrückt wird
    soll der Pointer *pText auf den Inhalt des Editfensters zeigen.
    Und das was da grau auskommentiert ist hat nicht funktioniert, irgendwas ist immer noch absolut falsch.

    Also brauche eindeutig weitere Hilfe 🙂

    Viele Grüsse



  • // Zeile 62
     char buffer[2]; 
    
    // Zeile 80
     itoa(123456, buffer, 10);
    

    "buffer" ist zu klein für das was itoa() machen soll.



  • Stimmt ist eigentlich zu klein, aber wenn du das Programm mal ausführst siehst du,
    dass trotzdem über Zeile 88

    TextOut(hDC, 50,200,buffer, sizeof(buffer)+8 );
    

    der richtige Inhalt 123456 im Fenster ausgegeben wird.
    Das ist auch so eine Sache die ich überhaupt nicht verstehe.

    Aber die Sache hier mit buffer hat aber eigentlich garnichts mit meinem eigentlichen Problem den Inhalt des Editfensters auszulesen und darzustellen.


  • Mod

    rom4o schrieb:

    *pText ist doch garnicht konstant, der Pointer zeigt ja nur auf eine Konstante
    weil ich zu begin den String leer ausgeben möchte, sobald der Button gedrückt wird
    soll der Pointer *pText auf den Inhalt des Editfensters zeigen.
    Und das was da grau auskommentiert ist hat nicht funktioniert, irgendwas ist immer noch absolut falsch.

    1. Der Zeiger zeigt eben auf einen Konstanten Speicher, übel genug, dass Du const weggecastet hast.
    2. Wenn Du WM_GETTEXT ausführst wird hier kein Zeiger getauscht, sondern der Datenbereich benutzt auf den pText zeigt und der ist eben Konstant!
    3. pText wird durch WM_GETEXT mit einer Kopie gefüllt. Er kann nach Drücken des Zeigers auf nichts Anderes zeigen.
    4. Dir ist noch nicht klar, was die Lebenszeit von Variablen angeht. pText wird jedesmal neu initialisiert, bei jeder Nachricht. Ist Dir klar was das bedeutet?

    rom4o schrieb:

    Also brauche eindeutig weitere Hilfe 🙂

    Du brauchst einen Grundkurs bzgl. C/C++



  • @ Martin Richter
    Hallo nun ja du magst recht haben, und meine Kenntnisse sind wirklich nicht besonders gut, fange auch gerade erst an mit c++, alles ganz anders als in java.
    Aber nun ja wie kann ich denn nun dieses Problem lösen.
    Vielleicht kannst du mir ja bei der Lösung helfen, es muss doch theoretisch nicht viel am Code geändert werden.

    Du brauchst einen Grundkurs bzgl. C/C++

    Ich hab schon sehr viel im Web gesucht habe keinen Kurs gefunden der mir bei der Lösung des Problems hilft, desshalb bin ich ja hier in diesem Forum gelandet.

    Viele Grüsse, und danke für weitere Ratschläge



  • Hat denn keiner einen Tip wie ich das Problem lösen kann???

    🙂



  • rom4o schrieb:

    Du brauchst einen Grundkurs bzgl. C/C++

    Ich hab schon sehr viel im Web gesucht habe keinen Kurs gefunden der mir bei der Lösung des Problems hilft, desshalb bin ich ja hier in diesem Forum gelandet.

    http://wwws.htwk-leipzig.de/~sschwarz/volkart/html/inhalt.html
    Fange vorne an und arbeite Dich bis hinten durch. Dein "Problem" ist, dass Du sämliche C++-Schlüsselwörter falsch verwendest (siehe Martin's Hinweis). So ein "Problem" wird selbstverständlich nicht explizit in einem Tutorial angesprochen. Lerne einfach, wie man diese verwendet.

    ➡

    int iLen = static_cast<int>(SendMessage(hEdit, WM_GETTEXTLENGTH, 0, 0));
    if(!iLen)
      ...
    TCHAR* pszBuf = new TCHAR[++iLen];
    SendMessage(hEdit, WM_GETTEXT, iLen, reinterpret_cast<LPARAM>(pszBuf));
    // Irgendwas mit 'pszBuf' machen...
    
    delete [] pszBuf;
    

Log in to reply