Bitmap auswählen und dann im Dialogfenster anzeigen lassen



  • Hallo!

    Ich habe folgendes Problem:

    Ich würde den Benutzer gerne eine Bitmap auswählen lassen mit:

    CString Destination; 
    CFileDialog dlg(true,0,0,NULL,0,this); 
    dlg.DoModal(); 
    Destination = dlg.GetPathName();
    

    Danach soll diese Datei im Dialogfenster angezeigt werden.
    Ich weiss zwar, wie man dort eine vorbestimmte Bitmap anzeigen lässt, aber nicht wie man sie zur Laufzeit wechseln lässt.

    Zum Schluss soll nun der User zur Laufzeit in der ausgewählten Bitmap einen rechteckigen Bereich mit der Maus markieren und die Koordinaten an das Programm zurückgegeben werden.
    Ist das irgendwie möglich? 😕



  • Hallo,

    CFileDialog dlg(true,"",NULL,OFN_HIDEREADONLY,"Bitmap (*.bmp)|*.bmp||"); 
        if(dlg.DoModal() == TRUE) 
        { 
            CWnd* pWnd = (CWnd*) GetDlgItem(ID_DEINER_PICBOX); 
            CDC* pDC = pWnd->GetDC(); 
            CBitmap bitmap; 
            CDC dc; 
            CRect rect; 
            pWnd->GetClientRect(rect); 
            BITMAP bm; 
            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->StretchBlt(0,0,rect.Width(), rect.Height(),&dc,0,0, bm.bmWidth, bm.bmHeight, SRCCOPY); 
    
        }
    

    Wohlmöglich musst du den Style deiner Picture-Box auf Bitmap stellen !

    Zur 2. Frage:
    Das könntest du mit WM_MOUSEMOVE und GetCursorPos machen, dann erhällst du die Koordinaten !

    Gruß
    :: NoName ::



  • Hallo,

    damit kannst du direkt auf das Dialogfeld zeichnen.

    CClientDC dc(this);
    CBitmap bmp;
       if (bmp.LoadBitmap("c:\\test.bmb"))
       {
          BITMAP bmpInfo;
          bmp.GetBitmap(&bmpInfo);
          CDC dcMemory;
          dcMemory.CreateCompatibleDC(dc);
          CBitmap* pOldBitmap = dcMemory.SelectObject(&bmp);
          CRect rect;
          GetClientRect(&rect);
          int nX = rect.left + (rect.Width() - bmpInfo.bmWidth) / 2;
          int nY = rect.top + (rect.Height() - bmpInfo.bmHeight) / 2;
          pDC->BitBlt(nX, nY, bmpInfo.bmWidth, bmpInfo.bmHeight, &dcMemory, 0, 0, SRCCOPY);
    
          dcMemory.SelectObject(pOldBitmap);
       }
       else
          TRACE0("ERROR\n");
    

    MFG TaccoGo



  • Super, danke für eure Hilfe.
    Bilder wechseln klappt jetzt ohne Probleme, den Rest probiere ich nun aus 🙂



  • ...den Rest probiere ich nun aus

    Meinst du das mit den Koordinaten ? Möchte nämlich gerne mal wissen auf was du zeichnest, auf dem Dialogfeld oder in einer Picture-Box ???



  • öhm, peinlich aber war, ich weiss es selbst nicht so genau.

    Diese Box, in der das Bild nun zu sehen ist, befindet sich im Dialogfeld.
    Wenn ich die Eigenschaften davon öffne, dann befinde ich mich in "Picture Eigenschaften" und kann dann z.B. als Typ: Rahmen, Rechteck, Bitmap usw. auswählen.
    Das steht momentan auf Bitmap.

    Wie ich da jetzt genau zeichne und Koordinaten abfrage, weiss ich noch nicht, aber ich wollte erstmal ein bisschen rumexperimentieren, bevor ich hier weiterfrage. 🙂



  • peinlich aber war

    es heisst natürlich "wahr"



  • Gut, du arbeitest also mit der Picture-Box. Jetzt könntest du eine WM_LBUTTONDOWN erstellen und dir dort die schon vorhandene CPoint-Variable zu nutzen machen um die Koordinaten herauszufinden !
    Das würde dann so aussehen :

    CString strPos;
    strpos.Format("X-Koordinate = %d", point.x);
    AfxMessageBox(strPos);
    strPos.Format("Y-Koordinate = %d", point.y);
    AfxMessageBox(strPos);
    

    Versuchs mal...

    Gruß
    :: NoName ::



  • Hi

    Ich habe es versucht mit diesem Code:

    CFileDialog dlg(true,"",NULL,OFN_HIDEREADONLY,"Bitmap (*.bmp)|*.bmp||"); 
        if(dlg.DoModal() == TRUE) 
        { 
         CWnd* pWnd = (CWnd*) GetDlgItem(IDC_STATIC);
            CDC* pDC = pWnd->GetDC(); 
            CBitmap bitmap; 
            CDC dc; 
            CRect rect; 
            pWnd->GetClientRect(rect); 
            BITMAP bm; 
            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->StretchBlt(0,0,rect.Width(), rect.Height(),&dc,0,0, bm.bmWidth, bm.bmHeight, SRCCOPY); 
       }
    

    Ich kann es ohne Probleme kopilieren aber beim ausführen gibt es in der 5. Zeile einen Fehler....

    Bitte helft mir 😉
    Vielen Dank!



  • Hmm, zeichnest du das Bild denn auch in einer Picture-Box ?
    Wenn ja, wie ist die ID deiner Picture Box ?



  • kurze frage zwischendurch,

    TaccoGo schrieb:

    bmp.LoadBitmap("c:\\test.bmb") ...
    

    wie kann ich einem so geladenem Bitmap eine ID bzw einen namen zuweisen, damit man es auch in der CBitmapButton::LoadBitmaps methode nuten/übergeben kann?



  • Hast du schonmal versucht nur die CBitmap Variable zu benutzen ?

    Ungefähr so:

    CBitmap bitmap;
    bitmap.LoadBitmap("C:\\Text.bmp");
    
    m_Button.LoadBitmaps(bitmap,...);
    

    Vielleicht klappt es !

    Gruß
    :: NoName ::



  • Ja ich benutze eine Picturebox!
    Diese hat die ID:IDC_STATIC

    Ich möchte dann später das ganze noch abändern, dass ich das Bild drucken kann... Ist dies auch möglich oder muss ich das ganze dann anders angehen?



  • Ich habe noch diese Methode probiert:

    BITMAP bmpInfo; 
          bmp.GetBitmap(&bmpInfo); 
          CDC dcMemory; 
          dcMemory.CreateCompatibleDC(dc); 
          CBitmap* pOldBitmap = dcMemory.SelectObject(&bmp); 
          CRect rect; 
          GetClientRect(&rect); 
          int nX = rect.left + (rect.Width() - bmpInfo.bmWidth) / 2; 
          int nY = rect.top + (rect.Height() - bmpInfo.bmHeight) / 2; 
          pDC->BitBlt(nX, nY, bmpInfo.bmWidth, bmpInfo.bmHeight, &dcMemory, 0, 0, SRCCOPY); 
    
          dcMemory.SelectObject(pOldBitmap);
    

    aber es kommt immer ein Fehler bei dieser Zeile:

    dcMemory.CreateCompatibleDC(dc);
    

    Sehe ich es richtig, dass ich mit dieser Fukntion dann das Bild auch gerade ausdrucken könnte? einfach dem Objekt

    CClientDC dc(this);
    

    anstatt this den Printer übergeben?

    Vielen Dank für die Antworten



  • Ich habe nun noch weiterversucht und es geschafft!
    Jetzt kommt keine Fehlermeldung aber es wird nur ein schwarzer Balken gedruckt.

    Kann mir jemand sagen wieso?

    void CADS2Dlg::Logos(CDC* dcPrint)
    {
       CBitmap bmp; 
       bmp.LoadBitmap("E:\logos\logos\Logo_1gp.tif");
    
       CDC dcMemory; 
       dcMemory.CreateCompatibleDC(dcPrint);
       CBitmap* pOldBitmap = dcMemory.SelectObject(&bmp); 
       CRect rect; 
       GetClientRect(&rect); 
    
       dcPrint->BitBlt(10,10,100,50,&dcMemory,0,0,SRCCOPY);
       dcMemory.SelectObject(pOldBitmap); 
    }
    

    Vielen Dank für die Antworten



  • :: NoName :: schrieb:

    Hast du schonmal versucht nur die CBitmap Variable zu benutzen ?

    Ungefähr so:

    CBitmap bitmap;
    bitmap.LoadBitmap("C:\\Text.bmp");
    
    m_Button.LoadBitmaps(bitmap,...);
    

    Vielleicht klappt es !

    Gruß
    :: NoName ::

    nope, geht nicht! ich meine, es steht ja auch nicht in der doku... vorschläge...



  • Hallo nochmal!

    Ich hab nun das:

    CString strPos; 
    strPos.Format("X-Koordinate = %d \nY-Koordinate = %d", point.x,point.y); 
    AfxMessageBox(strPos);
    

    noch eingefügt, funktioniert auch.
    Blöd ist nur, dass die Pixelinformationen vom Dialog gezeigt werden, nicht von der Picture-Box.
    Ist es irgendwie möglich einen sichtbaren Rahmen über die Picturebox zu ziehen, oder einen sichtbaren Punkt zu setzen bis zur Bestätigung? (damit der User nicht an die falsche Stelle klickt.... 🙄 ) (es ist relativ wichtig)



  • Irgendwie lädt es das Bild bei mir nicht (externe)
    Wenn ich ein Ressourcenbild drucken will, geht es ohne Probleme....
    Wieso geht es mit den externen nicht? Wird einfach ein schwarzer Balken gedruckt! Wie könnte ich jpg-Bilder laden?

    Hier meine Fukntion:

    {
    
        int m_iHorizont = dcPrint->GetDeviceCaps(HORZRES); 
        int m_iVerdikal = dcPrint->GetDeviceCaps(VERTRES);
        int m_iLeft=25;      // mm
        int m_iTop=95;       // mm
    
        CBitmap bmp;
        CBitmap bild;
        bmp.LoadBitmap(IDB_BITMAP1);
    
        CDC SpeicherDC; 
        SpeicherDC.CreateCompatibleDC(dcPrint); 
        SpeicherDC.SelectObject( &bmp ); 
    
        dcPrint->StretchBlt( ((m_iHorizont/210) * m_iLeft), ((m_iVerdikal/297) * m_iTop), ((m_iHorizont/210) * 52), ((m_iVerdikal/297) * 8), &SpeicherDC, 0, 0, 541, 83, SRCCOPY ); 
    }
    

    Wäre echt froh, wenn mir jemand helfen könnte!

    VIELEN DANK! 😉



  • @Nicophi

    Einen Rahmen kannst du bei den Styles einstellen !

    @addict

    Um Jpg's laden zu können musst du dir mal das anschauen :

    http://www.codeproject.com/bitmap/pictureshow.asp

    oder du machst es mit CPicture, ein beispiel gibt's hier:

    http://msdn.microsoft.com/msdnmag/issues/01/10/c/

    Hoffe konnte euch helfen !

    Gruß
    :: NoName ::



  • Um JPG's zu laden würde ich die Klasse CImage empfehlen, alles weitere findeste in deiner örtlichen MSDN ^^


Log in to reply