Dialog unabhängig von der Bildschirmauflösung???



  • nicht mehr an ihrem richtigen platz im Dialog sind.

    ?

    Z.b. ein Button der bei kleinerer Auflösung ganz rechts ist und bei höherer Auflösung dann in der Mitte ?

    Schau da mal rein (hat mir schon gute Dienste geleistet):
    [url] http://www.codeproject.com/dialog/formview2.zip.asp [/url]

    -Captn.

    [ Dieser Beitrag wurde am 09.03.2003 um 22:08 Uhr von Captain editiert. ]



  • Hi

    danke erstmal für den versuch mir zur helfen aber ich kann damit in meinem Projekt nicht soviel anfangen weil ich OwnerDrawButtons benutze.

    Habe hier von einigen gehört das ich die Buttons in abhägigkeit von meinem Fenster zeichnen soll.Dies habe ich versucht zu realisieren aber das problem bleibt das gleichen immer wenn ich die auflösung ändere stimmen grösse und position der Buttons nicht mehr.
    Hier mal ein auszug aus dem code:

    CRect rect;
    GetWindowRect (&rect);
    rect.left = rect.left + 520;
    rect.right = rect.right - 405;
    rect.top = rect.top + 53;
    rect.bottom = rect.bottom - 696;
    colorButton1 = new CColorButton;
    colorButton1->Create("Color1",WS_CHILD|WS_VISIBLE|BS_PUSHBUTTON|BS_OWNERDRAW, rect , this, IDC_COLOR_BUTTON1);

    Ich Flipp noch aus Brauche dringend hilfe wie ich das Prob in den griff bekommen kann.

    Noch eine andere frage wieso passiert die änderung der Buttons nicht mit den Buttons die ich im VC++ Editor erstellt habe?Die haben immer die passende grösse zur passenden auflösung!!!

    Hilfe...

    danke im voraus

    C u





  • Wenn ich ein Fenster habe mit einem Button (egal welcher Typ) und ich verdoppele die Auflösung, dann wird auch alles doppelt so klein!!! An den Rechteckkoordinaten Deines Buttons ändert sich nix.

    Wenn die gleich groß bleiben sollen, dann musst Du die Bildschirmgröße ermitteln (ich glaub' mit ::GetSystemMetrics()) und Dir ein Verhältnis festlegen.

    Hilft das?



  • Ja danke erstmal...

    Werde jetzt mal einige Versionen durchtesten..

    C u



  • Ist der Button in dem Resource-Skript des Dialoges dabei oder pappst du ihn erst später auf das Fenster?



  • Hatte sie am anfang selber angepasst mache es jetzt aber über den Resourceeditor und das scheint zu klappen.
    Aber eine frage noch wo und wann werden die Buttons gezeichnet wenn man sie mit dem Resourceedit realisiert???
    Am Anfang von OnInit oder am Ende?!?!

    Danke C u



  • lol, die werden bei OnPaint gezeichnet. Und das geschieht nicht nur einmal sondern z.B. immer wenn die Buttons überdeckt sind.



  • Hm danke!!!

    Hab da noch ne kleine Frage.
    Wie kann ich OnPaint daran hindern das er immer einen Invalidate() ausführt?
    Ich möchte nämlich in meinem Dialog nur die einzelnen Buttons aktualisieren und nicht immer meinen ganzen Dialog. Das hat nämlich zur folge das alle meine Buttons mit den letzten Buttonparameter gezeichnet werden die ich an meine DrawItemfunktion übergeben habe. Und da jeder Button eine andere Bezeichnung und eine andere Farbe hat muss ich irgendwie unterbinden das Invalidate() in OnPaint aufgerfufen wird.

    Danke im voraus

    C u



  • ui ui ui, du hast da ja alles falsch verstanden. 🙄



  • Uhps!

    Und wie muss ich das richtig verstehen?

    Ich habe das Problem immer noch mit den Button.
    Vielleicht kannst du mir das ja erklären!!!!

    Thx

    C u



  • Noch ne kleine Frage...

    Wenn ich das mache

    farbe = 255;
    GetDlgItem(IDC_COLOR_BUTTON5)->Invalidate();
    farbe = 0;
    GetDlgItem(IDC_COLOR_BUTTON6)->Invalidate();
    sollte der Button5 Rot sein und der Button6 Schwarz aber irgendwie nehmen die Button immer die farbe des letzten Buttons an.Wieso???



  • Aus der MSDN zu CWnd::Invalidate(..):

    Invalidates the entire client area of CWnd. The client area is marked for
    painting when the next WM_PAINT message occurs.

    Das heißt, dass der Bereich des Buttons als ungültig (invalid) definiert wird und beim nächsten WM_PAINT aktualisiert wird. Soll explizit sofort neu gezeichnet werden, versuch es mal mit CWnd::RedrawWindow(..). Lässt sich auch ohne Argumente aufrufen. Dann wird der Button komplett neu gezeichnet.

    Shaggy



  • Ach so,

    noch etwas: Versuch doch mal die Einstellungen für das Zeichnen in Abhängigkeit der Daten von lpDrawItemStruct, Übergabeparameter von DrawItem(..), in Deiner Funktion zu setzen. Da steht zum Beispiel auch die ID des Buttons drin. Mit einem

    switch(lpDrawItemStruct->CtlID)
    {
    case ID_OK:
      break;
    case ID_CANCEL:
      break;
      //...
    }
    

    kannst Du dann für jeden Button die Einstellungen setzen. Unter dem switch-Statement positioniert Du dann die Aufrufe zum Zeichnen des Buttons.

    Shaggy



  • Danke erstmal!!!

    Werde mir das alles mal durch den Kopf gehen lassen.

    Thx

    C u



  • Da bin ich schon wieder...

    Habe es mal mit RedrawWindow versucht aber ich haben den gleichen effekt das alle Button in der letzten farbe dargestellt werden die ich an meine DrawItemfunktion übergeben habe.
    Ich vermute das es damit zusammen hängt das irgendwo beim starten meines Proggys für mich nicht einsichlich mein ganzer Dialog gezeichnet bzw neugezeichnet wird.
    Kann ich OnPaint nicht dazu veranlassen das er alles neu zeichnet ausser meine OwnerDrawButtons das Würde vielleicht weiter helfen.
    Problem ist ja das bei jedem Sch... OnPaint aufgerufen wird und dann zeichnet er alles neu mit der einstellung meiner letzten farbe.

    Vielleicht weiss ja einer eine Lösung oder hat eine idee.

    Thx



  • oooohjeeeeee. :p



  • Versuch es doch mal mit meiner letzten Idee (switch-Statement). Kümmere Dich am Besten gar nicht darum, wann, ob, wie, warum, weshalb und wie oft neugezeichnet werden muss. Lass das mal lieber Sache von WinDoof sein.

    Über das switch-Statement kannst Du ja (über die command-id) zwischen den Buttons unterscheiden.
    Programmiere Deine DrawItem-Funktion mal (ungefähr) so:

    ASSERT(lpDrawItemStruct != NULL);
      ASSERT(lpDrawItemStruct->CtlID == ODT_BUTTON); // optional
    
      COLORREF colBk;  // Hintergrundfarbe
      COLORREF colTxt; // Textfarbe
      // ... weitere Attribute für das Zeichnen
    
      // hier werden die Attribute gesetzt
      switch(lpDrawItemStruct->CtlID) 
      {
      case ID_MYBUTTON1:  // hier die entsprechende command-id des Button angeben
        colBk = RGB(192, 192, 192);
        colTxt = RGB(255, 0, 0);
        break;
      case ID_MYBUTTON2:  // hier die entsprechende command-id des Button angeben
        //...
        break;
      case ID_ ... // und so weiter und so fort
      }
    
      // eventuell noch lpDrawItemStruct->itemAction und/oder
      // lpDrawItemStruct->itemState auswerten
    
      // hier kommt jetzt der Code zum Zeichnen
      CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
      ASSERT(pDC != NULL);
    
      // Beispiel: Hintergrund zeichnen
      pDC->FillSolidRect(lpDrawItemStruct->rcItem, colBk);
    
      // ... weiteres Zeichenn
    
      /*
        immer wichtig:
        Rücksetzen der ausgewählten Pens, Brushes, etc.
    
        wenn Du also einen ähnlich Aufruf wie
    
          pDC->SelectStockObject(BLACK_BRUSH);
    
        oder
    
          pDC->SelectObject(pMyPen);
    
        machst, dann immer folgendes machen:
    
        Beim ersten Mal (für jeden Objekttyp, den Du in das DC selektierst:
    
          CBrush* pBrushOld = (CBrush*)(pDC->SelectStockObject(BLACK_BRUSH));
          CPen* pPenOld = pDC->SelectObject(pMyPen);
    
        dann kommen die Funktionsaufrufe zum Zeichnen und ganz zum Schluß:
    
          pDC->SelectObject(pBrushOld);
          pDC->SelectObject(pPenOld);
    
        Das gilt für JEDE Veränderung am DC. Hängt damit zusammen, dass sich manche
        Fenster ein DC teilen und je nicht zurückgesetzte Änderung zu Ausgabefehlern
        führen kann. Hab ich selbst schon mal erlebt, kann lustig aussehen, aber
        auch im Nirvana enden.
      */
    

    Mehr kann ich Dir auch nicht helfen, ansonsten müsste ich die Sourcen mal sehen.

    Gruß
    Shaggy



  • Schit, hab vergessen die Code-Tags zu setzen, zweiter Versuch:

    ASSERT(lpDrawItemStruct != NULL);
      ASSERT(lpDrawItemStruct->CtlID == ODT_BUTTON); // optional
    
      COLORREF colBk;  // Hintergrundfarbe
      COLORREF colTxt; // Textfarbe
      // ... weitere Attribute für das Zeichnen
    
      // hier werden die Attribute gesetzt
      switch(lpDrawItemStruct->CtlID) 
      {
      case ID_MYBUTTON1:  // hier die entsprechende command-id des Button angeben
        colBk = RGB(192, 192, 192);
        colTxt = RGB(255, 0, 0);
        break;
      case ID_MYBUTTON2:  // hier die entsprechende command-id des Button angeben
        //...
        break;
      case ID_ ... // und so weiter und so fort
      }
    
      // eventuell noch lpDrawItemStruct->itemAction und/oder
      // lpDrawItemStruct->itemState auswerten
    
      // hier kommt jetzt der Code zum Zeichnen
      CDC* pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
      ASSERT(pDC != NULL);
    
      // Beispiel: Hintergrund zeichnen
      pDC->FillSolidRect(lpDrawItemStruct->rcItem, colBk);
    
      // ... weiteres Zeichenn
    
      /*
        immer wichtig:
        Rücksetzen der ausgewählten Pens, Brushes, etc.
    
        wenn Du also einen ähnlich Aufruf wie
    
          pDC->SelectStockObject(BLACK_BRUSH);
    
        oder
    
          pDC->SelectObject(pMyPen);
    
        machst, dann immer folgendes machen:
    
        Beim ersten Mal (für jeden Objekttyp, den Du in das DC selektierst:
    
          CBrush* pBrushOld = (CBrush*)(pDC->SelectStockObject(BLACK_BRUSH));
          CPen* pPenOld = pDC->SelectObject(pMyPen);
    
        dann kommen die Funktionsaufrufe zum Zeichnen und ganz zum Schluß:
    
          pDC->SelectObject(pBrushOld);
          pDC->SelectObject(pPenOld);
    
        Das gilt für JEDE Veränderung am DC. Hängt damit zusammen, dass sich manche
        Fenster ein DC teilen und je nicht zurückgesetzte Änderung zu Ausgabefehlern
        führen kann. Hab ich selbst schon mal erlebt, kann lustig aussehen, aber
        auch im Nirvana enden.
      */
    


  • Thx für die schnelle Antwort.

    Werde mich jetzt mal einschliessen und versuchen das Problem in den Griff zu kriegen.

    C u


Anmelden zum Antworten