RGB Datenstrom auf Dialog zeichnen - wie am besten?



  • was muss ich mir eigentlich unter der "upperleft corner" von meiner source bitmap vorstellen ... das ist doch nur ein haufen RGB werte...



  • Also so wie ich's verstanden hab ist das der Punkt deines Bitmaps welcher an die Stelle von x,y verschoben wird (funktioniert auch ganz gut 😉 ), Du kannst sozusagen jeden beliebigen Ausschnitt deines Bildes darstellen (siehe auch StretchBlt).

    So wie's jetzt ist sollte es eigentlich funktionieren (dd->...)???
    Sonst fällt mir noch auf:
    -bist Du sicher, dass m_width und m_height korrekt initialisiert sind?
    -SetPixel() usw. verwenden als obere linke Ecke immer (0,0) d.h Deine Schleifenkonstruktion lässt immer einen Rand (beabsichtigt?) zum anderen sind Vergleichsoperatoren mit = ungünstig (Feinheit!) besser wäre also einfach for(y=0;y<höhe;y++){...}



  • ok ... das macht schon mal nen sinn ... aber wieso wird nichts gezeichnet?

    von welcher basis klasse ist denn die klasse die du für soetwas verwendest abgelitten? und wieso sollte ich ein teil des codes in die OnPaint() bringen, oder wär das nur notwendig wenn ich permanent ein bild auf meinem Dialog darstellen lassen möchte und dies nicht über einen Button auslöse

    mfg, TFTS

    PS: gibt es vielleicht ganz andere Verfahren bzw. schon fertige klassen, die das zeichnen eines RGB Datenstromes übernehmen? kennst du dich zufällig mit "IStream" aus ... ich lese immer wieder davon, bin aber noch nicht so recht draus schlau geworden wie so ein istream aufgebaut ist.



  • Sorry habe vorherigen Beitrag nochmal editiert, hab zu schnell gelesen!
    Zu den anderen Problemen:
    Also funktionieren müsste es für alle von CWnd abgeleiteten Klassen.
    Die Sache mit OnPaint() hat den Vorteil, daß wenn Du den Dialog verschiebst immer noch dein Bild dargestellt wird und nicht irgendwelche Steuerelemente o.ä.. Ausserdem musst Du, wenn Das Bild aktualisiert wurde nicht jedesmal BitBlt(...) aufrufen sondern es genügt ein einfaches Invalidate(FALSE).
    Problematisch: Wenn das Bild im Speicher neu gezeichnet wird und gerade in diesem Augenblick jemand den Aufruf von OnPaint verursacht (Fenster ziehen etc.) dann kanns schon mal passieren, daß Bildsalat entsteht, ist aber sehr selten und unwahrscheinlich.



  • hmm mein problem ist aber, dass (anders als bei deiner OnDraw(CDC* pDC) Funktion) in die OnPaint() keine CDC* Variable hereingegeben wird ... ich müsste sie als extra irgendwo definieren ... aber wo dann? als member der klasse? oder nur in der OnPaint?

    Die Schleife stimmt soweit ... erarbeitet den gesamten stream ab ... x geht jetz von 0 bis <1600 und y von 0 bis <1200

    void CJpglibDlg::OnPaint() 
    {
    	if (IsIconic())
    	{
    		CPaintDC dc(this); // device context for painting
    
    		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
    
    		// Center icon in client rectangle
    		int cxIcon = GetSystemMetrics(SM_CXICON);
    		int cyIcon = GetSystemMetrics(SM_CYICON);
    		CRect rect;
    		GetClientRect(&rect);
    		int x = (rect.Width() - cxIcon + 1) / 2;
    		int y = (rect.Height() - cyIcon + 1) / 2;
    
    		// Draw the icon
    		dc.DrawIcon(x, y, m_hIcon);
    
    	}
    	else
    	{
    		CDialog::OnPaint();
    	}
    
    	pDC = GetDC();
    	pDC->BitBlt(0,0,m_width,m_height, m_pDC,0,0, SRCCOPY);
    }
    
    void CJpglibDlg::BytestreamToDialog()
    {
    	UpdateData(true);
    	int x,y;
    	int breite;
    	int hoehe;
    	int byte_nr;
    	int i;
    	byte_nr=0;
    						//by TFTS created: farbige Legenden Quadrate löschen
    
    	breite = int(m_width);
    	hoehe = int(m_height);
    
    		byte_nr=0;
    		for(y=0;y<hoehe;y++)
    		{
    			for(x=0;x<breite;x++)
    			{
    
    				m_pDC->SetPixelV( x,y, RGB(RGBbuffer[byte_nr],RGBbuffer[byte_nr+1],RGBbuffer[byte_nr+2]));
    				byte_nr=byte_nr+3;
    			}
    		}
    	this->Invalidate(FALSE);  
    
    }
    

    hab in dem bsp die variable pDC im header deklariert ... es malt aber immer noch nicht



  • Versuch mal

    CPaintDC dc(this);
    dc.BitBlt(...);
    

    direkt in das else-Statement der OnPaint Methode und nicht Vergessen: Invalidate(versuchs mal mit TRUE)!



  • hmm .. es tuts einfach nich .. hast du vielleicht ein kleines bsp programm bei dem es funktioniert .. da könnt ich vielleicht besser finden wo der fehler ist.

    mfg, TFTS





  • LINK : fatal error LNK1104: cannot open file "nafxcwd.lib"
    Error executing link.exe.

    die lib ist aber auch nich bei dem projekt dabei...



  • Oh, ich glaube da musst Du mal dynamisch binden Projekt-> Einstellungen ->Allgemein.



  • Aufgegeben?



  • nee nee, ich geb doch nich auf ... ich komm halt bloß nich sooft zum programmieren. da frag ich gleich mal ... wie binde ich die lib dynamisch? muss ich sie dazu runterladen? oder ist die schon irgendwo vorhanden ... ich kenn das nur dass man eine lib über link benutzen kann, wenn man diese im projektordner hat.

    Ist die lib denn eigentlich für die funktionalität notwendig? oder welcher programmteil in deinem demoproject benötigt überhaupt die lib?
    mfg, TFTS



  • Nein, das heisst nur, dass die mfc-dll's direkt mit in die exe compiliert werden (statisch, wird nur von der enterprise-version unterstützt). Beim dynamischen linken müssen die mfc.dll's (msvcrt, mfc42, ...)auf dem Zielrechner vorhandensein, was aber meistens der Fall ist und die Programme enorm verkürzt.
    Ob in Deinem Fall wirklich daß das Problem ist weiss ich nicht genau. Zur Not kannst Du ja noch versuchen eine Dialoganwendung mit dem Gerüst zu erstellen und mein Projekt nachzubauen, sind ja glaube ich nur 4 Stellen an denen etwas eingefügt wird.



  • du wirst es nich glauben, aber ich hab deinen quellcode 1 zu 1 in eine neue dialogbasierende anwenung übernommen. Und es malt wieder nix. Starten kann ich das programm ... aber wenn ich auf den Button drücke passiert nix.

    Kann es vielleicht daran liegen, dass ich die Standard Edition von VC 6.0 benutze?

    mfg, TFTS

    PS: und ich habe gerade noch dein bsp dialog compiliert bekommen ... der tuts auch nicht 😮 ... langsam wirds komisch 🙂

    PPS: auch das "hallo" und "tschüss" erscheint nicht



  • Puuh, so langsam gehen mir auch die Ideen aus!
    Ich habe Dir aber mal die zugehörige exe hochgeladen vieleicht gibt es ja ein prinzipielles Problem, kann ich mir aber nicht vorstellen. Ob es an der Standard Version liegt kann ich Dir leider auch nicht genau sagen daß sollte aber funktionieren.

    http://rcswww.urz.tu-dresden.de/~sb821288/VDC_exe.rar



  • hm ... da tut sich auch nix ... also muss es ja an meinem system liegen. Hab WinXP prof. incl. ServicePack 1 ... ist frisch installiert, bzw. hab das image gerade frisch wieder drauf gespielt.

    Ich werde die exe mal an anderen PCs im haus ausprobieren.

    mfg, TFTS



  • ok ... es scheint tatsächlich an der XP version meines rechners zu liegen ... muss mal sehn wie ich das beheben kann



  • Oh, das tut mir leid, ist anscheinend ein sehr spezielles Problem.
    Geht denn sonst alles?



  • so jetz hab ich XP incl SP1 komplett neuinstalliert ... und es geht immer noch nicht. ich hab die selbe version genommen die auf dem rechner ist, auf dem die exe läuft. der einzigste unterschied ist, dass auf dem rechner wo es läuft noch einige windows updates installiert sind... das kann doch aber nicht sein dass man für soetwas windows updates benötigt, oder?

    ja, sonst ging alles ... hab sonst keine probleme mit meinem XP



  • also es scheint ein nicht reproduzierbarer fehler zu sein. jetz hab ich wieder mein altes image drauf gespielt und nun gehts auch da... bis jetzt kann ich da noch kein system erkennen... auf einem anderen rechner im haus wo das selbe XP drauf ist gehts nicht.

    aber gut ... das gehört jetz nich mehr ins C++ Forum. Ich werde, wenn jetz mein system stabil deine exe ausführen kann, mich wieder an die arbeit machen und es selbst nochmal programmieren.

    Vielen dank für deine mühe.

    mfg, TFTS


Anmelden zum Antworten