MFC - Farbige StaticText?

Nachtschwalbe

Grünschnabel
Hallo!

Wollte heute in meinem kleinen Programm ein bisschen Farbe ins Spiel bringen. Dabei handelt es sich um eine MFC Dialoganwendung.
Hab früher ein bisschen Visual Basic gemacht und lerne nun im Zuge einer Ausbildung ein wenig MFC.

Von VB her kenn ich noch diese schönen Labels, die man auf seine Form "malen" konnte. Da hatte man gleich auch nen Eigenschaftsfenster, wo man Schriftart und Farbe einstellen konnte.
Bei MFC vermisse ich in der Toolbox erstmal so ein Label, das einzig vergleichbare was ich gefunden habe ist ein Static Text. Farbwahl und Schriftart vermiss ich dort bei den Eigenschaften jedoch :(

Also ein wenig nachgeforscht und mir die Klassen CPen und CBrush mal angeguckt (leider nicht ganz verstanden) und nun wollte ich fragen ob mir eventuell jemand helfen könnte ^^
Bin wiegesagt echt noch ganz frisch mit dem programmieren überhaupt, wär lieb wenn mir jemand ein wink mit dem zaunpfahl oder sowas in der Art geben könnte!

Danke schonmal im Vorraus

Schwälbchen
-
Eine Schwalbe macht noch keinen Sommer!
 
Moin moin,

um die Schrifart zu setzen musst du dir die Klasse CFont anschauen.
Tipp:
Code:
Norm.CreateFont( -12,0,0,0,FW_NORMAL,0,0,0,0,0,0,0,0,CString("Helvetica"));
Achte aber auf eventuell freizugebene Resourcen. MSDN und :google: und :google: helfen weiter:)
Um die Farbe zu ändern musst du dir die Klasse CStatic ableiten und die OnPaint überladen:) bischen arbeit. Ist aber in der letzten Zeit öfters besprochen worden hier im Forum such mal nach "farbige Button".

Gruss Michael
 
Um ein CStatic einzufärben, muss davon nicht unbedingt eine eigene Klasse abgeleitet werden. Dazu kann man auch im Dialog die Message WM_CTLCOLOR verabeiten.
Wie aber bereits gesagt wurde, ist dieses Thema hier schon öfter behandelt wurden.
 
Stimmt, jetzt wo du es sagst... Hatte mir mal diverse Klassen abgeleitet, da mir bestimmte Funktionen unter CE nicht von Haus aus funzten.

Gruss Michael
 
Hi,
vielleicht ist das hilfreich für den Threadersteller. Ich möchte aber kurz anmerken, das man sich gut überlegen sollte, ob man die ganzen Einstellungen im Dlg setzt oder ob man sich die mühe macht die Objekte direkt abzuwandeln.
Ich finde es nicht wirklich vernünftig, in einem Dlg 20 Button einzeln abzuändern, wenn man das einmal für jeden Button machen kann und dem sozusagen einfach nur andere Flags gibt und die so steuert. Hätte den Vorteil das man sich die Arbeit für andere Dlg's spart.
Da CButton, CStatic und Co alle genau wie CDialog von CWnd abgeleitet wurden kann man das angegebene Schema einfach übertragen.
Aber das ist reine Ansichtssache... :)

Gruss Michael
 
so ich habs jetzt hinbekommen :)
vielen dank schonmal!
habe jetzt aber nen neues problem: Habe ein Static Text rot eingefärbt, wenn ich aber
nun auf einen button klicke, soll die farbe dieses static textes auf grün gesetzt werden.

Hier erstmal die funktion, die die WM_CTLCOLOR "bearbeitet".
Code:
HBRUSH CelChatServerDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
	HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
  
	CBrush rot(RGB(255,0,0));
	CBrush gruen(RGB(0,150,0));

	if(pWnd->GetDlgCtrlID()==IDC_STATUSST)
	{
	  if (!serverStarted)
		{
		   pDC->SelectObject(&rot);
                   pDC->SetTextColor(RGB(255,0,0));
		}
		else
		{
		   statusTxt.SetWindowText("[SERVER] running...");
		   pDC->SelectObject(&gruen);
                   pDC->SetTextColor(RGB(0,150,0));
		}
	}
	return hbr;
}

Habe mir gedacht, es würde genügen wenn ich an einer bestimmten Stelle einfach die WindowMessage WM_CTLCOLOR raushaue. Das mach ich in der selben funktion die die Sockets hochfährt und den Server einrichtet etc...

Code:
void CelChatServerDlg::OnStartServer()
{
	if (!useDefPortCheck)
	{ 
            ............
            ............     
	    serverStarted=true;
            this->SendMessage(WM_CTLCOLOR);
        }
}

Wenn ich das programm dann ausführe, bekomme ich einen Lesepositionfehler
oder soetwas ähnliches, aus der folgenden Funktion aus der wincore.cpp
Code:
BOOL CWnd::OnWndMsg(UINT message, WPARAM wParam, LPARAM lParam, LRESULT* pResult)
{
   ...
   ...
   dcTemp.m_hDC = pCtl->hDC;
   ...
   ...
}

Kann mir da jemand weiterhelfen?
Ich schätze mal ich muss eventuell irgendwas als LPARAM und WPARAM angeben bei der message? Die Welt is so schlecht :(

Ich könnte natürlich einfach this->RedrawWindow() sagen aber für das umfärben eines kleinen static textes gleich soviel rechenterror?

pls help^^
 
Die WM_CTLCOLOR solltest du nicht selbst verschicken. Ein einfaches Invalidate (MFC) oder InvalidateRect (Win32) sollte genügen, damit Windows dein Static neu zeichnet.
 
Zurück