AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi [nonVCL] - Hintergrundfarbe ist nicht füllend
Thema durchsuchen
Ansicht
Themen-Optionen

[nonVCL] - Hintergrundfarbe ist nicht füllend

Ein Thema von xZise · begonnen am 16. Dez 2006 · letzter Beitrag vom 20. Dez 2006
Antwort Antwort
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#1

[nonVCL] - Hintergrundfarbe ist nicht füllend

  Alt 16. Dez 2006, 15:46
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...
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#2

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

  Alt 16. Dez 2006, 15:53
Häng Projekt mit Code mal an.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#3

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

  Alt 16. Dez 2006, 20:02
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

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.
Angehängte Dateien
Dateityp: txt filelink.res_991.txt (2,8 KB, 9x aufgerufen)
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#4

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

  Alt 17. Dez 2006, 04:43
Schonmal die Dokumentation zu MSDN-Library durchsuchenWM_CTLCOLORSTATIC angeschaut? Im Großen und Ganzen wiedermal der Tip: RTFM - Read The ... Friendly Manual

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:

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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

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

  Alt 17. Dez 2006, 10:54
In einer Dialog-Prozedur wird ein Boolean als Rückgabewert erwartet. Nur noch mal so zur Anmerkung.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#6

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

  Alt 17. Dez 2006, 13:21
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]
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

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

  Alt 17. Dez 2006, 13:24
Nein, ich rede von Dialogprozeduren, wie sie verwendet werden, wenn man mit Dialogressourcen arbeitet.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#8

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

  Alt 17. Dez 2006, 14:36
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:
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
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

Registriert seit: 3. Mär 2006
Ort: Waldbronn
4.303 Beiträge
 
Delphi 2009 Professional
 
#9

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

  Alt 20. Dez 2006, 19:51
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?
Fabian
Eigentlich hat MS Windows ab Vista den Hang zur Selbstzerstörung abgewöhnt – mkinzler
  Mit Zitat antworten Zitat
Olli
(Gast)

n/a Beiträge
 
#10

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

  Alt 20. Dez 2006, 19:57
Zitat von xZise:
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.
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:03 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