Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi NonVCL - Hintergrundfarbe eines "Labels" ändern (https://www.delphipraxis.net/52618-nonvcl-hintergrundfarbe-eines-labels-aendern.html)

turboPASCAL 31. Aug 2005 15:12


NonVCL - Hintergrundfarbe eines "Labels" ändern
 
Hi,

Bin gerade dabei ein bissel mit SetLayeredWindowAttributes und NonVCL zu spielen wass auch gut funktioniert, was ich gern wissen möchte ist wie man bei einem Static Text die Hintergrundfarbe ändern kann.

Delphi-Quellcode:
SendMessage(GetDlgItem(hwnd, edt_Edit), PBM_SETBKCOLOR, 0, RGB(255,0,0) {clWindowText});
So will es nicht. Jemand 'ne Idee ?

Flocke 31. Aug 2005 15:22

Re: NonVCL - Hintergrundfarbe eines "Labels" ände
 
Normalerweise schickt ein Static-Control eine WM_CTLCOLOR Meldung an das Vaterfenster. Dort musst du die abfangen und verarbeiten (dabei gibst du einen HBrush und eine Farbe zurück).

turboPASCAL 31. Aug 2005 16:13

Re: NonVCL - Hintergrundfarbe eines "Labels" ände
 
Hm, hilft mir jetzt nicht wirklich weiter, ich wies nicht wie das zu realisieren ist.
Muss ich da jetzt die WM_PAINT des Controls abfangen/überschreiben ?

Olli 31. Aug 2005 19:49

Re: NonVCL - Hintergrundfarbe eines "Labels" ände
 
Leider hat Flocke wohl ein veraltetes PSDK. Jedenfalls gibt es keine einheitliche Nachricht mehr, sondern vielmehr eine pro Control-Typ. Für Static lautet sie WM_CTLCOLORSTATIC. Diese mußt du abfangen und bearbeiten, wobei du aus dem Fensterhandle in lParam mit MSDN-Library durchsuchenGetDlgCtrlID die ID des Controls herausbekommst um die Nachricht eben nur für bestimmte Controls zu "überschreiben".

Als Rückgabewert nimmst du den Brush mit der Hintergrundfüllung. Ansonsten wParam als DC benutzen und mit MSDN-Library durchsuchenSetTextColor, MSDN-Library durchsuchenSetBkColor und MSDN-Library durchsuchenSetBkMode.

turboPASCAL 1. Sep 2005 13:07

Re: NonVCL - Hintergrundfarbe eines "Labels" ände
 
Hm... also ungefähr so wie du es in deinem absolut veraltetem und nicht mehr zu gebrauchenden sondern eher das von Luckie zu benutzendem Tutorial mit dem/der HyperlinkWndProc gemacht hast. :zwinker:

thx euch beiden.

Luckie 1. Sep 2005 13:27

Re: NonVCL - Hintergrundfarbe eines "Labels" ände
 
Aus meiner Dialogvorlage:
Delphi-Quellcode:
  whitebrush            : HBRUSH = 0;

  WhiteLB               : TLogBrush =
    (
    lbStyle: BS_SOLID;
    lbColor: $00FFFFFF;
    lbHatch: 0
    );
Delphi-Quellcode:
    WM_CTLCOLORSTATIC:
      begin
        case GetDlgCtrlId(lParam) of
          IDC_STC_BANNER: { color the banner white }
            begin
              whitebrush := CreateBrushIndirect(WhiteLB);
              SetBkColor(wParam, WhiteLB.lbColor);
              result := BOOL(whitebrush);
            end;
        else
          Result := False;
        end;
      end;

turboPASCAL 1. Sep 2005 13:42

Re: NonVCL - Hintergrundfarbe eines "Labels" ände
 
Zitat:

Zitat von Luckie
Aus meiner Dialogvorlage

Sollte ich das übersehen haben ? :gruebel: Danke. :cheers:

Flocke 1. Sep 2005 13:50

Re: NonVCL - Hintergrundfarbe eines "Labels" ände
 
Zitat:

Zitat von Olli
Leider hat Flocke wohl ein veraltetes PSDK.

Ja, das in meinem Kopf 8)
Sorry dafür (aber eine Suche nach WM_CTLCOLOR hätte ihm Aufklärung gebracht).

Zitat:

Zitat von Luckie
Delphi-Quellcode:
WM_CTLCOLORSTATIC:
      begin
        case GetDlgCtrlId(lParam) of
          IDC_STC_BANNER: { color the banner white }
            begin
              whitebrush := CreateBrushIndirect(WhiteLB);
              SetBkColor(wParam, WhiteLB.lbColor);
              result := BOOL(whitebrush);
            end;
        else
          Result := False;
        end;
      end;

Gibt das kein Ressourcen-Leck? Du erzeugst doch jedes Mal einen HBRUSH.
Zitat:

Zitat von MSDN
The system does not automatically destroy the returned brush. It is the application's responsibility to destroy the brush when it is no longer needed.


NicoDE 1. Sep 2005 14:06

Re: NonVCL - Hintergrundfarbe eines "Labels" ände
 
Er hätte auch einen System-Brush verwenden können (z.B.: GetStockObject(NULL_BRUSH)).

Luckie 1. Sep 2005 14:59

Re: NonVCL - Hintergrundfarbe eines "Labels" ände
 
Zitat:

Zitat von Flocke
Gibt das kein Ressourcen-Leck? Du erzeugst doch jedes Mal einen HBRUSH.
Zitat:

Zitat von MSDN
The system does not automatically destroy the returned brush. It is the application's responsibility to destroy the brush when it is no longer needed.


An welcher Stelle sollte ich ihn denn wieder zerstören? Ich kenne die Stelle aus dem PSDK, nur wüßte ich nicht, wo ich ihn wieder zerstören sollte. :gruebel:

@Nico: Der Brush ist aber nicht weiß. Aber der ist es: WHITE_BRUSH. Gute Idee, wieder Ressourcen gespart. ;)

Flocke 1. Sep 2005 15:09

Re: NonVCL - Hintergrundfarbe eines "Labels" ände
 
Zitat:

Zitat von Luckie
An welcher Stelle sollte ich ihn denn wieder zerstören? Ich kenne die Stelle aus dem PSDK, nur wüßte ich nicht, wo ich ihn wieder zerstören sollte. :gruebel:

Also ich hab' dafür immer eine globale Variable genommen (so wie du auch, glaube ich), ganz am Anfang (oder bei der ersten Benutzung) einmal den HBRUSH erzeugt und beim Programmende wieder freigegeben. Ein Stock-Brush ist aber natürlich auch gut (sofern einer genau die Farbe trifft, die du haben willst).

Luckie 1. Sep 2005 15:29

Re: NonVCL - Hintergrundfarbe eines "Labels" ände
 
Ja hatte ich auch erst, aber am Ende ist es sowieso für den Popo. So bald der Prozess beendet wird, zerstört Windows auch den Speicherbereich und von dem Prozess ist nichts mehr im Speicher.

Jetzt sieht das bei mir so aus:
Delphi-Quellcode:
    WM_CTLCOLORSTATIC:
      begin
        case GetDlgCtrlId(lParam) of
          IDC_STC_BANNER: { color the banner white }
            begin
              result := BOOL(GetStockObject(WHITE_BRUSH));
            end;
        else
          Result := False;
        end;
      end;

Flocke 1. Sep 2005 15:39

Re: NonVCL - Hintergrundfarbe eines "Labels" ände
 
Zitat:

Zitat von Luckie
Ja hatte ich auch erst, aber am Ende ist es sowieso für den Popo. So bald der Prozess beendet wird, zerstört Windows auch den Speicherbereich und von dem Prozess ist nichts mehr im Speicher.

Bist du sicher, dass das auch für GDI-Handles gilt? Ich dachte bisher immer, die würden beim Prozessende nicht automatisch freigegeben. :gruebel:

Luckie 1. Sep 2005 15:43

Re: NonVCL - Hintergrundfarbe eines "Labels" ände
 
Der Richter sagt dazu nichts explizit, deswegen bin ich davon ausgegenagen, dass dies auch für GDI Handles gilt.

turboPASCAL 1. Sep 2005 16:02

Re: NonVCL - Hintergrundfarbe eines "Labels" ände
 
Liste der Anhänge anzeigen (Anzahl: 1)
:gruebel: Was hab ich da nur wieder für ein Thema angesprochen ? :zwinker:

Was spricht gegen:
Delphi-Quellcode:
WM_CTLCOLORSTATIC:
      begin
        case GetDlgCtrlId(lParam) of
          Edit5ID_RandomText: { Farbe des Editfeldes aendern }
            begin
              SetTextColor(wParam, clBlue);
              SetBkColor(wParam, clWhite);
            end;
          else Result := False;
        end;
      end;
...und wie kann man die Farbe zB. clBtnFace setzen (Ähm... ohne die Unit Graphics die Systemfarben setzen)

Zitat:

Zitat von Luckie
Delphi-Quellcode:
//..
case GetDlgCtrlId(lParam) of
  IDC_STC_BANNER: { color the banner white }
    begin
      result := BOOL(GetStockObject(DKGRAY_BRUSH {WHITE_BRUSH}));
    end;
  else //...

dann wird es bei mir so:

Flocke 1. Sep 2005 16:05

Re: NonVCL - Hintergrundfarbe eines "Labels" ände
 
Zitat:

Zitat von turboPASCAL
Edit5ID_RandomText: { Farbe des Editfeldes aendern }

Wenn das ein Edit-Feld ist, dann musst du MSDN-Library durchsuchenWM_CTLCOLOREDIT abfangen - es gibt für jede Control-Klasse eine eigene Meldung.

turboPASCAL 1. Sep 2005 16:35

Re: NonVCL - Hintergrundfarbe eines "Labels" ände
 
:gruebel: Äh...
Zitat:

Zitat von turboPASCAL
Edit5ID_RandomText: { Farbe des Editfeldes aendern }

Ne, Edit5ID_RandomText ist ein Textfeld (Copy&Paste Fehler :drunken: )

Was mich nun noch interesiert ist, wie man auf die Systemfarben ala clHighlight oder so zugreifen kann.
Die Systemfarben sind ja in der Unit Graphics def.
Delphi-Quellcode:
const
  clRed      = $000000FF;
  clGreen    = $0000FF00;
  clBtnFace  = ?
  clHighlight = ?

Olli 1. Sep 2005 16:49

Re: NonVCL - Hintergrundfarbe eines "Labels" ände
 
Zitat:

Zitat von Luckie
An welcher Stelle sollte ich ihn denn wieder zerstören? Ich kenne die Stelle aus dem PSDK, nur wüßte ich nicht, wo ich ihn wieder zerstören sollte. :gruebel:

Guckst du mal in meine Programme. Ich speicher die Brushes als Property des jeweiligen Fensters ab.

Zitat:

Zitat von Luckie
Der Richter sagt dazu nichts explizit, deswegen bin ich davon ausgegenagen, dass dies auch für GDI Handles gilt.

Sollte aber so sein.

@turbo: Wenn du ein readonly-EDIT hast, dann mußt du übrigens auch diese Nachricht verwenden (also WM_CTLCOLORSTATIC), wenn es read/write ist, nimmste die entsprechende (also WM_CTLCOLOREDIT).

Olli 1. Sep 2005 16:50

Re: NonVCL - Hintergrundfarbe eines "Labels" ände
 
Zitat:

Zitat von turboPASCAL
Die Systemfarben sind ja in der Unit Graphics def.
Delphi-Quellcode:
const
  clRed      = $000000FF;
  clGreen    = $0000FF00;
  clBtnFace  = ?
  clHighlight = ?

MSDN-Library durchsuchenGetSysColor und MSDN-Library durchsuchenGetSysColorBrush

turboPASCAL 1. Sep 2005 16:56

Re: NonVCL - Hintergrundfarbe eines "Labels" ände
 
Zitat:

Zitat von Olli

Ja, natürlich :wall: , so jetzt hab ich mich genug blamiert. :wink: THX.


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:55 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz