Nen einfaches Fenster erzeugen



  • YEEEHAA ! 😃 😃

    also, pass auf: ich habs! musste ein bischen tricksen, aber ich hab genau das, was du willst: das is ein konsolen-programm das jederzeit auf cout zugreifen kann, nur das es eben ein fenster erstellt 😉

    musst halt nur noch sehen, wie du das deinem compiler bebringst (is wie gesagt ne konsolen-ab - das muss man ja glaub ich beim vc++ angeben, ahb ich selber nicht)

    so. here it comes:

    #include <iostream>
    #include <windows>
    
    using namespace std;
    
    HINSTANCE hInst;
    
    LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);
    
    int main(int argc, char* argv[])
    {
    	cout << "Programm startet...\nParameter:" << endl;
    	if(argc == 1)
    	{
    		cout << "(keine)" << endl;
    	}
    	else
    	{
    		for(int i = 1; i < argc; i++)
    		{
    			cout << '[' << i << "] = \"" << argv[i] << '\"' << endl;
    		}
    	}
    
    	hInst = GetModuleHandle(NULL);
    
    	WNDCLASSEX wc = {sizeof(WNDCLASSEX),
    					CS_HREDRAW | CS_VREDRAW | CS_OWNDC,
    					MainWndProc, 0, 0, hInst,
    					LoadIcon(NULL, IDI_APPLICATION),
    					LoadCursor(NULL, IDC_ARROW),
    					CreateSolidBrush(RGB(8, 8, 64)),
    					NULL,
    					"myWindowClass",
    					NULL};
    
    	if(RegisterClassEx(&wc)) cout << "Fensterklasse registriert." << endl;
    	else
    	{
    		cout << "! RegisterClassEx()" << endl;
    		return -1;
    	}
    
    	HWND hWnd = CreateWindow("myWindowClass",
    		"Deine App",
    		WS_TILED | WS_CAPTION | WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SIZEBOX | WS_SYSMENU | WS_VISIBLE,
    		100, 100,
    		300, 200,
    		NULL, NULL, hInst, NULL);
    
    	if(hWnd) cout << "Fenster erstellt." << endl;
    	else
    	{
    		cout << "! CreateWindow()" << endl;
    		return -1;
    	}
    
    	ShowWindow(hWnd, SW_SHOW);
    	UpdateWindow(hWnd);
    
    	MSG msg;
    	while(GetMessage(&msg, NULL, 0, 0) != 0)
     	{
    		TranslateMessage(&msg);
    		DispatchMessage(&msg);
    	}
    
    	cout << "Over and Out.";
    
    	return 0;
    }
    
    LRESULT CALLBACK MainWndProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
    {
    	switch(msg) {
    
    		case WM_CREATE:
    		{
    			cout << "WM_CREATE" << endl;
    			return 0;
    		}
    
    		case WM_LBUTTONDOWN:
    		{
    			cout << "Mausklick" << endl;
    			return 0;
    		}
    
    		case WM_SIZE:
    		{
    			cout << "WM_SIZE" << endl;
    			return 0;
    		}
    
    		case WM_HELP:
    		{
    			cout << "HILFE! ;)" << endl;
    			return 0;
    		}
    
    		case WM_DESTROY:
    		{
    			cout << "WM_DESTROY" << endl;
    			PostQuitMessage(0);
    			return 0;
    		}
    
    		default:return(DefWindowProc(hWnd, msg, wParam, lParam));
    	}
    }
    

    lw



  • Ich verstehe das so, dass du die Konsole nur zu Testzwecken brauchst:

    ...also dieser Teil muss wirklich eigenständig sein, das soll nen kleines Konsolenfenster geben, damit ich die Werte in meinen Programmen leichter prüfen kann

    Daher könntest du es ja auch mal versuchen in deinem Programm eine Konsole zu öffnen. Ich bin mir aber nicht sicher, ob dann cout funktioniert, denke aber schon. Ich probiers mal schnell aus, interessiert mich jetzt.

    Also cout und printf funktionieren nicht. Aber mit WriteConsole(...); kann man dann was in die Konsole schreiben.



  • warum nicht meine lösung ? 😕

    sie ist einfach und effizient! :p

    lw



  • Weil man sie nicht einfach in ein bestehendes Projekt einbauen kann, dafür funktioniert aber auch cout...

    AllocConsole(); kannst du einfach in WinMain schreiben und du hast ne Console. Evtl. noch schnell eine Funktion MyPrintf() geschrieben und fertig ist. Aber egal, soll er machen wie er will 😃



  • Danke Lawilog, werds gleich mal testen 🙂

    Daniel ich will im Grunde ostream aus der Library nachbauen, so dass man den code
    nur copy n' paste'n müsste und eben ein myOstream cout erstellen müsste. Die Ausgabe
    selbst ist unabhängig von der myOstream Klasse, da ich das über ne Schnittstelle
    implementiere, so könnt ich auch das ganze auf nen Konsolenfenster ausgeben.

    Und vor allem will ich irgendwas, für mich, halbwegssinnvolles programmieren 🤡

    Lawilog deine Methode dürfte, aber mit jeder Win-Anwendung gehen, da du ja nur das
    GetModuleHandle eingefügt hast, wenn ich das richtig sehe.

    Edit:

    Wenn ich darauf Text wie folgt ausgebe, dann kann ich diesen nicht markieren, würd
    ich aber gerne um ihn in die Zwischenablage kopieren zu können.

    PAINTSTRUCT ps;
    HDC hdc;
    hdc = BeginPaint (hWnd, &ps) ;
    TextOut (hdc, 15, 10, "WM_SIZE", lstrlen ("WM_SIZE"));
    


  • Mag mir keiner helfen 😞 😉



  • Dann darfst du den Text nicht direkt in dein Fenster zeichnen, sondern musst ein entsprechendes Control (z.B. EDIT) nehmen



  • Also einfach ein Edit-Feld welches so groß wie das gesamte Fenster ist?



  • Jetzt will ich meinen Senf auch noch schnell dazu abgeben:

    Du kannst die Ausgaben z.B. über eine Named Pipe einfangen. Nach dem Erzeugen der Pipe 'biegst' Du mit freopen stdout um und schaltest das Buffering mit setvbuf und _IONBF aus.

    Alle Ausgaben an stdout landen dann in Deiner Pipe. Damit sollte sich doch etwas machen lassen. (Setzt voraus, daß ich das Problem richtig erfasst habe)



  • -King- schrieb:

    Jetzt will ich meinen Senf auch noch schnell dazu abgeben:

    Du kannst die Ausgaben z.B. über eine Named Pipe einfangen. Nach dem Erzeugen der Pipe 'biegst' Du mit freopen stdout um und schaltest das Buffering mit setvbuf und _IONBF aus.

    Alle Ausgaben an stdout landen dann in Deiner Pipe. Damit sollte sich doch etwas machen lassen. (Setzt voraus, daß ich das Problem richtig erfasst habe)

    Wäre sicher ne Möglichkeit, aber ich werde trotzdem meine Methode verwenden, da
    ich so etwas mehr Übung bekomme in bezug auf OOP 🙂


Anmelden zum Antworten