Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Childwindow in Farbe?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
01.08.2002, 14:37 Uhr
~Dis
Gast


Hallo,

ich habe eine MDI-Anwendung und würde gerne die Child-Fenster in einer anderen Farbe als Grau haben. Es sind EditView's, die schreibgeschützt sind (readonly).
Gibt es hier eine Möglichkeit dies zu realisieren?

Ich habe es mal so in der OnDraw probiert:

C++:
bool CMeineKlasseView::Redraw(CDC* pDC)
{
    // es sol lein blau werden, #000066 sprich (0, 0, 102)
    CBrush backBrush(RGB(0, 0, 102));
    CBrush* pOldBrush = pDC->SelectObject(&backBrush);
    CRect rect;
    pDC->GetClipBox(&rect);  
    pDC->PatBlt(rect.left, rect.top, rect.Width(),
    rect.Height(), PATCOPY);
    pDC->SelectObject(pOldBrush);
    return true;
}


Leider funktioniert es nicht..

Vielen Dank!
Dis
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
01.08.2002, 19:01 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo,
wenn es Dir nur darum geht den Hintergrund des jeweiligen Fenster zu ändern dann:

C++:
BOOL CMdiView::OnEraseBkgnd(CDC* pDC)
{
    CRect Rect;
    GetClientRect(&Rect);
    pDC->FillSolidRect(Rect,RGB(0,0,255)); // blue
    return TRUE;
    
    //return CFormView::OnEraseBkgnd(pDC);
}


Wenn auch noch der Hintergrund des Clientbereiches verändert werden soll mußt du anders vorgehen.
--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
02.08.2002, 09:51 Uhr
~Dis
Gast


Hi,

danke für die Hilfe. Es funktioniert.
Es gibt alledings noch einen Schönheitsfehler. Die Zeile wo der Cursor steht, ist immernoch in der Uhrsprünlichen Farbe (Grau, da Readonly). Wenn ich das Fenster mit Text fülle, wird das Blau ebenfalls überschrieben. Kann ich das nicht abfangen?

Hast Du vielleicht auch noch eine Lösung oder einen Vorschlag zum Färben des Clientbereiches? Ich meine den Hintergrund des MainFrame Fensters.
Das wäre super

MfG,
~Dis
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
02.08.2002, 16:34 Uhr
Uwe
C/C++ Master
(Administrator)


Hallo,
Sorry mein Fehler, ich hab das Bsp. aus einer FormView gezogen. Man sollte doch eben genauer lesen
So jetzt zum Problem: Das Editview ist nichts anderes als ein "großes" CEdit und hat somit auch alle seine Vor- und Nachteile geerbt. Du mußt dann zusätzlich =WM_CTLCOLOR überschreiben (NICHT WM_CTLCOLOR). Dazu mußt du mit dem Klassenassi eine neue Behandlungsroutine für Windowsnachrichten einfügen und zwar für "Untergeordnetes MDI-Fenster".
Das füllst Du z.b. so:

C++:
HBRUSH CMdiView::CtlColor(CDC* pDC, UINT nCtlColor)
{
    pDC->SetBkColor(RGB(0,0,255));
    pDC->SetTextColor(RGB(0,0,0));
    HBRUSH hbr = CreateSolidBrush(RGB(0,0,255));
    return hbr;
    //return NULL;
}

Das war Nummer eins. Beim zweiten Problem mußt Du folgendes wissen:
Wenn du mit dem Assi eine MDI-Anwendung erstellst ist die CMDIFrameWnd Klasse die Basis für CMainFrame. Um den Mdiclientbereich (MDICLIENT) "anzuzapfen" mußt Du einen kleinen Umweg gehen. In der CMDIFrameWnd Klasse existiert eine HWND Membervariable (m_hwndMDIClient), welcher wir uns bedienen können.
Dazu sind folgende Schritte notwendig:
1. Eine neue Klasse mit dem Assi erstellen und diese von CWnd ableiten (CMDIClientWnd).
2. CMDIClientWnd benutzen um MDICLIENT zu subklassen.
- in der CMainFrame Klasse eine öffentliche Variable
C++:
CMDIClientWnd  m_wndMDIClient

anlegen
- OnCreate() in CMainFrame wie folgt verändern:

C++:
int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
    if (CMDIFrameWnd::OnCreate(lpCreateStruct) == -1)
    return -1;

    if (!m_wndMDIClient.SubclassWindow (m_hWndMDIClient)) {
        TRACE ("Failed to subclass MDI client window\n");
        return (-1);
    }
    //...
}


Jetzt kannst Du den Assi nutzen und in deiner NEUEN KLASSE folgendes einfügen:

C++:
BOOL CMDIClientWnd::OnEraseBkgnd(CDC* pDC)
{
    CBrush backBrush(RGB(0,0,255));
    CBrush* pOldBrush = pDC->SelectObject(&backBrush);

    CRect rect;
    pDC->GetClipBox(&rect);
    pDC->PatBlt(rect.left, rect.top, rect.Width(), rect.Height(),PATCOPY);
    pDC->SelectObject(pOldBrush);
    return TRUE;
    
    //return CWnd::OnEraseBkgnd(pDC);
}

--
"Es ist schwierig, ein Programm wirklich idiotensicher zu machen, weil Idioten so genial sind."

Bis dann...
Uwe
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
05.08.2002, 10:07 Uhr
~Dis
Gast


Hallo Uwe,

whoa.. Das ist ja Wahnsinn ;-)
Hat alles bestens funktioniert!! Ein super Beitrag ... Vielen Dank
Wäre das nicht etwas für eure FAQ? Die ist noch so leer..

Schöne Grüße,
~Dis
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: