Živě.cz o počítačích a internetu

Tipy a triky v Delphi, díl 64. - Bublinková nápověda - hinty

Jan Šindelář - 30.10.2002

Bublinková nápověda - hinty

Windows XP nám kromě nových funkcí přinášejí řadu novinek uživatelského prostředí. Kromě "skinů", vyhlazování fontů a různých dalších efektů, týkajících se všech možných prvků prostředí, jsme si minule ukazovali i nové balónové hinty. Jestli jsou všechny tyto efekty přínosem, to je věc názoru. První věcí, kterou velká část uživatelů udělá, je to, že tyto efekty prostě vypne. Toto je ovšem téma na úplně jiný článek, i když budu rád, pokud svůj názor vyjádříte v diskusi pod článkem. Vraťme se však k Delphi. I dnes si budeme povídat o hintech, tedy o bublinkové nápovědě, ale tentokrát té klasické, kterou obsahují (či mohou obsahovat) již od pradávna všechny (tedy téměř) prvky uživatelského prostředí systému.

I u tohoto poměrně jednoduchého prvku nám Windows XP přinášejí rovněž vylepšení vzhledu. Pokud ji do svých programů zapracujete a necháte aktivované příslušné volby vzhledu v samotném systému, budou pak vypadat hinty o malý chloupek lépe než dosud. Změna spočívá v přidání poměrně efektního, i když možná na první pohled snadno přehlédnutelného, stínu k samotnému popisku. Tím vypadá nápověda ještě o něco lépe a vyvolává mnohem plastičtější dojem.

Všechno zařídí tento kratičký kousek kódu:

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TXPHintWindow = class(THintWindow)
  protected
    procedure CreateParams(var Params: TCreateParams); override;
    procedure WMNCPaint(var msg: TMessage); message WM_NCPAINT;
  end;


var
  Form1: TForm1;

implementation

{$R *.dfm}

function IsWinXP: Boolean;
begin
  Result := (Win32Platform = VER_PLATFORM_WIN32_NT) and (Win32MajorVersion >= 5) and (Win32MinorVersion >= 1);
end;

procedure TXPHintWindow.CreateParams(var Params: TCreateParams);
const
  CS_DROPSHADOW = $00020000;
begin
  inherited;
  if IsWinXP then Params.WindowClass.Style := Params.WindowClass.Style or CS_DROPSHADOW;
end;

procedure TXPHintWindow.WMNCPaint(var msg: TMessage);
var
  R: TRect;
  DC: HDC;
begin
  DC := GetWindowDC(Handle);
  try
    R := Rect(0, 0, Width, Height);
    DrawEdge(DC, R, EDGE_ETCHED, BF_RECT or BF_MONO);
  finally
    ReleaseDC(Handle, DC);
  end;
end;

initialization
  HintWindowClass := TXPHintWindow;
  Application.ShowHint := False;
  Application.ShowHint := True;

end.

Stejně jako u příkladů z minulých dílů se nemusíte obávat nekompatibility ve starších systémech než jsou Windows XP. Hint bude bez problému zobrazen, i když "pouze" standardním způsobem bez vystínování.

A to je pro dnešek vše. Příště si zřejmě povíme prozatím poslední tip k Windows XP, který se bude týkat hlavního menu aplikace, čímž naší minisérii ukončíme.