Difference between revisions of "Theme library"
From Lazarus wiki
Jump to navigationJump to searchPaul Ishenin (talk | contribs) |
(→How to use ThemeServices class for painting?: Use pascal highlighter) |
||
(17 intermediate revisions by 6 users not shown) | |||
Line 1: | Line 1: | ||
− | == What is Theme manager? == | + | == What is a Theme manager? == |
− | Theme manager | + | The Theme manager was originally created by Mike Lischke (see http://www.soft-gems.net/) to enable Windows XP theme painting in Borland Delphi and Borland C++ Builder applications. |
− | == Why do we need Theme manager? == | + | == Why do we need a Theme manager? == |
It gives the ability to have ownerdraw controls with the same look and feel as native controls. | It gives the ability to have ownerdraw controls with the same look and feel as native controls. | ||
Line 10: | Line 10: | ||
# TCustomSpeedButton descendants (TSpeedButton) | # TCustomSpeedButton descendants (TSpeedButton) | ||
+ | # TCustomSplitter descendants (TSplitter) | ||
# TCustomGrid descendants (TStringGrid, TDBGrid) | # TCustomGrid descendants (TStringGrid, TDBGrid) | ||
+ | # TCustomUpDown descendants (TUpDown) | ||
+ | # ... | ||
== What is the current state of implementation? == | == What is the current state of implementation? == | ||
− | + | '''Windows XP and Vista applications with manifest''' - fully implemented since theme manager originally created for Windows XP. | |
− | |||
− | |||
− | |||
− | |||
− | --[[User:Paul Ishenin|Paul Ishenin]] | + | {| class="wikitable" |
+ | ! Element !! default !! gtk !! gtk2 !! carbon !! qt !! Used in components | ||
+ | |---- | ||
+ | |teButton||class="partial"|Partially Implemented||class="partial"|Partially Implemented||class="partial"|Partially Implemented||class="partial"|Partially Implemented||class="partial"|Partially Implemented||TSpeedButton | ||
+ | |---- | ||
+ | |teHeader||class="partial"|Partially Implemented||class="partial"|Partially Implemented||class="partial"|Partially Implemented||class="not"|Not Implemented||class="partial"|Partially Implemented||TCustomGrid | ||
+ | |---- | ||
+ | |teRebar||class="partial"|Partially Implemented||class="partial"|Partially Implemented||class="partial"|Partially Implemented||class="partial"|Partially Implemented||class="not"|Not Implemented||TSplitter | ||
+ | |---- | ||
+ | |teToolBar||class="partial"|Partially Implemented||class="partial"|Partially Implemented||class="partial"|Partially Implemented||class="partial"|Partially Implemented||class="partial"|Partially Implemented||TSpeedButton | ||
+ | |} | ||
+ | |||
+ | == How to use ThemeServices class for painting? == | ||
+ | |||
+ | Simply proceed as follows. Create an empty form and paint a push button on it with normal state. | ||
+ | |||
+ | <syntaxhighlight lang=pascal> | ||
+ | unit Unit1; | ||
+ | {$mode objfpc}{$H+} | ||
+ | |||
+ | interface | ||
+ | uses | ||
+ | Classes, SysUtils, LResources, Forms, Controls, Graphics; | ||
+ | |||
+ | type | ||
+ | TForm1 = class(TForm) | ||
+ | private | ||
+ | { private declarations } | ||
+ | public | ||
+ | procedure Paint; override; | ||
+ | end; | ||
+ | |||
+ | var | ||
+ | Form1: TForm1; | ||
+ | |||
+ | implementation | ||
+ | {$R manifest.res} | ||
+ | |||
+ | uses | ||
+ | LCLType, Themes; | ||
+ | |||
+ | procedure TForm1.Paint; | ||
+ | var | ||
+ | Details: TThemedElementDetails; | ||
+ | PaintRect: TRect; | ||
+ | begin | ||
+ | inherited Paint; | ||
+ | PaintRect := Rect(10, 10, 80, 50); | ||
+ | Details := ThemeServices.GetElementDetails(tbPushButtonNormal); | ||
+ | ThemeServices.DrawElement(Canvas.Handle, Details, PaintRect, nil); | ||
+ | PaintRect := ThemeServices.ContentRect(Canvas.Handle, Details, PaintRect); | ||
+ | ThemeServices.DrawText(Canvas, Details, 'Test caption', PaintRect, | ||
+ | DT_CENTER or DT_VCENTER or DT_SINGLELINE, 0); | ||
+ | end; | ||
+ | |||
+ | initialization | ||
+ | {$I unit1.lrs} | ||
+ | end. | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | And the result will look so: | ||
+ | |||
+ | [[Image:theme_painting.png]] | ||
+ | |||
+ | --[[User:Paul Ishenin|Paul Ishenin]] 20:31, 9 June 2007 (CEST) | ||
+ | |||
+ | [[Category:Libraries]] |
Latest revision as of 17:11, 29 January 2020
What is a Theme manager?
The Theme manager was originally created by Mike Lischke (see http://www.soft-gems.net/) to enable Windows XP theme painting in Borland Delphi and Borland C++ Builder applications.
Why do we need a Theme manager?
It gives the ability to have ownerdraw controls with the same look and feel as native controls.
What ownerdraw controls do we have?
- TCustomSpeedButton descendants (TSpeedButton)
- TCustomSplitter descendants (TSplitter)
- TCustomGrid descendants (TStringGrid, TDBGrid)
- TCustomUpDown descendants (TUpDown)
- ...
What is the current state of implementation?
Windows XP and Vista applications with manifest - fully implemented since theme manager originally created for Windows XP.
Element | default | gtk | gtk2 | carbon | qt | Used in components |
---|---|---|---|---|---|---|
teButton | Partially Implemented | Partially Implemented | Partially Implemented | Partially Implemented | Partially Implemented | TSpeedButton |
teHeader | Partially Implemented | Partially Implemented | Partially Implemented | Not Implemented | Partially Implemented | TCustomGrid |
teRebar | Partially Implemented | Partially Implemented | Partially Implemented | Partially Implemented | Not Implemented | TSplitter |
teToolBar | Partially Implemented | Partially Implemented | Partially Implemented | Partially Implemented | Partially Implemented | TSpeedButton |
How to use ThemeServices class for painting?
Simply proceed as follows. Create an empty form and paint a push button on it with normal state.
unit Unit1;
{$mode objfpc}{$H+}
interface
uses
Classes, SysUtils, LResources, Forms, Controls, Graphics;
type
TForm1 = class(TForm)
private
{ private declarations }
public
procedure Paint; override;
end;
var
Form1: TForm1;
implementation
{$R manifest.res}
uses
LCLType, Themes;
procedure TForm1.Paint;
var
Details: TThemedElementDetails;
PaintRect: TRect;
begin
inherited Paint;
PaintRect := Rect(10, 10, 80, 50);
Details := ThemeServices.GetElementDetails(tbPushButtonNormal);
ThemeServices.DrawElement(Canvas.Handle, Details, PaintRect, nil);
PaintRect := ThemeServices.ContentRect(Canvas.Handle, Details, PaintRect);
ThemeServices.DrawText(Canvas, Details, 'Test caption', PaintRect,
DT_CENTER or DT_VCENTER or DT_SINGLELINE, 0);
end;
initialization
{$I unit1.lrs}
end.
And the result will look so:
--Paul Ishenin 20:31, 9 June 2007 (CEST)