Horizonhal Scrollbar im Dialog



  • hallo,
    ich habe 2 Dialoge:

    mein Hauptdialog und mein Grafigdialog.

    mit dem...

    // Code ist aus dem MUT Buch.
    
    2: {
     3: // Zeiger in Zeiger auf Dialogklasse des Hauptfensters 
     4: // umwandeln
     5: CGraphicsDlg *pWnd = (CGraphicsDlg*)GetParent();
     6: BITMAP bm;
     7: CDC dcMem;
     8: CRect rRect;
     9:
    10:  // Geladenes Bild holen
    11:  pWnd->m_bmpBitmap.GetBitmap(&bm);
    12:  // Gerätekontext erzeugen, in den Bitmap geladen wird
    13:  dcMem.CreateCompatibleDC(pdc);
    14:  // Bitmap in den kompatiblen Gerätekontext selektieren
    15:  dcMem.SelectObject(pWnd->m_bmpBitmap);
    16:  // Verfügbaren Anzeigebereich ermitteln
    17:  GetClientRect(rRect);
    18:  rRect.NormalizeRect();
    19:  // Bitmap in Dialogfeld kopieren und in Größe anpassen
    20:  pdc->StretchBlt(10, 10, 
    21:                  (rRect.Width() - 20), (rRect.Height()-20),
    22:                  &dcMem, 0, 0, 
    23:                  bm.bmWidth, bm.bmHeight, SRCCOPY);
    
    24: }
    

    ... kann ich mein geladenes Bild im 2ten Dialog anzeigen lassen.
    Wenn ich StretchBlt verändere, wird das Bild
    nur zur hälfte angezeigt, was auch gewollt ist.Das funkt auch.
    Jetzt will ich scollen:
    Dialog -> Eigenschaften -> Horizonhal Scrollbar "True".

    Was muss ich tun dass ich scollen kann?


  • Mod

    http://lmgtfy.com/?q=scrollable+ dialog

    3 Links alle oben mit viel Code. 🕶

    EDIT: Nein noch mehr...



  • danke, ich habe schon in Codeproject herumgesucht. Ich dachte, wenn es die Funktion gibt klick -> v scroll. Dann sollte es einen Katzensprung sein, dass ich V Schroll auch nutzen kann.
    Nichts für Ungut, Lösung habe.:-)



  • die Probleme gehen weiter 😞

    Mein Dialogfenster hat ein Knopf ( vorübergehend ).
    V und H scroll ist jetzt vorhanden.

    Ich kann so scollen dass ich den Knopf sehe und einmal dass ich ihn nicht sehe.
    Wenn ich Bild in die Dialogbox lade, sehe ich das Bild nur 60 %.Wenn ich scolle, verschoppelt mir das Bild. Beim zurückscollen ist ein Teil vom Bild verschwunden.

    // Zeiger in Zeiger auf Dialogklasse des Hauptfensters 
      // umwandeln
      CbacktoplanDlg *pWnd = (CbacktoplanDlg*)GetParent();
      BITMAP bm;
      CDC dcMem;
      CRect rRect;
    
      // Geladenes Bild holen
      pWnd->m_bmpBitmap.GetBitmap(&bm);
      // Gerätekontext erzeugen, in den Bitmap geladen wird
      dcMem.CreateCompatibleDC(pdc);
      // Bitmap in den kompatiblen Gerätekontext selektieren
      dcMem.SelectObject(pWnd->m_bmpBitmap);
      // Verfügbaren Anzeigebereich ermitteln
      GetClientRect(rRect);
      rRect.NormalizeRect();
      // Bitmap in Dialogfeld kopieren und in Größe anpassen
      pdc->StretchBlt(10, 10, 
                      (rRect.Width() - 20), (rRect.Height()-20),
                      &dcMem, 0, 0, 
                      bm.bmWidth, bm.bmHeight, SRCCOPY);
    

    Der Code ist nicht auf meinem Mist gewachsen.:-)
    So wie oben sehe ich mein Bild komplett, wenn ich die Werte von Strech verändere sehe ich das Bild nur z.B.60 % den Rest möchte ich scollen.


  • Mod

    Und wo zeichnest Du bitte?



  • erstmal thx.
    Ich zeichne nicht, 🙂
    sondern lade das Bild in das 2te Dialog Fenster.



  • @MartinRichter
    Wie meinst du das mit zeichnen?


  • Mod

    Was bitte ist StrechBlt? Das ist auch "Zeichnen"...



  • hi,
    ok, das ist zeichnen. 🙂
    Mit StrechBlt passe ich die Form an das Dialogfenster an.
    Der Compiler zeigt mir ja keine Fehler an, aber ich weis nicht wo ich anfangen soll zu suchen.



  • Die Frage war aber auch WO du zeichnest als in welcher Funktion du das stück Quelltest stehen hast


  • Mod

    Anders gesagt (Antwort vorne weg):
    Es wird nicht funktionieren, wenn Du außerhalöb von WM_PAINT zeichnest!



  • irgendwie bin ich verwird. Ich muss das wird über wm_paint anzeigen lassen?
    nach was soll ich googlen?



  • ja du sollst OnPaint() überladen und darin zeichnen, das ist auch die einzige Stelle außer OnEraseBkgnd() wo man überhaupt zeichnen darf.

    Das Anstoßen des neu zeichnen kannst du von überall her mit Invalidate() oder InvalidateRect().


Anmelden zum Antworten