VC++: View-(Fenster-)Farbe ändern?

Hallo,

wie kann man in einem gewöhnlichen (SDI-) MFC-Projekt mit Dokument-Ansicht-Struktur, wobei der View ein CView-Objekt ist, die (Fenster-) Farbe des Views ändern. Der Default-Zustand ist, dass die Fenster-Farbe der System-Einstellungen genommen wird. Mittels

CDC::SetBkColor(COLORREF newColor)

geht es nicht, dann wird nur bei Zeichnen-Operationen die Hintergrund-Farbe geändert (z.B. beim Schreiben eines Texts). Folgende Variante funktioniert:

void CMyView::open\_mouth:nDraw(CDC\* pDC)
{
 ClearView(pDC,RGB(0,0,255));
}


void CMyView::ClearView(CDC\* pDC,COLORREF color)
{
 CRect rect;
 GetClientRect(&rect);
 pDC-\>FillSolidRect(&rect,color);
}

Das Problem ist jedoch, dass diese Variante zu langsam ist, d.h. beim Resizen des Fensters flackert der View. Hat jemand eine Idee? Vielen Dank im voraus.

Gruss Rolf

Hallo Rolf,

ich habe einen Lösungsvorschlag für Dein Problem. Allerdings habe ich die Lösung selbst „rausgefummelt“. Ich bin mir nicht sicher, ob ich in PreCreateWindow grobe Fehler begehe, aber ich denke nicht. Also:

Zunächst mußt Du Deiner Ansichtsklasse eine neue, private Variable hinzufügen:

CBrush \*m\_pBGBrush

Dieser Pinsel wird später verwendet, um den Hintergrund zu erstellen. Dafür mußt Du ihn in dem Konstruktor der Ansicht initialisieren:

CMyView::CMyView ()
{
 m\_pBGBrush =new CBrush( RGB(0,0,255)); // hier die gewünschte Farbe auswählen
}

Damit es kein Speicherleck gibt, muß der Pinsel im Destruktor der Ansicht wieder gelöscht werden:

CMyView::~CMyView()
{
 delete m\_pBGBrush;
}

Dann mußt Du nur noch die Funktion PreCreateWindow ändern:

BOOL CMyView::stuck\_out\_tongue:reCreateWindow(CREATESTRUCT& cs)
{
 // Ergebnis:
 BOOL bResult;

 // Über PreCreateWindow ein Vorgabe für die Klasse holen:
 WNDCLASS wc;
 bResult=CView::stuck\_out\_tongue:reCreateWindow(cs); 

 // die Informationen für die vorgegebene Klasse ermitteln...
 GetClassInfo(NULL,cs.lpszClass,&wc);
 // ... und ändern:
 wc.hbrBackground = (HBRUSH)m\_pBGBrush-\>m\_hObject; // Pinsel 
 wc.lpszClassName = "MyColoredWindow"; // Klassenname
 // die geänderte Klasse registrieren:
 RegisterClass( &wc );
 // den Namen der neuen Fensterklasse für die Ansicht verwenden
 cs.lpszClass="MyColoredWindow";

 return bResult;
}

Und das war’s dann auch schon. Eleganter ist es natürlich, den String „MyColoredWindow“ als Konstante zu deklarieren, aber das bleibt Dir überlassen :wink:

Ich hoffe, das hilft Dir weiter.

Gruß
Uwe

Hallo Uwe,

vielen Dank für Deine ausführliche und hilfreiche Antwort.

Gruss Rolf