Bild in ein Frame einer MDI Anwendung laden !
-
Hallo,
wie kann ich ein Bild in eine MDI_Anwendung einfügen ? Ich möchte aber das Bild nicht in ein leeres Dokument einfügen (siehe Bild 1), sondern das Frame soll sich an das Bild anpassen (siehe Bild 2)! So wie man es bei Bildbearbeitungs Programmen kennt, über ein FileDialog wird ein Bild ausgewählt und Frame pass sich sofort dem Bild an !
So sollte es nicht aussehen :
http://www.zauber.gmxhome.de/Bild1.gifsondern so:
http://www.zauber.gmxhome.de/Bild2.gifDanke
:: NoName ::
-
Kann mir denn niemand helfen ??? Oder versteht ihr mein Prob net

-
Ich versuchs einfach mal, aber nicht hauen, wenns nicht hilft...

Mit ::GetSystemMetrics bekommst du die Maße von den Fensterrahmen und so heraus.
Mit SetWindowPos oder MoveWindow kannst du Größe und Position festlegen.
Wie groß dein Bild ist, weißt du hoffentlich selbst.
AfxGetMainWnd gibt dir das Hauptfenster.Hilft dir das weiter? Parameter und so kannst du ja in der MSDN nachgucken.

-
Das ist eine super Idee ! Aber leider möchte ich bzw. der Benutzer des Programms unterschiedlich große Bilder laden ! Das bedeutet das ich erst einmal die Größe des Bildes herausfinden muss um dann GetSystemMetrics und SetWindowPos benutzen zu können !
-
Wie lädst du denn das Bild? läßt sich da nicht irgendwas über die Größe herausfinden?
Zeig doch mal ein Stück Quelltext.

-
Momentan mache ich das so:
CFileDialog dlg(true,"",NULL,OFN_HIDEREADONLY,"Bitmap (*.bmp)|*.bmp||"); if(dlg.DoModal() == TRUE) { CBitmap bitmap; BITMAP bm; CDC dc; CDC* pDC = GetDC(); HBITMAP hPixel = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), dlg.GetFileName(), IMAGE_BITMAP, 0,0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); bitmap.Attach(hPixel); bitmap.GetBitmap(&bm); dc.CreateCompatibleDC(pDC); dc.SelectObject(&bitmap); pDC->BitBlt(80,20,1000,1000, &dc, 0,0, SRCCOPY); }Also, ich kann nix finden. das einzigeste wäre BitBlt, aber ....
Danke
-
Guck dir mal CBitmap::GetBitmap an. Da kannst du die Größe in Pixeln erfragen.
Hilft das? (Sorry, bin da totale Theoretikerin.)
-
Mal sehen ob es was hilft ! Doch irgendwie komme ich net klar mit diesen Strukturen, kannst du mir ein bisschen helfen ?
Ist das richtig :
int Width; int Height; tagBITMAP bm; bm.bmWidth = Width, bm.bmHeight = Height; CFileDialog dlg(true,"",NULL,OFN_HIDEREADONLY,"Bitmap (*.bmp)|*.bmp||"); if(dlg.DoModal() == TRUE) { CBitmap bitmap; CDC dc; CDC* pDC = GetDC(); HBITMAP hPixel = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), dlg.GetFileName(), IMAGE_BITMAP, 0,0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); bitmap.Attach(hPixel); bitmap.GetBitmap(&bm); dc.CreateCompatibleDC(pDC); dc.SelectObject(&bitmap); pDC->BitBlt(80,20,1000,1000, &dc, 0,0, SRCCOPY); }Danke
-
Das scheint die falsche Reihenfolge zu sein.
tagBITMAP bm = new BITMAP;/*wenns nicht geht: irgendwas mit sizeof(BITMAP)*/; CFileDialog dlg(true,"",NULL,OFN_HIDEREADONLY,"Bitmap (*.bmp)|*.bmp||"); if(dlg.DoModal() == TRUE) { CBitmap bitmap; CDC dc; CDC* pDC = GetDC(); HBITMAP hPixel = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), dlg.GetFileName(), IMAGE_BITMAP, 0,0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); bitmap.Attach(hPixel); bitmap.GetBitmap(&bm); bm.bmWidth // hier steht die breite drin bm.bmHeight // und hier die Höhe. // Jetzt musst du noch das Fenster an sich dazurechnen und kannst dann MoveWindow versuchen. dc.CreateCompatibleDC(pDC); dc.SelectObject(&bitmap); pDC->BitBlt(80,20,1000,1000, &dc, 0,0, SRCCOPY); }Edit: Hab noch einen Fehler gefunden: Du musst Speicher reservieren. Da ich aber nicht ausprobieren kann und da auch nicht so firm bin musst du wissen wie das geht.

-
Da hätte ich aber noch eine kleine Frage. Wie soll ich denn jetzt bm.bmWidth und bm.bmHeight benutzen ??? Wenn ich jetzt die Größe der ChildWindows mit SetWindowPos ändern möchte, dann kann ich ja nicht SetWindowPos(NULL,0,0, bm.bmWidth, bm.bmHeight, NULL); schreiben !

-
Also, ich würde MoveWindow nehmen, das macht auch das was du brauchst, hat aber weniger Parameter.
Wenn du das mit den Werten machst, die du bekommst ist das Fenster zu klein. In der Breite musst du noch den Rahmen dazurechnen und in der Höhe auch noch die Titelleiste und das Menü. Mag sein, dass ich was vergessen hab, war aus dem Kopf.
Dafür hab ich dir ja ::GetSystemMetrics empfohlen, guck dir das mal genau an.
PS: Nächste Antwort morgen früh.

-
Also, Jetzt habe ich MoveWindow verwendet. Er setzt die Maße für das ChildFrame genau so groß wie das Bild ist ! Doch das Problem ist, dass er das Bild jetzt nicht mehr in das Frame lädt !
Hier nochmals mein Code :CFileDialog dlg(true,"",NULL,OFN_HIDEREADONLY,"Bitmap (*.bmp)|*.bmp||"); if(dlg.DoModal() == TRUE) { CBitmap bitmap; tagBITMAP bm; CDC dc; CDC* pDC = GetDC(); HBITMAP hPixel = (HBITMAP)::LoadImage(AfxGetInstanceHandle(), dlg.GetFileName(), IMAGE_BITMAP, 0,0, LR_LOADFROMFILE | LR_CREATEDIBSECTION); bitmap.Attach(hPixel); bitmap.GetBitmap(&bm); bm.bmWidth, bm.bmHeight; dc.CreateCompatibleDC(pDC); dc.SelectObject(&bitmap); pDC->BitBlt(80,20,1000,1000, &dc, 0,0, SRCCOPY); GetParent()->MoveWindow(0,0,bm.bmWidth, bm.bmHeight, TRUE); }Habe ich mal wieder irgendwas vergessen oder MoveWindow falsch benutzt ???

Danke
-
bitmap.GetBitmap(&bm); bm.bmWidth, // Das steht doch nicht wirklich da, oder? bm.bmHeight; // Da hast du doch was nicht mitkopiert... // Schonmal HIER das MoveWindow versucht? dc.CreateCompatibleDC(pDC); dc.SelectObject(&bitmap); pDC->BitBlt(80,20,1000,1000, &dc, 0,0, SRCCOPY); GetParent()->MoveWindow(0,0,bm.bmWidth, bm.bmHeight, TRUE);Ich hoffe es geht jetzt, mittlerweile bin ich echt ratlos.

-
Also, nach der tagBitmap Struktur das MoveWindow zu setzen, habe ich schon versucht, hat aber net funktioniert. Er setzt immer nur das ChildFrame auf die Größe des Bildes, aber das Bild selbst setzt er nicht ! Ich denke es liegt daran, dass ich das Bild nicht neu Zeichnen lasse.
Naja, dann werde ich mal versuchen das Bild immer wieder neu zu zeichnen !
Danke für deine Hilfe !:: NoName ::
-
Sollte man das in OnSize nicht sowieso machen?

-
hmmm, ich habe mal in meinen Büchern gewälltzt, da wirds mit CMeatFileDC gemacht !
Werde ich schon irgendwie hinkriegen !
Gruß
:: NoName ::