tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
6
ZUGRIFFE
638
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Mr_P1nk Mr_P1nk ist offline Rookie
    Registriert seit
    Feb 2005
    Beiträge
    6
    Also mein Problem ist, das ich gerne eine Bitmap darstellen würde (Landkarte) und darauf zeichnen kann (Weg darstellen).

    Meine Funktionen:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    
    void CTestDlg::OnDrawItem( int nIDCtl, LPDRAWITEMSTRUCT lpDrawItemStruct )
       {
         if ( nIDCtl == IDC_STATICMap )
         {
        HDC hdcImage = CreateCompatibleDC( lpDrawItemStruct->hDC );
       
        HBITMAP hbmOld = (HBITMAP)::SelectObject( hdcImage, m_Bitmap );
       
        BitBlt( lpDrawItemStruct->hDC, 0, 0, 660, 540, hdcImage, m_lox, m_loy, SRCCOPY );
       
        SelectObject( hdcImage, hbmOld );
        DeleteDC( hdcImage );
       
        return;
         }
       }

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    
     void CTestDlg::OnBUTTONShowData() 
       {
       
        m_Bitmap.LoadBitmap(IDB_Map);
       
        m_lox = 0;
        m_loy = 0;
       
        m_map.Invalidate();
       
        CClientDC dc(this);
        CPen lblackpen(PS_SOLID, 1, RGB(255, 0, 0));
        dc.SelectObject(&lblackpen);
        CBrush lwhitebrush(RGB(0, 255, 255));
        dc.SelectObject (&lwhitebrush);
       
        int xkoord = 400;
        int ykoord = 400;
       
        dc.Rectangle(xkoord, ykoord, xkoord + 50, ykoord + 30);
        dc.TextOut(xkoord+20, ykoord+5, "Hi");
       
        UpdateData(false);
       }

    Das Problem ist nur das die Bitmap immer über dem gezeichneten liegt, egal in welcher Reihenfolge das bitmap darstellen und zeichen aufgerufen wird. Gibts da irgendwo eine Einstellung mit der ich das festlegen kann oder geht das auf diese Weise prinzipiell nicht.

    Ich arbeite in MFC ... sorry hab erst nachher gesehen das dafür ein eigenes Topic gibt
     

  2. #2
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    Du musst das Zeichnen einfach zusammen machen; also nach dem BitBlt die Linien auf den (C)DC malen. OnDrawItem ist bereits der richtige Ort dafür.
     

  3. #3
    Mr_P1nk Mr_P1nk ist offline Rookie
    Registriert seit
    Feb 2005
    Beiträge
    6
    Danke für die schnelle Antwort. Das hat auch so geklappt.

    Allerdings hab ich jez das Problem, das wenn ich ein 2tes m_map.Invalidate() aufrufe eine Fehlermeldung kommt (Debug Assertion Failed). Mir gehts dabei darum das ich die koordinaten ändern will. Das liegt aber nicht am darüber zeichnen, das war vorher auch schon so nur is es mit nicht aufgefallen.

    p.s.: kann man vielleicht auch irgendwo einen zoomfaktor einstellen?
    Geändert von Mr_P1nk (26.02.05 um 17:14 Uhr)
     

  4. #4
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    Wenn du die Assertation bekommst, bei welchem Befehl war er da grade? Ein übliches ASSERT ist bei einem Invalidate, dass das HWND ungültig ist. Oder bei OnDrawItem die Basisklassen-Implementation aufgerufen wird.

    Du kannst einen Zoomfaktor mit StretchBlt einrichten. Allerdings musst du hier aufpassen: Wenn der überlappende (bzw. nicht direkt dargestellte Bereich) wesentlich grösser wird als der angezeigte, machen manche Grafikkartentreiber nicht mit bzw. beim StretchBlt passiert nichts mehr. Ich meine, bei 16fach wäre Schluss gewesen.
     

  5. #5
    Mr_P1nk Mr_P1nk ist offline Rookie
    Registriert seit
    Feb 2005
    Beiträge
    6
    Ich weiss nicht genau bei welchem Befehl er da is, wenn ich debugge komm ich zu irgendwelchen Assembler Befehlen und dann kommt auf einmal die Fehlermeldung
     

  6. #6
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    Beim Debuggen müsstest du einen Call Stack oder ähnlich genannt finden. Der zeigt einem an, innerhalb welcher Routine welche andere Routine aufgerufen wird und so weiter. Wenn du dort von der Assembler-Stelle ein bisschen nach oben gehst, müsste er irgendwo zu einem Code-Teil von dir kommen.
     

  7. #7
    Mr_P1nk Mr_P1nk ist offline Rookie
    Registriert seit
    Feb 2005
    Beiträge
    6
    Danke ... ich bin jetzt draufgekommen. Es war einfach weil ich die Bitmap ein 2tes mal geladen habe.

    Und das Zoomen geht auch. thx für deine hilfe
     

Ähnliche Themen

  1. MFC SDI | Per GDI in Bitmap zeichnen?
    Von eurostar123 im Forum VisualStudio & MFC
    Antworten: 1
    Letzter Beitrag: 08.03.10, 21:35
  2. Bitmap auf MFC-Fenster zeichnen
    Von Krankfried im Forum C/C++
    Antworten: 1
    Letzter Beitrag: 19.10.08, 21:23
  3. Bitmap auf Desktop zeichnen
    Von Kaiser206 im Forum C/C++
    Antworten: 2
    Letzter Beitrag: 12.07.08, 23:12
  4. Antworten: 1
    Letzter Beitrag: 19.10.05, 14:58
  5. Säulen Zeichnen, Drachen zeichnen
    Von RudeJava im Forum Photoshop
    Antworten: 34
    Letzter Beitrag: 17.07.05, 09:34