Fenster wird nicht geöffnet Prozessor Qualmt nichts passiert



  • Hi,
    Ich wollte ein Programm schreiben was änlich wie das ICQ fenster aufgebaut ist nur leider habe ich irgendwo da drin aktuell ein Problem der öffnet das fenster nicht vollständig und die Prozessorleistung schnellt auf 50% hoch.
    Exakter werden nur die Buttons und die Editfelder geladen der eigentliche hintergrund nicht. Könnt ihr mir helfen?

    #include "stdafx.h"
    #include <winsock2.h>
    #include <winsock.h>
    #include <windows.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <iostream>
    #include <math.h>
    #include <fstream>
    #include <cstring>
    #include <string>
    #include <map>
    using namespace std;
    
    LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
    
    //DWORD WINAPI test(LPVOID);
    
    void verlauf_nullen();
    bool Textda=false;
    bool verbunden=false;
    SOCKET server=SOCKET_ERROR;
    char* verlauf=new char[32000];
    SOCKET Verbinden();
    
    struct daten
    {
    	HWND eingabe;
    	HWND ausgabe;
    	char buf[1000];
    
    }Info;
    
    int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
    					PSTR szCmdLine, int iCmdShow)
    {	
    	/*HANDLE H_Thread;
    	DWORD ThreadID;
    	H_Thread=CreateThread(NULL,
    		0,
    		test,
    		(LPVOID*)&Info,
    		NULL,
    		&ThreadID);*/
    
    	HWND     hWnd;
    	MSG      msg;
    	WNDCLASS wc;
    
    	const char szAppName[] = "Text ausgeben";
    
    	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(WHITE_BRUSH);
    	wc.lpszMenuName   = NULL;
    	wc.lpszClassName  = szAppName;
    
    	RegisterClass(&wc);
    
    	hWnd = CreateWindow( szAppName,
    						szAppName,
    						WS_SYSMENU ,			//Das bewirkt, dass das Fenster nur einen Schließen Button hat
    						CW_USEDEFAULT,
    						CW_USEDEFAULT,
    						700,
    						350,
    						NULL,
    						NULL,
    						hInstance,
    						NULL );
    
    	ShowWindow(hWnd, iCmdShow);
    	UpdateWindow(hWnd);
    
    	while(GetMessage(&msg, NULL, 0, 0))
    	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    
    	return (int)msg.wParam;
    }
    
    LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
    {
    
    	static HWND hEdit_eingabe, hButton_verbinden, hButton_senden, hEdit_ausgabe;
    
    	static char buffer_eingabe[1000];
    	static char buffer_ausgabe[1000];
    
    	static int iEntscheidung;
    
    	switch(message)
    	{
    	case WM_CREATE:
    		{
    			hEdit_ausgabe= CreateWindow("edit",
    				buffer_ausgabe,
    				ES_READONLY | WS_CHILD | WS_VISIBLE | ES_MULTILINE | 
    				ES_AUTOVSCROLL | WS_VSCROLL ,
    				0, 0, 0, 0,
    				hWnd,
    				NULL,
    				((LPCREATESTRUCT) lParam) -> hInstance,
    				NULL);
    
    			hEdit_eingabe = CreateWindow("edit",
    				buffer_eingabe,    // <- das ist der Inhalt der Editfelds
    				WS_CHILD | WS_VISIBLE | ES_MULTILINE | //Paar styles
    				ES_AUTOVSCROLL,
    				0, 0, 0, 0,
    				hWnd,
    				NULL,
    				((LPCREATESTRUCT) lParam) -> hInstance,
    				NULL);
    
    			hButton_senden = CreateWindow("button",
    				"Senden",
    				WS_CHILD | WS_VISIBLE ,
    				0, 0, 0, 0,
    				hWnd,
    				NULL,
    				((LPCREATESTRUCT) lParam) -> hInstance,
    				NULL);
    
    			hButton_verbinden = CreateWindow("button",
    				"Verbinden",
    				WS_CHILD | WS_VISIBLE ,
    				0, 0, 0, 0,
    				hWnd,
    				NULL,
    				((LPCREATESTRUCT) lParam) -> hInstance,
    				NULL);
    
    			return 0;
    		}
    
    	case WM_COMMAND:
    		{
    
    			if (lParam == (LPARAM)hButton_senden)
    			{
    				if (HIWORD(wParam) == BN_CLICKED)
    				{
    					if(GetWindowTextLength(hEdit_eingabe) >999) 
    					{
    						MessageBox(hWnd, "Text ist zu lang! Text soll 1000 Zeichen nicht überschreiten!", "Fehler", 0);
    						return 0;
    					}
    					else 
    					{
    						GetWindowText(hEdit_eingabe, buffer_eingabe, GetWindowTextLength(hEdit_eingabe)+1);
    						if(buffer_eingabe[0] == '\0')
    						{
    							MessageBox(hWnd, "Kein Text!", "Fehler", 0);
    						}
    
    						else 
    						{		///Verlauf speichern
    							SetWindowText(hEdit_ausgabe, buffer_eingabe);
    							SetWindowText(hEdit_eingabe, "\0");
    							///MessageBox(hWnd, buffer_eingabe, "Der Text lautet:", 0);
    						}
    					}
    			 }
    
    			}
    
    /////////////////////////////////////////////////////////////////////////////
    
    			if (lParam == (LPARAM)hButton_verbinden)
    			{
    				if (HIWORD(wParam) == BN_CLICKED)
    				{
    					iEntscheidung = MessageBox(hWnd, "Verbinden?", "Bestätgung", MB_YESNO);
    
    					if(iEntscheidung == IDNO)
    					{
    						return 0;
    					}
    					else 
    					{
    						if(!verbunden)
    						{
    							SetWindowText(hEdit_eingabe, "\0");
    							server=Verbinden();
    							if(server!=SOCKET_ERROR || INVALID_SOCKET)
    							{
    								SetWindowText(hEdit_ausgabe,"Verbunden");
    
    								verlauf_nullen();
    							}
    						}
    					}
    				}
    			}
    
    			return 0;
    
    		}
    
    	case WM_SIZE:
    		{              
    			MoveWindow(hEdit_eingabe, 5, 160, 534, 150, TRUE);
    			MoveWindow(hEdit_ausgabe, 5, 5  , 534, 150, TRUE);
    			MoveWindow(hButton_senden, 550, 215, 125, 25, TRUE);
    			MoveWindow(hButton_verbinden, 550, 245, 125, 25, TRUE);
    			return 0;
    		}
    
    	case WM_CLOSE:
    		{
    			DestroyWindow(hWnd);
    			return 0;
    			delete[] verlauf;
    		}
    	case WM_DESTROY:
    		{
    			PostQuitMessage(0);
    			//delete[] verlauf;
    			return 0;
    		}
    
    		return DefWindowProc(hWnd, message, wParam, lParam);
    
    	}
    }
    
    void verlauf_nullen()
    {
    	for(int i=0;i<32000;i++)
    	{
    		verlauf[i]='\0';
    	}
    
    }
    
    /*DWORD WINAPI test(LPVOID x)
    {	
    	Sleep(10000);
    	return 0;
    }*/
    
    SOCKET Verbinden()
    {
    	SOCKET client;
    	SOCKADDR_IN addr;
    	long fh;
    
    	client=socket(AF_INET,SOCK_STREAM,0);
    	while(true)
    	{
    		if(client==INVALID_SOCKET)
    		{
    			continue;
    		}
    
    		// Verbinden
    		memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten
    		addr.sin_family=AF_INET;
    
    		addr.sin_port=htons(1000); // wir verwenden mal port 12345
    
    		addr.sin_addr.s_addr=inet_addr("127.0.0.1");//IP); // zielrechner ist unser eigener
    
    		fh=connect(client,(SOCKADDR*)&addr,sizeof(SOCKADDR));
    		if(fh==SOCKET_ERROR)
    		{
    
    			continue;
    		}
    		verbunden=true;
    
    		return client;
    
    	}
    }
    


  • Dir ist folgende Zeile verrutscht:

    return DefWindowProc(hWnd, message, wParam, lParam);
    

    Die gehört hinter den switch Block, nicht in diesen. Das nächste mal bitte sämtliche Warnungen des Compiler anschalten. Dann wäre dir auch aufgefallen, dass nicht alle Pfade eine return Anweisung besitzen.



  • nö da fehlt ein default



  • HaterSkater schrieb:

    nö da fehlt ein default

    Nö, das ist egal, weil es auf das gleiche hinausläuft. 🤡

    @Matyr
    Beim Überfliegen ist mir übrigens noch etwas aufgefallen:

    case WM_CLOSE:
            {
                DestroyWindow(hWnd);
                return 0;
                delete[] verlauf;
            }
        case WM_DESTROY:
            {
                PostQuitMessage(0);
                //delete[] verlauf;
                return 0;
            }
    

    delete[] verlauf wird nie aufgerufen. Ich weiss nicht, ob das wirklich so beabsichtigt ist.



  • ne das ist ned egal wenn er im switch breaked dann wird bei dir DefWindowProc trotzdem noch aufgerufen und dann gehts voll in die hose.



  • Wie du sehen kannst, wird nirgendwo "gebreaked". Und da geht auch nichts in die Hose, selbst wenn DefWindowProc aufgerufen werden würde, wo es nicht mehr notwendig ist. Die WinAPI Dokumentation schreibt hier idR explizit das Verhalten vor.
    Als kleiner Tipp noch, lass am besten solchen Schlaumeierkommentare bleiben. Damit machst du dir keine Freunde. Zumal sie hier nicht mal Sinn ergeben. Als Alternative kann man DefWindowProc natürlich auch in einen default Block setzen. Das kann man aber auch in einem vernünftigen Ton schreiben ohne fehlplatztiertes "nö". 😉



  • du hast wohl ein rad ab. das ist mit sicherheit NICHT egal ob du DefWindowProc aufrufst, auch wenn du die nachricht schon selbst behandelt hast. und ein break macht er noch rein. du willst mir hier was erzählen, obwohl du OFFENSICHTLICH FALSCHE ratschläge erteilst, roflig. lern nochmal 3 jahre und dann versuchs nochmal, du kleiner neuling.



  • haterskater schrieb:

    und ein break macht er noch rein.

    Ja, bestimmt. Das macht er nur wegen dir. 🙄 Deine Überheblichkeit und verbalen Entgleisungen machen dich zudem erst so richtig lächerlich. Nur so zur Info.
    Aber da das Problem des OP gelöst sein sollte, macht hier sowieso ein Mod gleich dicht.



  • haterskater, dir ist wohl ein bisschen fad im kopf.



  • sorry leute, die starke sonneneinstrahlung heute hat mir nicht gut getan



  • bla bla, hustbaer hoer halt auf mich zu faken. willst du meine aussage etwa bestreiten? immer das gleiche in diesem forum. zig neider, die es nicht ertragen können, das ich (oder andere) mehr ahnung haben als sie.



  • haterskater schrieb:

    sorry leute, die starke sonneneinstrahlung heute hat mir nicht gut getan

    fake 👎



  • danke return verschieben hat geholfen

    komme mit den ganzen klammern nich kla...

    mfg. matyr 👍


Anmelden zum Antworten