Hinty - formatowanie zawartości

0

Witam.

Próbuję zmienić wygląd hinta.

W sieci znalazłem dwa sposoby:
1.

unit Unit1;

interface

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

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

type
  TExHint = class(THintWindow)
  constructor Create(AOwner: TComponent); override;
end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

constructor TExHint.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  with Canvas.Font do
  begin
    Name  := 'Verdana';
    Size  := Size + 15;
    Style := [fsBold, fsItalic];
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  HintWindowClass  := TExHint;
end;

end. 

Hint jest co prawda większy ale czcionka zostaje bez zmian :
1.jpg

oraz drugi, prostszy sposób:
w FormCreate(Sender: TObject) głownej formy dodać:

 Application.hinthidepause:=0;
     Application.HintColor:=clYellow;
     Screen.HintFont.Name:='times new roman';
     Screen.HintFont.Color:=clBlue;
     Screen.HintFont.Style:=[fsbold,fsitalic];
     Screen.HintFont.Size:=30;
   

tło zmienia się zgodnie z oczekiwaniami lecz czcionka znów bez zmian...

2.jpg

Testowałem pod Windows 8.

Jak w takim razie zmienić tą czcionkę ?

Z góry dziękuję za pomoc.

0

@furious programming dziękuje Ci za odpowiedź.
W źródle które podałeś jest to co napisałem w punkcie pierwszym, dodane jest jedynie

   Application.ShowHint := False;
  Application.ShowHint := True;

jednak to nie naprawia problemu...

3
constructor TExHint.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  with Font do // bo Canvas.Font - może się cofnąć przy najbliższym rysowaniu
  begin
    Name  := 'Verdana';
    Size  := Size + 15;
    Style := [fsBold, fsItalic];
  end;
end;
0

@_13th_Dragon dziękuję ! To działa :)!
Wychodzi na to, że na tych paru/parunastu stronach które podają ten sposób jest mały błąd...

0

Wróciłem do projektu w którym chciałem wykorzystać te hinty i znów zonk...
Wtedy gdy zakładałem ten temat sposób @_13th_Dragon zadziałał bez zarzutu.
Dziś taki kod :

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs;

type

  { TForm1 }

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;


type
  TExHint = class(THintWindow)
  constructor Create(AOwner: TComponent); override;
end;


var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

constructor TExHint.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  with Font do // bo Canvas.Font - może się cofnąć przy najbliższym rysowaniu
  begin
    Name  := 'Verdana';
    Size  := Size + 35;
    Style := [fsBold, fsItalic];
    Color := clRed;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
    HintWindowClass  := TExHint;
end;

end.
 

Daje taki efekt:
hinyt.jpg

Dlaczego ?

0

HintWindowClass działa globalnie, ustaw to w rozdziale initialization

0

Przyznam szczerze, że nie do końca rozumiem....

Dopisałem przed end.

initialization
  HintWindowClass  := TExHint;   

ale bez efektu...

0

To dodaj jeszcze:

Screen.HintFont.Assign(Font);

na koniec konstruktora: constructor TExHint.Create(AOwner: TComponent);

0

Witam.

Dziękuję za odpowiedz.
Kolejny raz podchodzę to temat.
Teraz mój kod wygląda tak :

unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs;

type

  { TForm1 }

  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

type
  TExHint = class(THintWindow)
  constructor Create(AOwner: TComponent); override;
end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

constructor TExHint.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  with Font do // bo Canvas.Font - może się cofnąć przy najbliższym rysowaniu
  begin
    Name  := 'Verdana';
    Size  := Size + 35;
    Style := [fsBold, fsItalic];
    Color := clRed;
  end;
  Screen.HintFont.Assign(Font);
end;


procedure TForm1.FormCreate(Sender: TObject);
begin
  HintWindowClass  := TExHint;     // Tego chyba powinno nie być - jednak usunięcie nic nie zmienia.
end;

initialization
  HintWindowClass  := TExHint;

end.
 

Lecz hint nadal wyświetla się standardowo....

0

Nigdy nie bawiłem się z przerabianiem hintów, ale pogrzebałem nieco w sieci i popróbowałem to zmienić;

@hipekk - przede wszystkim klasa THintWindow posiada właściwość Canvas, a ta z kolei właściwość Font, więc trzeba ustawić font właśnie w klasie okna podpowiedzi; I to w sumie tyle, bo po ustawieniu fonta w konstruktorze klasy własnego okna hintów, wszystko działa jak należy - hint posiada taki font, jaki mu ustawimy;

Po drugie - w Twoim kodzie, konstruktor nie znajduje się w sekcji public; Być może ma to znaczenie, ale nie mam czasu teraz się nad tym głowić; Poniżej podaję kod jaki testowałem i zrzut ekranu z wyświetlonego okienka podpowiedzi; Testowane na Lazarusie z FPC 2.6.2;

type
  TForm1 = class(TForm)
    Button1: TButton;
  end;

type
  TMyHint = class(THintWindow)
  public
    constructor Create(AOwner: TComponent); override;
  end;

var
  Form1: TForm1;

implementation

{$R *.lfm}

constructor TMyHint.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);

  with Canvas.Font do
  begin
    Name  := 'Ubuntu';
    Size  := 10;
    Color := clMenuHighlight;
    Style := [];
  end;
end;

initialization
begin
  HintWindowClass := TMyHint;
end;

Efekt ustawień poniżej (kursora nie widać, bo zrzut zrobiłem przyciskiem PrtSc):

own-hint.png

Trzeba by poczytać więcej, jeżeli poza zmianą fonta interesuje Cię jeszcze np. zmiana koloru tła hinta czy w ogóle własne rysowanie okienka podpowiedzi;

To w sumie tyle; Oprócz samej zmiany fonta wyczytałem, że aby zmienić rozmiar okienka należy przedefiniować metodę CalcHintRect i jako rezultat zwrócić strukturę typu TRect, uzupełnioną w odpowiednie dane, gdzie lewy górny róg to punkt 0,0; Działa bez zarzutów, tyle że rysowanie nadal pozostaje standardowe (tekst wyrównany do lewego górnego rogu) i trzeba się dostać do metody odpowiedzialnej za rysowanie i ją także przedefiniować (jeśli można); Poszukaj sobie takich informacji i popróbuj jeszcze sam.

0

Zainteresuj się komponentem TFlatHint

lub skorzystaj z jego kodu:
http://cfprogramas.googlecode.com/svn/trunk/componentes/_Lib/TFlatHintUnit.pas

Ma wszystko to co Ci potrzeba. Zmienia czcionkę i jej wielkość, kolor oraz tło.

0

Po długiej przerwie wróciłem do projektu w którym chciałem wykorzystać te hinty.
W ramach testu utworzyłem nowy projekt przerzuciłem kod który podał @furious programming i nic z tego... (na wszelki wypadek wrzucam źródło - może coś istotnego pomijam...)
Być może to kwestia systemu?
@furious programming na jakim systemie testowałeś ten kod który wrzucałeś ?

1

Kod testowałem na WinXP (to przecież widać po wyglądzie okienka z podanego zrzutu) i wszystko działa tak, jak pokazałem na zrzucie; Hinty były malowane według kodu i nawet manifest systemu się nie wtrącał, więc uznałem, że kod jest prawidłowy; Zresztą ten kod napisałem na podstawie artykułów z bazy wiedzy Lazarusa i innych materiałów, np. pytań na StackOverlow;

Pobrałem projekt podanego przez Ciebie załącznika, skompilowałem i znów działa prawidłowo:

hint.png

a nic w kodzie nie zmieniałem - po prostu go skompilowałem i uruchomiłem.

0

na win 7 nie działa, potwierdzam.

Pewnie kwestia ustawień kolorów i interfejsu aero glass.

3

Na Windows 7 działa z manifestem (bo bez działa normalnie) tylko jest dziwna sprawa trzeba ustawić kolor tła (np. w OnCreate formy):

Application.HintColor:= clNone; //dowolny kolor 
0

@kAzek zgodnie z tym co napisałeś dodałem Application.HintColor:= clNone; i rzeczywiście działa :) (Windows 8.1)

1 użytkowników online, w tym zalogowanych: 0, gości: 1