MFC Bitmap in Picture Control anzeigen



  • Hallo Zusammen,

    ich durchsuche jetzt schon seit mehrern Stunden den ganzen Orbit und werde einfach nicht fündig. Ich habe in einem Dialog unter MFC eine Picture Control Box hinzugefügt. Ich möchte per Open File Dialog ein Bild auswählen und dort anzeigen. Das Bild soll nachher ständig aktualisiert werden können.

    Im Hintergrund arbeite ich mit opencv.

    Folgenden Code habe ich meinem Button mit dem ich den OpenFile Dialog aufrufe hinzugefügt.

    Hat jemand eine Idee, was ich falsch mache? Wahrscheinlich alles...

    void CMFCTestDlg::OnBnClickedButton1()
    	{
    
    	CFileDialog dlg(TRUE/*Open=TRUE Save=False*/,NULL/*Filename Extension*/,""/*Initial Filename*/,OFN_ENABLESIZING|OFN_EXPLORER|OFN_FILEMUSTEXIST/*Flags*/,"*.jpg|*.jpg||"/*Filetype Filter*/,this/*parent Window*/);
    	if (dlg.DoModal() == IDOK){
    
    		CString filePath = dlg.GetPathName();
    		IplImage *img = cvLoadImage( filePath, 1);
    		CStatic myStatic;
    		CWnd* wp = GetDlgItem(IDC_STATIC);
    		myStatic.Create( "Text", SS_BITMAP, CRect(100,100,500,500), wp );
    		myStatic.SetBitmap(IplImage2DIB(img));
    
    		cvNamedWindow( "Source", CV_WINDOW_AUTOSIZE );
    		cvShowImage( "Source", img );
    		cvWaitKey(0);
    
    		}
    
    	}
    


  • Also zunächst Mal definierst du dein CStatic-Objekt lokal, was bedeutet, dass es nach dem Verlassen des Scopes wieder zerstört wird. Du solltest myStatic als Membervariable deklarieren.
    Es wäre auch gut, wenn du uns sagst was genau nicht geht...



  • Mmmh...mein Hintergrundwissen scheint hier schon nicht mehr auszureichen.
    Also was lokale Definition ist weiss ich, aber was heißt "als Membervariable definieren"? Von welcher Klasse member?

    Das Bild wird gar nicht in der Picture Control Box angezeigt. Das Programm gibt mir aber auch keinen Fehler aus. Die Picture Control Box habe ich auf Typ "Bitmap" festgelegt.



  • Als Membervariable deiner CMFCTestDlg-Klasse. Warum erzeugst du das Static-Control eigentlich manuell. Du kannst ja auch über den Designer eines reinziehen und dieses dann verwenden. Sparst dir das Create usw.

    if (dlg.DoModal() == IDOK){
    
            CString filePath = dlg.GetPathName();
            IplImage *img = cvLoadImage( filePath, 1);
            // HIER ERZEUGST DU DEIN STATIC-CONTROL
            CStatic myStatic;
            CWnd* wp = GetDlgItem(IDC_STATIC);
            myStatic.Create( "Text", SS_BITMAP, CRect(100,100,500,500), wp );
            myStatic.SetBitmap(IplImage2DIB(img));
    
            cvNamedWindow( "Source", CV_WINDOW_AUTOSIZE );
            cvShowImage( "Source", img );
            cvWaitKey(0);      
    }
    // UND HIER EXISTIERT ES SCHON NICHT MEHR
    


  • Also ein Picture Control habe ich ja mit dem Designer auf mein Dialogfeld gezogen. Wird dann automatisch eine Static-Control für die Box eingerichtet?
    Wie heißt die denn dann und wo finde ich die Definition? Ich sehe in den Eigenschaften nur die ID der Picture Control Box.

    Sorry...arbeite noch nicht lange mit MFC...



  • Automatisch wird kein CStatic-Member erzeugt. Du kannst das entweder über den Assistenten machen (rechte Maustaste auf das Control und "Add Variable") oder greifst im Code darauf zu:

    CStatic *pStatic = (CStatic*)GetDlgItem(ID_DEINE_ID_FUER_DAS_STATIC);
    pStatic->SetBitmap(bla);
    


  • gib deinem Picture-Control eine eindeutige ID also zum Beispiel IDC_PicCtrl. Dann kannst du mit

    CStatic *myStatic = <static_cast>GetDialogItem(IDC_PicCtrl);
    myStatic->SetBitmap(...);
    

    drauf zu greifen. Dann kannst du mit SetBitmap drauf los gehen. Denn IDC_STATIC sind alle Controls die nur statisch in deinem Dialog dargestellt werden, also alle Labels usw. Sollte das nicht zum erfolg führen, wirst du um OwnerDraw also eigene Klasse von CStatic abgeleitet und selbst zeichnen nucht drum rum kommen



  • Jippijippijea...et hat geklappt. Nach nur einem Tag kann ich jetzt ein Bild anzeigen. Wenn der Rest auch noch so lange dauert muss ich mir wohl en Strick nehmen.

    Danke für Eure Hilfe. Ich habe der Picture Control mit dem Assistenten die Membervariable zugewiesen. Wo steht der Code/Definition jetzt eigentlich?



  • in der Headerdatei deiner Dialogklasse.


Anmelden zum Antworten