![]() |
[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...:
![]() 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... |
Re: [nonVCL] - Hintergrundfarbe ist nicht füllend
Häng Projekt mit Code mal an.
|
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. |
Re: [nonVCL] - Hintergrundfarbe ist nicht füllend
Schonmal die Dokumentation zu
![]() Zitat:
![]() Ergo:
Delphi-Quellcode:
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.
Result := GetSysColorBrush(COLOR_3DFACE);
|
Re: [nonVCL] - Hintergrundfarbe ist nicht füllend
In einer Dialog-Prozedur wird ein Boolean als Rückgabewert erwartet. Nur noch mal so zur Anmerkung.
|
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] |
Re: [nonVCL] - Hintergrundfarbe ist nicht füllend
Nein, ich rede von Dialogprozeduren, wie sie verwendet werden, wenn man mit Dialogressourcen arbeitet.
|
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:
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.
Result := BOOL(GetSysColorBrush(COLOR_3DFACE));
BTW: Dialoge kann man auch im Speicher erzeugen ... Dialog-Ressourcen sind nicht zwingend erforderlich ;) |
Re: [nonVCL] - Hintergrundfarbe ist nicht füllend
Zitat:
|
Re: [nonVCL] - Hintergrundfarbe ist nicht füllend
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:36 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz