Pokud použijete VCL styly z Delphi XE2 a TRibbon control (resp. to asi souvisí s Glass window na Vista+) zjistíte několik problémů ohledně kreslení. Naštěstí existuje možnost jak upravit kreslení libovolného prvku a tak jsem tuto možnost využil a sprostě jsem kreslení obešel.
Problém je s kreslením NC oblasti (non control nebo jak se tomu říká - prostě okraje okna). Pokud použijete styly tak je okraj okna kreslen stylem a ne Windows, což je problém. Asi bude stejný problém i s Glass okny a pravděpodobně stejné řešení to vyřeší.

Základem stylů je třída TStyleHook z jednotky Vcl.Themes a jedním z následníků je i TFormStyleHook. Už v základní třídě je property OverridePaintNC, případně metoda PaintNC(Canvas: TCanvas) zodpovědná za kreslení na NC plochu.
Takže malá třída:
unit uPatch;
interface
uses
VCL.Graphics, VCl.Controls, Vcl.Forms;
type
TMyStyleHookClass= class(TFormStyleHook)
protected
procedure PaintNC(Canvas: TCanvas); override;
end;
implementation
procedure TMyStyleHookClass.PaintNC(Canvas: TCanvas);
begin
OverridePaintNC := False;
end;
end.
V metodě PaintNC shodím OverridePaintNC (zkoušel jsem i předefinovat constructor, ale někdo mi to nahazoval zpátky, tohle je tutovka).
Poznámka: volání ve VCL je takto (proto ten černý pruh):
procedure TStyleHook.WMNCPaint(var Message: TMessage);
var
Canvas: TCanvas;
begin
if FOverridePaintNC then
begin
Canvas := TCanvas.Create;
try
Canvas.Handle := GetWindowDC(Control.Handle);
PaintNC(Canvas);
finally
ReleaseDC(Handle, Canvas.Handle);
Canvas.Handle := 0;
Canvas.Free;
end;
Handled := True;
end;
end;
A nyní jen říct VCL, že má používat moji třídu a ne svoji:
TStyleManager.Engine.UnRegisterStyleHook(TCustomForm, TFormStyleHook);//unregister the original style hook
TStyleManager.Engine.RegisterStyleHook(TCustomForm, TMyStyleHookClass); //register the new style hook
Oprava: původně chybou vložení bylo TForm místo TCustomForm.
A to je vše. Takto můžete opravit nebo upravit libovolné kreslení.
Takže lze používat bez problémů ribbon a VCL styly (resp. má to vypadat normálně, ale screenshot to nějak upravil).
