Announcement

Collapse
No announcement yet.

Wie kann ich die Farbe des "Caption" Bereiches einer From änder?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Wie kann ich die Farbe des "Caption" Bereiches einer From änder?

    Wie kann ich die Farbe des "Caption" Bereiches einer From änder? Diese ist Standardmäßig blau, und möchte diese in grün ändern.
    Und Wie kann ich dort einen Farbverlauf "rein" programmieren?

  • #2
    aber mit Sicherheit nicht. Mein Source ist ~2.500 Zeilen lang, ok, er fixt neben bei noch die MDI Bugs u.ä.

    Gruß Hage

    Comment


    • #3
      Hallo,

      das folgende Beispielprojekt demonstriert, wie man einen Farbverlauf sowie eine eigene Zeichenausgabe in der Fensterzeile hinbekommt:
      <pre>
      { ************************************************** **************
      Source File Name : Office95CaptionForm.pas
      Typ : Formular-Unit
      Autor : Andreas Kosch
      Erstellt am : 20.12.1997
      Compiler : Delphi 3.02
      Betriebssystem : Windows 95
      Beschreibung : Fenstertitelzeile mit blauem Farbverlauf im
      Stil von Microsoft Office 95
      Revisionen :
      ************************************************** ************** }

      unit Office95CaptionForm;

      interface

      uses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls, ExtCtrls, Buttons;

      type
      TFormMain = class(TForm)
      BitBtn1: TBitBtn;
      LabelFont: TLabel;
      Label1: TLabel;
      BitBtn2: TBitBtn;
      ColorDialog1: TColorDialog;
      procedure BitBtn1Click(Sender: TObject);
      procedure BitBtn2Click(Sender: TObject);
      private
      { Private-Deklarationen }
      procedure WMNCPaint(var Msg : TMessage);
      message WM_NCPAINT;
      procedure WMNCActivate(var Msg: TMessage);
      message WM_NCActivate;
      public
      { Public-Deklarationen }
      end;

      var
      FormMain: TFormMain;

      implementation

      {$R *.DFM}

      procedure Office95Caption(DC: hDc; x, y: Integer;
      Width, Height: Integer);
      const
      cBlueStart = 100; // sehr dunkles Blau
      cBlueEnd = 255; // helles Blau
      var
      iCnt : Integer;
      hOldBrush : hBrush;
      iBlue : Integer;
      begin
      for iCnt := 0 to Width do begin
      // Farbton für die aktuelle Pixelposition berechnen
      iBlue := MulDiv((x+iCnt), 100, cBlueEnd - cBlueStart);
      // Pinsel mit diesem Farbton erzeugen und aktivieren
      hOldBrush := SelectObject(DC, CreateSolidBrush(Rgb(0, 0, iBlue)));
      // Rechteck mit einer Breite von 1 Pixel ausfüllen
      PatBlt(Dc, x + iCnt, y, 1, Height, PatCopy);
      // Pinsel abwählen und zerstören
      DeleteObject(SelectObject(DC, hOldBrush));
      end;
      end;

      (* Statuswechsel der Fenstertitelzeile: Entweder erhält oder
      verliert das Fenster den Fokus -> die Fensterzeile muß
      neu dargestellt werden. *)

      procedure TFormMain.WMNCActivate(var Msg: TMessage);
      begin
      inherited;
      WMNCPaint(Msg);
      end;

      (* Aussehen der Fenstertitelzeile festlegen *)

      procedure TFormMain.WMNCPaint(var msg : TMessage);
      var
      hWinDC : HDC;
      x, y : integer;
      aCanvas : TCanvas;
      begin
      inherited;
      // Einen "DC" (Canvas-Gegenstück von Windows) vom Fenster holen
      hWinDC := Windows.GetWindowDC(Handle);
      try
      x := GetSystemMetrics(SM_CXFRAME);
      y := GetSystemMetrics(SM_CYFRAME);
      // Regenbogenverlauf in die Fensterzeile malen
      Office95Caption(hWinDC, x, y,
      Width - (2 * x) - GetSystemMetrics(SM_CXSIZE),
      GetSystemMetrics(SM_CYCAPTION) - y);
      // eigene Fensterzeilenbeschriftung
      aCanvas := TCanvas.Create;
      try
      with aCanvas do begin
      Handle := hWinDC;
      Font := LabelFont.Font;
      SetBkMode(Handle, TRANSPARENT);
      TextOut(8,3, FormMain.Caption);
      Handle := 0;
      end;
      finally
      aCanvas.Free;
      end;
      finally
      // Wichtig! DC auf jeden Fall wieder zurückgeben
      Windows.ReleaseDC(Handle, hWinDC);
      end;
      end;

      procedure TFormMain.BitBtn1Click(Sender: TObject);
      begin
      Close
      end;

      procedure TFormMain.BitBtn2Click(Sender: TObject);
      begin
      ColorDialog1.Execute
      end;

      end.
      </pre>
      Das vollständige Beispielprojekt sowie die Beschreibung dazu ist in meinem Buch <i>Delphi Win32-Lösungen</i> zu finden

      Comment


      • #4
        Hi Andreas

        Das reicht bei weitem nicht. Was ist mit den Button und dem SystemMenu Icon, oder Messages wie wm_SetText, wm_MouseActivate, wm_SetIcon. In all solchen Messages pixel't windows in der Titelzeile rum. Sollte das Form ein MDI Frame Form werden gibts dann noch mehr zu tun, weil nun das ganze Menusystem und alle Sub-Fenster mit eine Rolle spielen.

        Mein TFormTitleLink http://www.entwickler-forum.de\webx?50@@.ee849d0 umgeht all diese Probleme indem es einfach nur einen transparenten Text "drüber" zeichnet. In unserem Frame hatten wir auch solche Farbverläufe drinnen, mittlerweile wieder deaktiviert, weill man die Seiteneffekte nicht in den Griff bekommt.

        Gruß Hage

        Comment


        • #5
          Hallo Hagen,

          aus gutem Grund hat auch MS den Farbverlauf ins Betriebssystem integriert. Ich kann mich jetzt nur mit der Ausrede aus der Affäre ziehen, dass sehr lange Listings hier im Forum nicht auf eine Antwortseite passen ;-

          Comment


          • #6
            Erst einmal Danke für Eure Hilfe. Ich werd das gleich mal ausprobieren. Und melde mich bei Fragen einfach nochmal

            Comment


            • #7
              Herr Kosch - Ihre Version funktioniert nur bedingt, aber ich werde noch ein bißchen basteln, damit das funktioniert (Für den kompletten code wäre ich aber auch Dankbar :-) ...)

              Herr Reddmann - Ihre Komponente ist sehr gut, aber ich kann damit nicht die Farbe ändern

              Comment


              • #8
                Hi

                Aus gutem Grund, da das Füllen des Hintergrundes eben nicht so einfach ist. Das häufigste Problem beim eigenen Zeichnen des Hintergrundes ist das unter vielen Umständen das Windows System bestimmte Bereiche wie die Buttons oder SystemMenu oder FensterMenu auch der Hintergrund neu gezeichnet wird. Leider gibt es dafür keine Regeln, d.h. Windows zeichnet einfach wann es ihm passt. Resultat davon ist das Teile der Caption in Deinem Hintergrund erscheinen und andere Teile im Windows-Standard Hintergrund. Erschwerend kommt dazu das genau in diesem Punkt sich ALLE Windows Versionen unterscheiden.

                Mein Fazit: entweder so wie im TFormTitleLink oder ganz darauf verzichten. Bringt nur Arbeit für Nichts.

                Gruß Hage

                Comment

                Working...
                X