Puicture Control (BMP laden)



  • Nabend

    Ich mache mich sicher zum Affen, aber ich versuche seit 3 Tagen, eine BMP zu laden und in auf meinem Dialog anzuzeigen. Ohne Erfolg. 😞

    Also: ich nehme ein "Picture Control" und setze es auf den Dialog. Dann ändere ich die ID in "IDC_PICTURE" und den Type auf "Bitmap". Soweit habe ich was aus Google herausgefunden.
    Dann wird CBitmap::SetBitmap, CImage::Load oder sowas genutzt, aber das läuft alles nicht. Entweder wird das Bild nicht angezeigt oder mein Prog schmiert mit "Debug Assertion Failed!" ab.

    Hat jemand ein ganz einfaches Beispiel für mich?

    Jetzt schonmal danke!

    cu



  • in die onpaint function deines dialoges

    CBitmap flag;
    flag.LoadBitmap(IDB_DEINBITMAP);
    m_ctlPicture.SetBitmap(flag);
    flag.DeleteObject();
    


  • Hier geht es zwar eigentlich um Slider, aber als Beispiel werden Bilder (bmp) verwendet, mit ausführlichem Code:

    http://www.functionx.com/visualc/controls/slider.htm

    Vielleicht nutzt es ja was... 🙂



  • Vielen Dank, aber das ist nur für statische Bilder, oder?

    Ich möchte das Bild zur Laufzeit laden und ggf. noch einmal ändern. (Sorry, wusste nicht, dass das einen Unterschied macht.)

    cu



  • naja kommt drauf an wie du es haben willst.
    schreib unter die jeweilige function die neue bitmaps setzen soll

    CBitmap flag;
    flag.LoadBitmap(IDB_DEINBITMAP);
    m_ctlPicture.SetBitmap(flag);
    flag.DeleteObject();
    

    oder soll zb ein butten beim draufklicken ein anderes bild zeigen. gehts auch anderst.
    deklarier in der Dialog.cpp unterhalb der includs

    CBitmapButton button1;
    

    in den konstrucktor deines dialogs schreibst du

    CDialogDlg::CDialogDlg(CWnd* pParent /*=NULL*/)
    	: CDialog(CDialogDlg::IDD, pParent)
    {
    
    	if (!button1.LoadBitmaps(IDB_BITMAP_RESOURCE, 	//Bild Wird standartmäßig angezeigt
    				IDB_BITMAP_SELECT,	//Bild wird angezeigt wenn Button Angeklickt wird
    				IDB_BITMAP_FOCUS,	//Bild wird angezeicht wenn Button den Focus erhält
    				IDB_BITMAP_DISABLE) )	//Bild wird angezeigt wenn der Button ausgeschaltet wird
    	{
    		TRACE0("Failed to load bitmaps for buttons\n");
    		AfxThrowResourceException();
    	}/**/
    
    }
    

    IDB_BITMAP_FOCUS,IDB_BITMAP_DISABLE ist nicht zwingend notwendig diese mit resourcen zu belegen es reicht auch

    LoadBitmaps(IDB_BITMAP_RESOURCE, IDB_BITMAP_SELECT)
    

    in der OnInit deines Dialoges verbindest du die gerade erstellten resourcen mit dem Button

    button1.SubclassDlgItem(IDC_BUTTON1, this);
    	button1.SizeToContent();
    


  • Nabend.

    Ich hab's nun hinbekommen. 😃

    Eigentlich war es gar nicht so schwer:

    HBITMAP hbm = (HBITMAP)::LoadImage( AfxGetInstanceHandle(), _T("test.bmp"), IMAGE_BITMAP, 0,0,LR_LOADFROMFILE | LR_DEFAULTSIZE );
    m_Picture.SetBitmap(hbm);
    

    Ich kann sogar ne PNG laden:

    CImage c;
    CString fileName = _T("test.png");
    if(c.Load(fileName) == S_OK)
    {
       HBITMAP bmp = (HBITMAP)c;
       m_Picture.SetBitmap(bmp);
    }
    

    Es gibt nur noch ein Problem: wenn ich ein Bild lade&anzeige und dann ein anderes Fenster über mein Programmfenster verschoben wird, ist das Bild weg.

    Das Gleiche passiert, wenn ich mein Fenster minimiere und wieder zurückhole: das Bild ist weg.

    Woran liegt das? Wie kann ich das Bild "verankern"?

    mfg



  • du must das bild nicht verankern das ist es bereits.
    du must deinen dialog anregen das er sich neu zeichnet wenn er den Focus wieder erhält. 😉

    und aus diesem grund schrieb ich in der ersten post

    in die onpaint function deines dialoges

    CBitmap flag;
    flag.LoadBitmap(IDB_DEINBITMAP);
    m_ctlPicture.SetBitmap(flag);
    flag.DeleteObject();
    


  • *indietischkantebeiss*

    Sorry, übersehen. Jetzt läuft alles. 👍

    Danke an alle!

    mfg


Anmelden zum Antworten