Form1 Farbe ändern



  • Hey Com,

    Wenn ich (unter Windows) Rechtsklick -> Eigenschaften-> Designs gehe kann ich ja
    bekanntlich ein anderes Skin auf mein Windoof bügeln... und sofern es dabei
    geändert wurde werden auch alle Programme welche eine TForm nutzen "umgefärbt"

    z.B. von standart Blau --> wenn man das skin "Zune" nutzt auf Grau...

    nun aber zu meiner frage gibt es im Borland C++ Builder die möglichkeit die Farbe des Rahmens einer Form zu verändern ???

    ich hab nun eine weile gegoogelt die Hilfe durchgeklickt und in einem Buch nachgeschlagen aber nichts wirklich brauchbares gefunden...

    Ich suche keine komplett lösung sondern nur eine Hilfe / eine Idee sofern es möglich ist...

    Gruß,
    😉



  • Hallo 😉

    Die einzige Lösung die ich kenne, um dies zu bewerkstelligen, ist die Funktion "OnPaint" des Formulars.

    Kurz gesagt bedeutet dies, dass du den Rahmen selbst zeichnen musst, da ich nicht glaube, dass du nur die Farbe allein ändern kannst.

    Ansonsten könntest du den BorderStyle des Forms auf bsNone stellen, und dir deinen Rahmen direkt im C++Builder zusammenstellen (resp. kreieren)





  • Guten Tag,
    ganz ehrlich versteh ich nicht wirklich was ich mit:

    GetDCEx(...)

    anfangen soll geschweige denn wie es mir weiterhelfen soll...
    kann man das nich wie mit dem ProgressBar machen ?
    z.B.

    SendMessage(ProgressBar1->Handle, PBM_SETBARCOLOR, 0, clRed);
    

    ...
    Gruß,
    🙂



  • Tja, wenns einfach wäre, könnst ja jeder.

    Hab da noch was gefunden (mit Googlesuche stichworte "Windows fensterrahmen zeichnen Api"):

    http://www.matrix44.net/old/borderoverride.html



  • Und genau weil es scheinbar nicht so einfach ist suche ich ja auch nach Hilfe

    durch deinen Link weis ich nun das es sich um den

    Non-Client Bereich (Non-Client Area)

    handelt sowie das es dazu 5 Methoden gibt...

    WM_NCPAINT
    WM_NCACTIVATE
    WM_ACTIVATE
    WM_NCLBUTTONDOWN
    WM_NCCALCSIZE

    zudem finde ich auf jeder 2 seite:

    HDC hdc;
    hdc = GetDCEx(hwnd, (HRGN)wParam, DCX_WINDOW|DCX_INTERSECTRGN);
    // Paint into this DC
    ReleaseDC(hwnd, hdc);

    aber auf allen seiten mangelt es an der erklärung wie der code in dem zusammenhang zu nutzen ist...

    aber mal sehen vlt. finde ich ja doch noch was
    Gruß,
    🙂



  • schau mal in den FAQ -> "Forms - Aussehen selbst/frei gestalten"



  • Du hast jetzt schon mal gelernt, das der Fensterrahmen zum Non- clientbereich gehört. 👍

    Klick nun nochmal den Link in meinen ersten Post an. Auf der Seite klickst du dann auf "GDI". Dort findest du die Beschreibung der Windows GDI. Deren Funktion benötigst du, um in den Non-Client Bereich zu zeichnen. Für diese Funktionen benötigst du wiederum den DC.



  • So ich hab nun mal ein wenig gebastelt aber wirklich so ganz das wahre ist es auch noch nicht...

    sollte noch jemand Anregungen oder Verbesserungen haben nehme ich diese auch gerne dankend entgegen.

    void __fastcall TForm1::FormPaint(TObject *Sender)
    {
      Fensterrahmen();
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::FormCanResize(TObject *Sender, int &NewWidth,
    	  int &NewHeight, bool &Resize)
    {
    	  Fensterrahmen();
    }
    //---------------------------------------------------------------------------
    void TForm1::Fensterrahmen()
    {
    	 TCanvas * Canvas = new TCanvas();
    
    	  Canvas->Handle = GetWindowDC(Form1->Handle);
    
    	  Canvas->Pen->Color   = clBlack;
    	  Canvas->Brush->Color = clBlack;
    	  Canvas->Font->Color  = clWhite;
    
    	  //Malt Rechtecke um jede Rahmen Seite...
    	  Canvas->Rectangle(0,0,Form1->Width,30);
    	  Canvas->Rectangle(0,0,4,Form1->Height);
    	  Canvas->Rectangle(Form1->Width-4,0,Form1->Width,Form1->Height);
    	  Canvas->Rectangle(0,Form1->Height-4,Form1->Width,Form1->Height);
    
    	  //Malt den Text auf die Form...
    	  Canvas->Font->Size = 8;
    	  Canvas->Font->Style = TFontStyles() << fsBold;
    	  Canvas->TextOutA(10,10,Form1->Caption);
    	 delete Canvas;
    }
    

    Gruß,
    🙂



  • 😉 schrieb:

    So ich hab nun mal ein wenig gebastelt aber wirklich so ganz das wahre ist es auch noch nicht...
    🙂

    Dein Code erzeugt ein Formular ohne den kompletten NC-Bereich...
    Solange du in der Form::Paint-Methode arbeitest, wirst du nicht dein gewünschtes Ergebnis erhalten.
    Um Im Non-Client-Bereich des Formulares zu zeichnen, muss man schon die betreffenden Windows-Messages
    abfangen und verarbeiten. Steht ja schon oben in den Postings.

    Das geht z.B. mit einer MESSAGE MAP. Beispiele gibts sicher im Archiv.


Log in to reply