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 ist nicht füllend (https://www.delphipraxis.net/82623-%5Bnonvcl%5D-hintergrundfarbe-ist-nicht-fuellend.html)

xZise 16. Dez 2006 15:46


[nonVCL] - Hintergrundfarbe ist nicht füllend
 
Ich habe den Code hierausgenommen um mein Static mit einer Vordergrundfarbe zu versehen... Dabei muss ich auch die Hintergrundfarbe setzen...:
http://www.delphipraxis.net/internal...ct.php?t=62645
Aber ich habe 2 Fragen:
1. Die Results funzen nicht (oder bin ich in der WndProc falsch?)... Fehler, weil er erwartet einen Integer bekommt aber einen Boolean
2. Meine Statics sind mittig... dummerweise malt er aber nur den wo Text ist, den Hintergrund mit der Systemfarbe...

Luckie 16. Dez 2006 15:53

Re: [nonVCL] - Hintergrundfarbe ist nicht füllend
 
Häng Projekt mit Code mal an.

xZise 16. Dez 2006 20:02

Re: [nonVCL] - Hintergrundfarbe ist nicht füllend
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hier ist der wichtige Code... Der restliche Code hat damit nichts zu tun.
Die "FileLink.res" befindet sich im Anhang, falls der Wunsch des Kompilieren besteht :P

Delphi-Quellcode:
program FileLink;

uses
  Windows, Messages, CommCtrl;

const
  btnInstall = 5;
  lblStatus = 3;
  lblStatusLabel = 4;

var
  hwndButton, hwndStatusLabel, hwndStatus : DWORD;

{$R FileLink.res}

function WndProc(hWnd: HWND; msg: UINT; wParam: wParam; lParam: LParam) : lresult; stdcall;
var
  font: HFONT;
begin
  result := 0;

  case msg of
    WM_CREATE : begin      

      hwndButton := CreateWindowEx(0, 'BUTTON', 'Installieren',
          WS_VISIBLE or WS_CHILD, 8, 46, 99, 25, hWnd, btnInstall, hInstance,
          nil);
      hwndStatusLabel := CreateWindowEx(0, 'STATIC', 'Status', SS_CENTER or WS_VISIBLE or WS_CHILD, 8, 8, 99, 13, hWnd, lblStatusLabel, HInstance, nil);
      hwndStatus := CreateWindowEx(0, 'STATIC', 'Nicht installiert', SS_CENTER or WS_VISIBLE or WS_CHILD, 8, 27, 99, 13, hWnd, lblStatus, HInstance, nil);

      font := CreateFont(-12, 0, 0, 0, 0, 0, 0, 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, DEFAULT_QUALITY,         DEFAULT_PITCH, 'MS Sans Serif');
      if font <> 0 then begin
        SendMessage(hwndStatus, WM_SETFONT, Integer(font), Integer(true));
        SendMessage(hwndStatusLabel, WM_SETFONT, Integer(font), Integer(true));
        SendMessage(hwndButton, WM_SETFONT, Integer(font), Integer(true));
      end;
    end;

    WM_CTLCOLORSTATIC:
      begin
        case GetDlgCtrlId(lParam) of
          lblStatus: begin
            SetTextColor(wParam, RGB(0,200,0))
            SetBkColor(wParam, GetSysColor(COLOR_3DFACE)); // Wenn ich die Funktion nicht ausführe, dann wird der ganze Hintergrund weiß
          end;
          else Result := DefWindowProc(hWnd, uMsg, wParam, lParam); // Notlösung, damit das 1. Label (hwndStatusLabel) verschont bleibt
        end;
      end;
    WM_DESTROY : PostQuitMessage(0);
    else result := DefWindowProc(hWnd, uMsg, wParam, lParam);
  end;
end;

var
  wc: TWndClassEx = (
    cbSize         : SizeOf(TWndClassEx);
    Style          : CS_HREDRAW or CS_VREDRAW;
    lpfnWndProc    : @WndProc;
    cbClsExtra     : 0;
    cbWndExtra     : 0;
    hbrBackground  : COLOR_APPWORKSPACE;
    lpszMenuName   : nil;
    lpszClassName  : ClassName;
    hIconSm        : 0;
  );
  icc : TInitCommonControlsEx = (
    dwSize : sizeof(TInitCommonControlsEx);
    dwICC : ICC_INTERNET_CLASSES;
  );
  msg: TMsg;

begin
    wc.hInstance := hInstance;
    wc.hIcon := LoadIcon(hInstance, MAKEINTRESOURCE(2));
    wc.hCursor := LoadCursor(0, IDC_ARROW);
    wc.hbrBackground := GetSysColorBrush(COLOR_3DFACE);

    InitCommonControlsEx(icc);

    RegisterClassEx(wc);

    CreateWindowEx(WS_EX_TOOLWINDOW or WS_EX_APPWINDOW, 'WndClass', 'FileLink', WS_CAPTION or WS_VISIBLE or WS_SYSMENU, CW_USEDEFAULT, CW_USEDEFAULT, 119, 103, 0, 0, hInstance, nil);

    while GetMessage(msg,0,0,0) do begin
      TranslateMessage(msg);
      DispatchMessage(msg);
    end;

    ExitCode := msg.wParam;
end.

Olli 17. Dez 2006 04:43

Re: [nonVCL] - Hintergrundfarbe ist nicht füllend
 
Schonmal die Dokumentation zu MSDN-Library durchsuchenWM_CTLCOLORSTATIC angeschaut? Im Großen und Ganzen wiedermal der Tip: RTFM - Read The ... Friendly Manual :mrgreen:

Zitat:

If an application processes this message, the return value is a handle to a brush that the system uses to paint the background of the static control.
Es gibt soviele Beispiele im großen weiten WWW, warum nicht einfach mal eins angucken? ;) Bsp: http://assarbad.net/stuff/portscan.zip

Ergo:

Delphi-Quellcode:
Result := GetSysColorBrush(COLOR_3DFACE);
Noch'n kleiner Tip: anders als in C/C++ ist RGB in Delphi eine Funktion. Daher frißt das Laufzeit. In C/C++ erzeugt der Präprozessor aus dem Makro nur eine Konstante.

Luckie 17. Dez 2006 10:54

Re: [nonVCL] - Hintergrundfarbe ist nicht füllend
 
In einer Dialog-Prozedur wird ein Boolean als Rückgabewert erwartet. Nur noch mal so zur Anmerkung.

xZise 17. Dez 2006 13:21

Re: [nonVCL] - Hintergrundfarbe ist nicht füllend
 
Okay, es funktioniert.

Eins zu "RGB()":
Wenn ich statt "RGB(0,255,0)" das ohne Funktion schreiben will, dann geht das mit "$0000FF00" oder?

[redBox]Aber dann meckert der Complier rum, dass Bool <> Integer ist. Und wenn du die Dialogprozedur meinst, dann meinst du doch "WndProc" oder?[/redBox]

Luckie 17. Dez 2006 13:24

Re: [nonVCL] - Hintergrundfarbe ist nicht füllend
 
Nein, ich rede von Dialogprozeduren, wie sie verwendet werden, wenn man mit Dialogressourcen arbeitet.

Olli 17. Dez 2006 14:36

Re: [nonVCL] - Hintergrundfarbe ist nicht füllend
 
Nee, der Luckie wollte dir nur sagen, daß wenn du statt einer Fensterfunktion eine Dialogfunktion benutzt (wo man bekanntlich FALSE statt DefWindowProc() zurückgibt), du das Ergebnis von GetSysColorBrush() in einen BOOL casten mußt. (Anmerkung: in deinem Code ist das irrelevant. Luckie hat es nur der Vollständigkeit halber erwähnt.)

Also so:
Delphi-Quellcode:
Result := BOOL(GetSysColorBrush(COLOR_3DFACE));
Nicht vergessen, wenn du eigene Brushes zurückgibst, mußt du sie auch wieder freigeben. Am besten erzeugt man sie deshalb in WM_INITDIALOG bzw. WM_CREATE.

BTW: Dialoge kann man auch im Speicher erzeugen ... Dialog-Ressourcen sind nicht zwingend erforderlich ;)

xZise 20. Dez 2006 19:51

Re: [nonVCL] - Hintergrundfarbe ist nicht füllend
 
Zitat:

Zitat von Olli
Nicht vergessen, wenn du eigene Brushes zurückgibst, mußt du sie auch wieder freigeben. Am besten erzeugt man sie deshalb in WM_INITDIALOG bzw. WM_CREATE.

Und wie kann ich sie Freigeben?

Olli 20. Dez 2006 19:57

Re: [nonVCL] - Hintergrundfarbe ist nicht füllend
 
Zitat:

Zitat von xZise
Zitat:

Zitat von Olli
Nicht vergessen, wenn du eigene Brushes zurückgibst, mußt du sie auch wieder freigeben. Am besten erzeugt man sie deshalb in WM_INITDIALOG bzw. WM_CREATE.

Und wie kann ich sie Freigeben?

Globale Variable benutzen oder die Handles als Window-Properties abspeichern. Da findest du mehrere Beispiele auf meiner Seite.


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:58 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