BIlder in Konsole includen klappt 50 %



  • es gibt ein undokumentieres flag für CreateConsoleScreenBuffer mit dem man bilder in der konsole darstellen kann.



  • Wenn ich ne WIn Andwenung machen funktioniert dann mein Quellcode den ich für die Konsole geschrieben hab genauso ? was für ein FLag xD ? .. Kann man den Quellcode oben nicht so bearbeiten das er nicht abschmiert wenn man das fenster herumzieht oder größer macht ?



  • Ein ganz toller Trick ! schrieb:

    Martin Richter schrieb:

    Dies funktioniert nur, weil der DC der Comsolen Anwendung direkt manipuliert wird.
    Warum willst Du das? Erzeuge eine Windows Applikation und Du brauchst keine Tricks dazu.

    Das ist aber ein gaaaaaaaanz ein toller Trick, sich ein DC über das HWND zu holen !
    Booooooooooaaaaaaaah eeeeeeeeyyyyyyyyy !

    Das ist ein so ganz ein doller Trick, wie bei der Windowsapplikation, da holt man sich auch ein DC 😃
    MfG
    Der Trickreiche

    p.s.
    Comsolen -> Consolen 🙂

    Es ist ein böser Hack, z.B. schonmal deswegen weil dir keiner garantiert dass die Konsole ein Fenster einer Klasse namens "ttyGrab" hat. Dein zynisches Kommentar ändert daran nichts.


  • Mod

    Vor allem garantiert ihm keiner, dass eine consolen Anwendung überhaupt ein Fenster hat! 🕶

    Und wenn kein Fenster dann scon gar keine DC!



  • Kann man mit der SDL Lib Bilder in Konsole rein bekommen ? Wie siehts aus wenn ich ne Win anwendung mache und einfach meinen Normalen Quellcode behalten kennt er ihn dann trotzdem ?


  • Mod

    Warum muss es denn einen Konsolen Anwendung sein?



  • Toa schrieb:

    Kann man mit der SDL Lib Bilder in Konsole rein bekommen ? Wie siehts aus wenn ich ne Win anwendung mache und einfach meinen Normalen Quellcode behalten kennt er ihn dann trotzdem ?

    SDL zeigt dir Bilder nicht in der Konsole an. SDL erzeugt dir Fenster, also richtige Windows-Fenster, in denen du deine Grafiken, Bilder, etc. anzeigen lassen kannst. Davon bekommst du bloss nichts mit, weil es in Bibliothekfunktionen eingebettet ist.
    Das ganze kannst du von einer Konsolenanwendung aus starten, das ist richtig.

    Was verstehst du unter deinem normalen Quellcode, meinst du das Beispiel, mit dem du den Thread eröffnet hast ?
    Das ist eine Mischung zwischen einem Windowsprogramm und einem Konsolenprogramm.
    Vom Konsolenprogramm aus ( main ) wird die CreateWindowsEx-Funktion aufgerufen, die ein Fenster erzeugt. Allerdings fehlt da noch die Fensterprozedur und die Nachrichtenschleife, unerlässlich für ein funktionierendes Windowsprogramm.
    Und gucke mal in Zeile 93. Das Windowshandle verschwindet im Nirvana, das nimmt keine Funktion entgegen, wird nirgends gespeichert. Das Betriebssystem weiss gar nicht, an wen es die Nachrichten schicken soll ( Mausklicks, Änderungen der Fenstergrösse, usw. )

    Edit:

    Und wenn du nun unbedingt ein Bild in der Konsole ausgeben möchtest, kannst du ja immernoch das Beispiel aus diesem Forum benutzen.



  • Also mit normalen QUelltext meine ich einfach den QUelltext den normale Console Applications lesen. Kannst du mir zufällig den obrigen Quelltext ändern sodass die Konsole nicht mehr abschmiert 😞 hab nicht so viel Ahung von WInAnwendungen.
    Also wenns nicht zuviel Arbeit ist wäre es echt super brauch das unbediengt.



  • Ich könnte dir etwas zusammenklicken, das du von einem Konsolenprogramm aus starten kannst und das dir ein Windowsfenster mit einem Bild laden kann.

    Aber auf Dauer wirst du damit wohl kaum glücklich werden, denn es kann dann wirklich nur ein Bild anzeigen.

    Vielleicht lohnt es dann doch für dich, auf längere Sicht gesehen, wenn du dich mit einer Grafikbibliothek wie z.B. SDL anfreundest ?



  • ALso das hab ich sowieso vor . ... aber so als Momentan Lösung wäre das echt nett wenn du sowas schreiben könntest für mich . Das Prob ist das ich die Bilder für Folgendes brauche. Ich schreibe momentan ein Consolen Basierendes Game und der KampfModus soll so wie der von Pokemon aussehen heißt : Links oben das Monster rechts unten der CHarakter und dann kann man in einem menü unter dem Char attacken und sowas auswählen , deswegen wäre der erste Quellcode von mir auch perfect nur leider schmiert die Konsole ab wenn man sie bewegt oder größer zieht 😞 *wein*



  • Nu heul ma nicht gleich 😃

    Bitte sehr:

    #include <windows.h>
    #include <stdio.h>
    
    char* pcBmp =  "C:\\Pics\\abc.bmp";
    
    int Run();
    HBITMAP LoadBitmapOnce();
    LRESULT CALLBACK WindProcedure(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
    
    int main()
    {
    	HWND hwnd;
    	char szTitle[]   = "Bitmap View starter";
    
    	SetConsoleTitle(szTitle);
    	hwnd = FindWindow( "ConsoleWindowClass", szTitle);
    
    	Run();
    
    	PostMessage( hwnd, WM_CLOSE,0, 0);
    	return 0;
    }
    
    int Run()
    {
        WNDCLASSEX  WndCls;
        char szAppName[] = "Bitmap View";
    	MSG         Msg;
    
        WndCls.cbSize        = sizeof(WndCls);
        WndCls.style         = CS_OWNDC | CS_VREDRAW | CS_HREDRAW;
        WndCls.lpfnWndProc   = WindProcedure;
        WndCls.cbClsExtra    = 0;
        WndCls.cbWndExtra    = 0;
        WndCls.hInstance     = NULL;
        WndCls.hIcon         = LoadIcon(NULL, IDI_APPLICATION);
        WndCls.hCursor       = LoadCursor(NULL, IDC_ARROW);
        WndCls.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
        WndCls.lpszMenuName  = NULL;
        WndCls.lpszClassName = szAppName;
        WndCls.hIconSm       = NULL;
        RegisterClassEx(&WndCls);
    
        CreateWindowEx(WS_EX_OVERLAPPEDWINDOW,
                              szAppName,
                              szAppName,
                              WS_OVERLAPPEDWINDOW | WS_VISIBLE,
                              CW_USEDEFAULT,
                              CW_USEDEFAULT,
                              CW_USEDEFAULT,
                              CW_USEDEFAULT,
                              NULL,
                              NULL,
                              NULL,
                              NULL);
    
        while( GetMessage(&Msg, NULL, 0, 0) )
        {
            TranslateMessage(&Msg);
            DispatchMessage( &Msg);
        }
       return  (Msg.wParam);
    }
    
    HBITMAP LoadBitmapOnce()
    {
    	return (HBITMAP)LoadImage(NULL, pcBmp, IMAGE_BITMAP, 0, 0,
    				 LR_LOADFROMFILE | LR_CREATEDIBSECTION | LR_DEFAULTSIZE);
    }
    
    LRESULT CALLBACK WindProcedure(HWND hWnd, UINT Msg,
    			   WPARAM wParam, LPARAM lParam)
    {
        HDC hDC;
    	HDC MemDC;
        static HBITMAP hbmp;
    	static int iBitmapLoaded = 0;
    	char buf[256];
    
    	PAINTSTRUCT Ps;
    	RECT r;
    
    	if( !iBitmapLoaded )
    	{
    		hbmp = LoadBitmapOnce();
    		if ( !hbmp )
    		{
    			sprintf( buf, "Failed on LoadImage. %s not found.", pcBmp ); 
    			MessageBox( NULL, buf, "Picture not found", MB_OK );
    			ExitProcess(1);
    		}
    		iBitmapLoaded = 1;
    	}
    
    	if ( !GetWindowRect( hWnd, &r ) )
    	{		 
    		MessageBox( NULL, "Failed on GetWindowRect", "Error", MB_OK );
    		ExitProcess(1);
    	}
    
        switch(Msg)
        {
    		case WM_DESTROY:
    
    			DeleteObject(hbmp);
    			PostQuitMessage(WM_QUIT);
    
    		break;
    
    		case WM_PAINT:
    
    			hDC = BeginPaint(hWnd, &Ps);
    			if ( !hDC )
    			{
    				MessageBox( NULL, "Failed on BeginPaint", "Error", MB_OK );
    				ExitProcess(1);
    			}
    
    			MemDC = CreateCompatibleDC(hDC);
    			if ( !MemDC )
    			{
    				MessageBox( NULL, "Picture not found", "Error", MB_OK );
    				ExitProcess(1);
    			}
    
    			if ( ! SelectObject(MemDC, hbmp) )
    			{
    				MessageBox( NULL, "Failed on SelectObject", "Error", MB_OK );
    				ExitProcess(1);
    			}
    
    			BitBlt(hDC, 0, 0, r.right, r.bottom, MemDC, 0, 0, SRCCOPY);
    			DeleteDC(MemDC);
         		EndPaint(hWnd, &Ps);
    		break;
    
    		default:
    	    return DefWindowProc(hWnd, Msg, wParam, lParam);
        }
        return 0;
    }
    

    🙂



  • COOL danke 🙂 ... hab mir nämlich jetzt was ausgedacht , über die konsole wird ne win application aufgerufen wo dann imma bild vom CHarakter und Monster drin ist und über die Konsole kann man die attacken und alles ausführen 🙂 glaubst du das geht ?



  • Ja das geht.
    Du kannst aus einer Konsolenanwendung ganz einfach ein Fenster aufmachen wenn du möchtest, kein Problem.
    p.S.: wenn du wirklich ne eigene app aufrufen willst nur um das bild anzuzeigen, ja das geht auch, bloss wäre es mir zuviel aufwand.



  • btw. schrieb:

    es gibt ein undokumentieres flag für CreateConsoleScreenBuffer mit dem man bilder in der konsole darstellen kann.

    richtig! 👍



  • pale dog schrieb:

    btw. schrieb:

    es gibt ein undokumentieres flag für CreateConsoleScreenBuffer mit dem man bilder in der konsole darstellen kann.

    richtig! 👍

    Das geht dann ohne CreateDC und ohne BitBlt ??

    Denn MSDN schreibt:
    dwFlags
    [in] Type of console screen buffer to create. The only supported screen buffer type is CONSOLE_TEXTMODE_BUFFER.



  • Toa schrieb:

    COOL danke 🙂 ... hab mir nämlich jetzt was ausgedacht , über die konsole wird ne win application aufgerufen wo dann imma bild vom CHarakter und Monster drin ist und über die Konsole kann man die attacken und alles ausführen 🙂 glaubst du das geht ?

    Ja, das geht, aber wie hustbaer schon geschrieben hat, es ist etwas umständlicher als mit einem Windowsprogramm.



  • proggingmania schrieb:

    pale dog schrieb:

    btw. schrieb:

    es gibt ein undokumentieres flag für CreateConsoleScreenBuffer mit dem man bilder in der konsole darstellen kann.

    richtig! 👍

    Das geht dann ohne CreateDC und ohne BitBlt ??

    ja, ich weiss aber nicht mehr genau wie. ist ein undokumentiertes feature, das einen teil des console windows grafikfähig macht (die grafik überlebt überlappungen und verschiebungen). in den geleakten win2k-sources findet du ein beispiel (die bekommste mit shareaza, emule oder sowas). wenn nicht: such im internet nach der email adresse von 'therese stowell'. die gute frau hat das verbrochen 😉



  • pale dog schrieb:

    ...wenn nicht: such im internet nach der email adresse von 'therese stowell'. die gute frau hat das verbrochen 😉

    Nix gefunden. Ist aber auch nicht so wichtig 🙂
    Und wenn man unbedingt ein Bild in der Konsole braucht, dann man das auch über ein HDC reinblitten, das man sich aufs Konsolen HWND holt. 🕶
    Beim Start kann man sich die Grösse des Fensters speichern und
    in einer Schleife mit GetWindowRect die Änderungen der Größe und Position checken und wenn nötig neu Zeichnen lassen. Flackert ein bisschen beim Größe ändern, aber egal.
    🙂



  • kann wer mal ein bild hochladen , wie das aussehn soll: ein bild in der console 😃



  • pokêmon schrieb:

    kann wer mal ein bild hochladen , wie das aussehn soll: ein bild in der console 😃

    Kompilier dir das doch selber, dann hast du es für dich ganz allein, ganz frisch auf dem Monitor. Kannst es ausrucken und dir als Poster an die Wand heften.


Anmelden zum Antworten