Dialog unabhängig von der Bildschirmauflösung???
-
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
-
Puuh!Hi hi konnte die Tür wieder aufschliessen!
Klappt super deine idee.
Thx
-
na endlich!!!
-
Gut ding braucht weile!!!
Make PEACE not WAR