Newsgroup: it.comp.lang.delphi
Titolo: Label nella barra di una form in vista

Salve a tutti,
Vorrei fare qualcosa del genere:
http://img529.imageshack.us/img529/3643/immaginembl.jpg
una label che risponda al click del mouse in Windows vista.
L'esempio: 
http://delphi.about.com/od/adptips2006/qt/draw_captionbar.htm
purtoppo non funziona con Vista.
Potete dirmi almeno come muovermi?
grazie

 Potete dirmi almeno come muovermi?
dipende se lei sta sopra o sotto... :-D
A.

 > purtoppo non funziona con Vista.
Si si stacca il contatore della luce.
Hai ragione a volte non esprimo bene quello che ho in testa forse
pechè penso che i programmatori abbiano il dono della telepatiai.
(scherzo)
Nell'esempio del link viene disegnato un testo nel canvas.
Il codice funziona con xp e non con vista (non viene visualizzato
nessun testo).
Io in realtà non voglio "stampare" solo un testo ma fare in modo il
mio testo (meglio una label)
rispondi alla pressione del stato sinistro del mouse;
Il primo problema perciò è quello di creare una label nella non-client
area.
(penso intercettando WM_NCPAINT, ma come?, posizione?)
Il secondo e visualizzarla in windows vista -
(penso che per via del tema di vista e come mettere controlli nella
GlassFrame.. doubleBuffer etc)
Il terzo è intercettare l'evento del click
(se creo la label sarà onClick della label)
ora spero di essermi spiegato
Grazie dell'interessamento

Ho fatto una rapida ricerca.
Una cosa che *forse* puo' essere un punto di partenza, è questo:
http://www.codeproject.com/KB/GDI-plus/WindowGraphics.aspx?display=PrintAll&fid=1526711&df=90&mpp=25&noise=3&sort=Position&view=Quick&select=2729339
Ancora, sarebbe importante conoscere la versione di delphi che usi..
magari usi d5 e questa cosa l'hanno sistemata nelle ultime versioni.
Anzi, sarebbe carino se qualcuno del ng che usa una versione
successiva alla 7 provasse il codice al link su delphi.about che hai
postato tu.
Io non posso farlo...Non uso vista e uso delphi7.
Pax vobiscum
A.

 A.
Uso delphi 2009.
Cercando, ricercando e chiedendo qua e là sono arrivato a:
------------------------------------------
unit Unit21;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls,
Forms,
  Dialogs, StdCtrls;
type
  TForm21= class(TForm)
    procedure FormDeactivate(Sender: TObject);
  private
    { Private declarations }
   FRectText: TRect;
   FDown:boolean;
   function InRectText( x,y: integer ): boolean;
   procedure Disegna;
   procedure WMNCPaint(var Mess: TWMNCPaint); message WM_NCPAINT;
   procedure WMNCActivate(var Msg: TWMNCActivate);  message
WM_NCACTIVATE;
   procedure WMNCMouseMove(var Msg: TWMNCMouseMove); message
WM_NCMOUSEMOVE;
   procedure WMNCLButtonDown(var Msg: TWMNCLButtonDown); message
WM_NCLBUTTONDOWN;
   procedure WMNCLButtonUp(var Msg: TWMNCLButtonUp); message
WM_NCLBUTTONUP;
  public
   { Public declarations }
  end;
var
Form21: TForm21;
implementation
{$R *.dfm}
procedure TForm21.Disegna;
const
   Msg = 'Stato record';
var
   CV: TCanvas;
   R: TRect;
begin
   inherited;
   CV:= TCanvas.Create;
   try
     CV.Handle := GetWIndowDC(handle);
     R := Rect(0,0,Width, GetSystemMetrics(SM_CYCAPTION));
     InflateRect(R, -GetSystemMetrics(SM_CXSIZEFRAME), 0);
     if biSystemMenu In BorderIcons then begin
       R.Left := R.Left + GetSystemMetrics(SM_CXSMICON);
       if ([biMinimize, biMaximize] * BorderIcons) <> [] then
          R.Right := R.Right - 2* GetSystemMetrics(SM_CXSIZE);
       // account for the close box
          R.Right := R.Right - GetSystemMetrics(SM_CXSIZE);
       if (biHelp in BorderIcons) and (Borderstyle = bsDialog) then
          R.Right := R.Right - GetSystemMetrics(SM_CXSIZE);
     end; {if}
     CV.Font := Screen.MessageFont;
     R.Left := R.Right - CV.TextWidth(Msg) - 20;
     CV.Font.Color := clBlue;
     CV.Font.Style := [fsBold, fsItalic, fsUnderline];
     cv.Brush.Style := bsClear;
     CV.TextOut(R.Left, R.Bottom - CV.TextHeight(Msg), Msg);
     //----------- Capture TextRect
     FRectText.Left:=R.Left;
     FRectText.Right:=R.Left+CV.TextWidth(Msg);
     FRectText.Bottom:=R.Bottom;
     FrectText.Top:=R.Bottom-CV.TextHeight(Msg);
     //----------- Capture TextRect
     ReleaseDC(handle, CV.Handle);
     Cv.Handle := 0;
   finally
   CV.Free;
   end; {finally}
end;
procedure TForm21.WMNcPaint(var Mess: TWMNCPaint);
begin
  inherited;
  Disegna
end;
procedure TForm21.WMNCActivate(var Msg: TWMNCActivate);
begin
  inherited;
  Disegna
end;
procedure TForm21.FormDeactivate(Sender: TObject);
begin
   Disegna;
end;
function TForm21.InRectText(x, y: integer): boolean;
begin
   // test if cursor in textRect
   Result := PtInRect( FRectText, Point( X - Left, y - Top ) )
end;
procedure TForm21.WMNCMouseMove(var Msg: TWMNCMouseMove);
begin
   // change cursor graphics if in RectText
   if InRectText(MSG.XCursor, MSG.YCursor) and (cursor <> crHandPoint)
then
      Cursor:=crHandpoint
   else if (Cursor =crHandPoint) then
      Cursor:=crDefault;
   inherited;
end;
// mouse down event
procedure TForm21.WMNCLButtonDown(var Msg: TWMNCLButtonDown);
begin
   if InRectText(MSG.XCursor, MSG.YCursor) and (FDown=False) then
begin
      Msg.Result := 0;
      FDown:=true;
   end
   else
      inherited;
end;
// mouse up event
procedure TForm21.WMNCLButtonUp(var Msg: TWMNCLButtonUp);
begin
   if InRectText(MSG.XCursor, MSG.YCursor) and FDown then begin
      Msg.Result := 0;
      ShowMessage('Bingo'); // my future action
      FDown:=False;
      Disegna
   end
   else
      inherited;
end;
Risultato su xp funziona (anche quello dell'esempio
http://delphi.about.com/od/adptips2006/qt/draw_captionbar.htm
 )
Su vista, su tre macchine provate : senza areo funziona con aero
attivata non funziona.
Ma l'appetito vien mangiando e cercando ho trovato quello che
veramente serve a me:
http://www.codeproject.com/KB/dialog/AeroNonClientAreaButtons.aspx
Ma qui la strada sale, ho capito de bisogna chiamare le api DWM
(desktop Windows Menager), ma convertire il progetto pubblicato non
credo sia cosa facile
Magari qulcuno possa farlo.
Grazie dell'interessamento