Delphi-PRAXiS
Seite 1 von 2  1 2      

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. ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:52 Uhr.
Seite 1 von 2  1 2      

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