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



  • 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



  • Puuh!Hi hi konnte die Tür wieder aufschliessen!

    Klappt super deine idee.

    Thx



  • na endlich!!!



  • Gut ding braucht weile!!! 😉

    Make PEACE not WAR 😃


Anmelden zum Antworten