Ribbon control a styly

vložil Radek Červinka 30. listopadu 2011 23:29

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ší.

TRibbon a styl

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).

TRibbon a styl


Nabízíme Delphi školení na různá témata, primárně ve Vaší firmě.

Tagy: , ,

Praxe

Komentáře

1.12.2011 17:29:29 #

daemon_x

Ony vůbec ty styly mají zatím nějaké mouchy ...

http://theroadtodelphi.wordpress.com/2011/11/28/fixing-a-vcl-style-bug-in-the-tpagecontrol-and-ttabcontrol-components/

daemon_x

Komentování ukončeno

Naše nabídka

Partial English version.

MVP
Ing. Radek Červinka - Embarcadero MVP
profil na linkedin, Twitter:@delphicz

Nabízím placené poradenství a konzultace v oblasti programování a vývoje SW.
Dále nabízíme i vývoj speciálního software na zakázku.

Neváhejte nás kontaktovat (i ohledně reklamy nebo burzy práce).

Pokud chcete podpořit tento server libovolnou částkou, můžete použít PayPal. Moc děkuji.

Delphi Certified Developer

O Delphi.cz

Delphi je jediný moderní RAD nástroj podporující tvorbu nativních aplikací pro platformu Win32, Win64 , Mac OSX a na iPhone a Android (s výhledem na další platformy díky FireMonkey) na současném trhu (včetně Windows 8.1).

V současnosti je světová komunita přes dva miliónů vývojářů.

Delphi.cz je nezávislý portál pro uživatele Delphi. Portál není koncipován pro úplné začátečníky, i když i ti se zde nebudou nudit, ale spíše na programátory, kteří již něco znají a chtějí své znalosti dále rozvíjet a sledovat novinky.

Anketa

Poslední komentáře

Comment RSS