Autor Beitrag
Frühlingsrolle
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1853
Erhaltene Danke: 342

[Win NT] 5.1 x86 6.1 x64
[Delphi] 7 PE, 2006, 10.1 Starter, Lazarus - [C#] VS Exp 2012 - [Android API 15] VS Com 2015, Eclipse, AIDE - [C++] Builder 10.1
BeitragVerfasst: Fr 09.02.18 10:15 
Hallo Forum

Problemstellung:
Eine Komponente (von TCustomControl abgeleitet) zeichnet mit der Funktion DrawFrameControl(), je nach Auswahl, einen RadioButton oder eine CheckBox:

delphi_cr_style

Das Aussehen ist leider nicht "Win7-gerecht". Wie oder womit bekomm' ich den "passenden" Style für das jeweilige Betriebssystem hin? Mit dem XP-Manifest geht es schonmal nicht!


Nachtrag

Hab's doch noch über die WinAPI gelöst:
- OpenThemeData()
- CloseThemeData()
- DrawThemeBackground()
- Parts and States

ausblenden volle Höhe WinAPI Import
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
type
  HTHEME = THandle;

const
  { DrawThemeBackground() iPartId }
  BP_RADIOBUTTON = 2;
  BP_CHECKBOX = 3;
  { DrawThemeBackground() iStateId - CHECKBOX & RADIOBUTTON }
  STATE_ID_UNCHECKEDNORMAL = 1;
  STATE_ID_UNCHECKEDHOT = 2;
  STATE_ID_UNCHECKEDPRESSED = 3;
  STATE_ID_UNCHECKEDDISABLED = 4;
  STATE_ID_CHECKEDNORMAL = 5;
  STATE_ID_CHECKEDHOT = 6;
  STATE_ID_CHECKEDPRESSED = 7;
  STATE_ID_CHECKEDDISABLED = 8;
  STATE_ID_MIXEDNORMAL = 9;     // CHECKBOX only
  STATE_ID_MIXEDHOT = 10;       // CHECKBOX only
  STATE_ID_MIXEDPRESSED = 11;   // CHECKBOX only
  STATE_ID_MIXEDDISABLED = 12;  // CHECKBOX only

  UX_THEME = 'UxTheme.dll';

function OpenThemeData(hWnd: HWND; pszClassList: PWideChar): HTHEME; stdcall;
  external UX_THEME name 'OpenThemeData';

function CloseThemeData(hTheme: HTHEME): HRESULT; stdcall;
  external UX_THEME name 'CloseThemeData';

function DrawThemeBackground(hTheme: HTHEME; hdc: HDC;
  iPartId, iStateId: Integer; pRect, pClipRect: PRect): HRESULT; stdcall;
  external UX_THEME name 'DrawThemeBackground';

Der folgende Code ist ein wenig "statisch" ausgelegt, d.h. das Steuerelement ist permanent auf "Checked" gesetzt, um das Gezeichnete schneller zu testen:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
uses
  Classes, Controls, Windows, Graphics;

type
  TBoxType = (btCheck, btRadio);

  TfrCheckRadioControl = class(TCustomControl)
  private
    FBoxType: TBoxType;
    FHTheme: HTHEME;
  protected
    procedure Paint; override;
    procedure DrawBox(ASize: Word);
  public
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;
  published
    property BoxType: TBoxType read FBoxType write FBoxType;
  end;

implementation

constructor TfrCheckRadioControl.Create(AOwner: TComponent);
begin
  inherited;
  Parent := TWinControl(AOwner);
  // ...
  FHTheme := OpenThemeData(Handle, 'BUTTON');
end;

destructor TfrCheckRadioControl.Destroy;
begin
  // ...
  CloseThemeData(FHTheme);
  inherited;
end;

procedure TfrCheckRadioControl.Paint;
begin
  // ...
  DrawBox(12);
end;

procedure TfrCheckRadioControl.DrawBox(ASize: Word); // provisorisch
var
  r: TRect;
  box: DWord;
  partID, stateID: Integer;
begin
  r := Rect(03, ASize, ASize + 3);

  if FBoxType = btCheck then
  begin
    box := DFCS_BUTTONCHECK;
    partID := BP_CHECKBOX;
  end else
  begin
    box := DFCS_BUTTONRADIO;
    partID := BP_RADIOBUTTON;
  end;

  stateID := STATE_ID_CHECKEDNORMAL;

  DrawFrameControl(Canvas.Handle, r, DFC_BUTTON, box or DFCS_CHECKED);   // zeichnet permanent eine selektierte Box
  DrawThemeBackground(FHTheme, Canvas.Handle, partID, stateID, @r, nil); // zeichnet das neue Theme
end;

Zum Vergleich:

delphi_cr_style2


Das Thema hat sich erledigt !!!
Einloggen, um Attachments anzusehen!
_________________
„Politicians are put there to give you the idea that you have freedom of choice. You don’t. You have no choice. You have owners. They own you. They own everything." (George Denis Patrick Carlin)