Schrift vergrößern
-
mit OnCtlColor hab ich es nicht versucht, weil ich mit CDC nicht weiterwusste
hab einfach nur SetText gemacht
-
also ich hab jetzt folgendes:
ein Textfeld Namens "IDC_Kraft"
darauf ist eine Membercontroll namens m_Kraft
ansonsten hab ich nur schriftgroesse gemacht
schrift.CreateFont(20, 0, 0, 0, 200, 0, 0, 0, 1, 0, 0, 1, 2, "Arial");
an farbe hab ich jetzt noch gar nichts gemacht
-
du musst ihm ja irgendwo sagen was er denn einfärben soll, und das macht man gewöhnlich in der OnCtlColor. Erzeug sie über den Klassenassi und dann mach was ich oben geschrieben hab und du wirst merken dass das gar nciht so schwer ist, wenn man erst mal drin ist.
-
... da war Polofreak schneller.
Also, versuch erstmal das in OnCtlColor und wenns nicht geht, zeig mal, was du (zum Thema Farbe, der Font funktionierte ja) gemacht hast.
-
jo, klappt
und wenn ich jetzt verschiedene in anderen farben während der laufzeit ändern möchte, mach ich die ganze sache einfach dynamisch oder wie?
sprich; ich übergebe im das Steuerelement und die 3 farben, gell?
-
Pro Steuerelement eine.
Aber im Prinzip hast du Recht.
-
hab das jetzt so versucht:
void CAFKWin32XPDlg::OnButton4() { // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen OnCtlColor(NULL,NULL,NULL,150,243,250); }
HBRUSH CAFKWin32XPDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor, int R,int G, int B) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); if (pWnd->GetDlgCtrlID() == IDC_Kraft) pDC->SetTextColor(RGB(R,G,B)); // TODO: Anderen Pinsel zurückgeben, falls Standard nicht verwendet werden soll return hbr; }
hängt sich aber auf
-
wo hängt er sich denn auf?
Dann ist es einfacher! Was für eine Meldung bekommst du ??
-
Die Standardt Meldung von Windows mit den Buttons "Senden" und "Nicht Senden"
-
ich will ja nur, dass sich die farbe auf rot,blau oder grün ändert, wenn ich die entsprechenden buttons klicke
-
Ändere NIEMALS die Anzahl der Parameter von Message-Handlern!
Nicht:HBRUSH CAFKWin32XPDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor, int R,int G, int B)
sondern
HBRUSH CAFKWin32XPDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
Mach den COLORREF (RGB-Wert) als Membervariable und belege den in der jeweiligen OnBtnFarbe mit dem passenden Wert, der Rest müßte von alleine gehen.
-
ja ok
das hab ich jetzt soweit gemacht
int Blau; int Rot; int Gelb;
HBRUSH CAFKWin32XPDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); if (pWnd->GetDlgCtrlID() == IDC_Kraft) pDC->SetTextColor(RGB(Rot,Gelb,Blau)); // TODO: Anderen Pinsel zurückgeben, falls Standard nicht verwendet werden soll return hbr; }
nur wie ruf ich die funktion jetzt auf, wenn ich die farbe ändern will über den button?
das ich rot,gelb und blau vorher mit werten belegen muss, das is klar
aber ich hab weder eine initialisierung für pDC noch für pWnd
-
OnCtlColor wird automatisch autogerufen, wenn ein Control gezeichnet werden muss.
Das ist im Prinzip folgendes:
"Hallo Programm! Ich male jetzt das Control hier (pWnd), wie soll ich das einfärben? Gib mir mal die richtigen Stifte (pDC belegen, hbr zurückgeben)."Also fülle einfach in der OnBtnBlau und den anderen Button-Funktionen die Farbwerte und probiers aus.
-
wenn es nur drei Farben sind dann mach doch so was
#define WHITE RGB(255,255,255) #define BLACK RGB(0,0,0) #define RED RGB(222,0,49) #define GREEN RGB(100,255,100) #define GRAY RGB(140,140,140)
dann machste ne Membervariable z.B. vom Typ int dann frägste in der OnCtrlColor ab
if(intMember == 1) pDC->SetTextColor(WHITE);
bzw mit switch
Die Funktion brauchst du nicht explizit aufrufen, immer wenn neugezeichnet wird, wird die Funktion aufgerufen (bei Buttonclick wird neu gezeichnet)
-
hää?
ich rall grad gar nichts mehr
muss ich dann die funktion einfach in den button reinpacken oder wie?
hab das jetzt so
void CAFKWin32XPDlg::OnButton4() { // TODO: Code für die Behandlungsroutine der Steuerelement-Benachrichtigung hier einfügen //OnCtlColor(NULL,NULL,NULL,150,243,250); Rot = 150; Gelb = 200; Blau = 150; HBRUSH CAFKWin32XPDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); if (pWnd->GetDlgCtrlID() == IDC_Kraft) pDC->SetTextColor(RGB(Rot,Gelb,Blau)); TODO: Anderen Pinsel zurückgeben, falls Standard nicht verwendet werden soll return hbr; } }
-
void CAFKWin32XPDlg::OnButton4() { Rot = 150; Gelb = 200; Blau = 150; RedrawWindow(); }
-
nur wenn der Button gedrückt wird soll der Text gefärbt werden?
dann mach ne Bool Member die du true setzt OnButton4
die OnCtrlColor bleibt wo sie war, nicht in die OnButton die wird schon von selbst aufgerufen (vertrau der MFC) in der OnCtrlColor machste dann noch in deine if blabla IDC_Kraft && deine Boolmember == TRUE
-
ja ok
hab ich soweit gemacht
auch keine fehler mehraber muss ich die denn jetzt nicht in einen timer reinpacken?
weil so wie ich das jetzt verstanden habe, ruft er die doch nur einmal beim start des programms auf, oder?
-
nein bei jedem neuzeichnen! Beim mini-Maximieren, beim drop down einer Combobox bei Buttonclicks ... setzt doch mal einen Breakpoint drauf und schau mal wie oft du an die Stelle kommst, dann siehste das ziemlich schnell! Ist denn Jetzt dein Text wie du ihn willst?
-
Genau, das mit dem Breakpoint ist ne gute Möglichkeit.
Besser ist allerdings ein TRACE, weil dann das Programm nicht angehalten wird.if (pWnd->GetDlgCtrlID() == IDC_Kraft) { pDC->SetTextColor(RGB(Rot,Gelb,Blau)); TRACE("Farbe für IDC_Kraft\n"); }
Und dann per F5 starten und die Ausgabe im Auge behalten.