2010-12-21 6 views
3

Ich erstelle eine grundlegende GUI mit der Windows-API, und ich bin auf ein Problem gestoßen. Es beginnt mit einem Hauptfenster, das mit einer benutzerdefinierten Hintergrundfarbe geöffnet wird, die ich (RGB(230,230,230)) einstelle. Es zeigt dann Text in der oberen linken Ecke mit dem statischen Steuerelement an.Statische Steuerelementhintergrundfarbe mit C++

settingstext = CreateWindow("STATIC", 
          "SETTINGS", 
          SS_LEFT | WS_CHILD, 
          12, 
          20, 
          100, 
          20, 
          hwnd, 
          NULL, 
          proginstance, 
          NULL); 
ShowWindow(settingstext, 1); 

Dies funktioniert, aber wenn der Text angezeigt wird brauche ich einen Weg, um den Hintergrund der es zu ändern, um das Hauptfenster passen oder aber es sieht aus wie es nicht in sich mischen.

Meine Frage ist, wie mache ich das? Ich benutze derzeit die Methode unten und es funktioniert, aber ich wollte wissen, gibt es eine Möglichkeit, die Hintergrundfarbe irgendwie gleich nach der CreateWindow-Funktion für die statische Steuerung fest, ohne Systemfarben zu ändern, und es nur für diesen gelten Kontrolle und nicht alles, was die 10 Nachricht sendet. Ich habe experimentiert mit der Verwendung der GetDC Funktion und SetBkColor Funktion außerhalb der Nachrichtenschleife, aber nichts funktioniert.

case WM_CTLCOLORSTATIC: 
    { 
    HDC hdcStatic = (HDC) wParam; 
    SetTextColor(hdcStatic, RGB(0,0,0)); 
    SetBkColor(hdcStatic, RGB(230,230,230)); 
    return (INT_PTR)CreateSolidBrush(RGB(230,230,230)); 
    } 

Ich möchte, dies zu tun, weil ...

  • Ich will nicht meine Nachrichtenschleife mit Funktionen füllen, dass jedes Mal, wenn die Fenster repaints genannt werden müssen.
  • Lassen Sie die Änderungen nur für diese statische Steuerung gelten.

Ich wäre sehr dankbar für jede Hilfe, die zur Verfügung gestellt werden könnte, zumindest wies mich in die richtige Richtung, danke.

+1

Sie können den Effekt des 'WM_CTLCOLORSTATIC'-Codes auf nur Ihr statisches Steuerelement beschränken, indem Sie Folgendes überprüfen:' (HWND) lParam == settingstext'. Es gibt ein Problem mit Ihrem Beispiel, dass alle von Ihnen erstellten Pinsel niemals gelöscht werden. –

Antwort

10

Für statische Textsteuerelemente gibt es keine dauerhafte Möglichkeit, die Textfarbe oder ihren Hintergrund festzulegen. Auch wenn Sie die Änderungen auf ein einzelnes statisches Steuerelement anwenden möchten; Sie müssten die Meldungsnachricht WM_CTLCOLORSTATIC im übergeordneten dlgproc nur behandeln, wenn das Steuerelement gerade gezeichnet wird.

static HBRUSH hBrush = CreateSolidBrush(RGB(230,230,230)); 

case WM_CTLCOLORSTATIC: 
{ 
    if (settingstext == (HWND)lParam) 

       //OR if the handle is unavailable to you, get ctrl ID 

    DWORD CtrlID = GetDlgCtrlID((HWND)lParam); //Window Control ID 
    if (CtrlID == IDC_STATIC1) //If desired control 
    { 
     HDC hdcStatic = (HDC) wParam; 
     SetTextColor(hdcStatic, RGB(0,0,0)); 
     SetBkColor(hdcStatic, RGB(230,230,230)); 
     return (INT_PTR)hBrush; 
    } 
} 

Wenn Sie schauen, die Kontrolle der Hintergrund transparent über einen übergeordneten Dialog machen Sie SetBkMode(hdcStatic, TRANSPARENT) nutzen könnten.

+1

Können Sie erklären, warum Sie 'hBrush' für den Hintergrund erstellen müssen, wenn Sie' SetBkColor' bereits aufgerufen haben? Und im Fall von transparentem Hintergrund benötigen Sie auch einen transparenten Pinsel? – Ameen

1

Haben Sie darüber nachgedacht, das statische Fenster zu untergliedern und den Eigentümer zu zeichnen?

+0

Ich habe keine Ahnung, was das ist, also werde ich ein paar schnelle Nachforschungen anstellen. – contrapsych

+0

Grundsätzlich bedeutet dies, dass Sie Nachrichten an das statische Steuerelement gesendet haben, um stattdessen zu Ihrem Code zu gelangen (vergessen Sie nicht, diejenigen, die Sie nicht behandeln, an den ursprünglichen Handler zu übergeben). Wenn Sie mit den Hintergrund-Lösch- und Paint-Meldungen umgehen, können Sie im Fenster alles anzeigen lassen, was Sie möchten. –

+0

Das würde also nur bei diesem einzelnen Steuerelement passieren, gibt es auch eine Möglichkeit, die Anzahl der Funktionen in der benutzerdefinierten Prozedur zu reduzieren, die ich für dieses Steuerelement vornehmen würde.Grundsätzlich, was ich mit der ganzen "nicht sehr vielen Funktionen in der Prozedur" Sache bin, ist, dass es scheint, wie es die Anwendung verlangsamen würde, diese Funktionen jedes Mal auszuführen, wenn es neu streichen muss, oder ist es nicht wirklich eine große Sache ? – contrapsych

1

Ich denke, es gibt eine dauerhafte Möglichkeit, es zu tun.

Verwenden Sie nach dem Erstellen der Beschriftung die GetDC() - Funktion, um den Gerätekontext abzurufen. Dann nutzen:

SetTextColor(hdcStatic, RGB(0,0,0)); 
SetBkColor(hdcStatic, RGB(230,230,230)); // Code Copied from the above answer by cpx. 

Und es sollte tun.