Calcular altura da barra de titulo do form. (Skin)

Delphi

23/11/2007

Criei uma rotina pro onPaint do form onde eu coloco uma imagem sobre a barra de caption do form , como se fosse uma especie de skin.

procedure TF_Principal.FormPaint(Sender: TObject);
var
  Cnv:tCanvas;
  i     :Integer;
begin
//////////////////////////////////////////////////////////////
  ///  Cria o objeto canvas
  Cnv:=TCanvas.Create;
  /////////////////////////////////////////////////////////////
  ///  Pega o handle do desktop
  Cnv.Handle:=GetDC(Hwnd_Desktop);

  /////////////////////////////////////////////////////////////
  ///  Pinta a imagem pre definida na barra do xp
  ///  A imagem é uma imagem de uma barrinha vertical azul
  ///  Tamanho da imagem : Height = 22 , Width = 1
  for i := 0 to Cnv.ClipRect.Right  do
  Cnv.Draw(left+ i,top   ,ImgBarra.Picture.Bitmap );

  ////////////////////////////////////////////////////////////
  ///  Escreve o caption do form com um efeito
  ///  3 D
  ///
  Cnv.Brush.Style := bsClear;
  Cnv.Font.Style  := [fsBold];
  Cnv.Font.Color := clWhite;
  Cnv.TextOut(Left + 16 , Top +6 , Caption);
  Cnv.Font.Color  := clBlack;
  Cnv.TextOut(left + 15,top +5,Caption);
end;


Quando as propriedades do estilo do XP está como Classic funciona beleza, só que quando ela está em alguns daqueles estilos mais bonitos ocorre que a barra de titulo é tem a altura maior, então a minha imagem não sobrepoem ela por inteiro.

O que eu gostaria de fazer era ou redimensionar a altura da barra de titulo, ou calcular a altura da mesma.
Isso é possivel?

Agradeço desde já
Atenciosamente Vitor Araújo Alcântara


Vitor Alcantara

Vitor Alcantara

Curtidas 0

Respostas

Vitor Alcantara

Vitor Alcantara

23/11/2007

Dica pra saber se os estilo do XP está aplicado ou não.

Declare unit UxTheme na uses do form.
Nela tem a função UseThemes que retorna true caso o estilo esteja aplicado.


GOSTEI 0
Vitor Alcantara

Vitor Alcantara

23/11/2007

Consegui resolver parcialmente o meu ´problema´.

Como achei essa função pra saber se o estilo está aplicad é só utilizar uma barra maior caso isso ocorra.

procedure TF_Principal.FormPaint(Sender: TObject); 
var 
  Cnv:tCanvas; 
  i     :Integer; 
begin 
////////////////////////////////////////////////////////////// 
  ///  Cria o objeto canvas 
  Cnv:=TCanvas.Create; 
  ///////////////////////////////////////////////////////////// 
  ///  Pega o handle do desktop 
  Cnv.Handle:=GetDC(Hwnd_Desktop); 

  ///////////////////////////////////////////////////////////// 
  ///  Pinta a imagem pre definida na barra do xp 
  ///  A imagem é uma imagem de uma barrinha vertical azul 
  ///  Tamanho da imagem : Height = 22 , Width = 1 
  if not UseThemes then
  begin
    for i := 0 to Cnv.ClipRect.Right  do 
      Cnv.Draw(left+ i,top   ,ImgBarraNormal.Picture.Bitmap ); 
  end
  else
  begin
       for i := 0 to Cnv.ClipRect.Right  do 
      Cnv.Draw(left+ i,top   ,ImgBarraXP.Picture.Bitmap );
  end;  

  //////////////////////////////////////////////////////////// 
  ///  Escreve o caption do form com um efeito 
  ///  3 D 
  /// 
  Cnv.Brush.Style := bsClear; 
  Cnv.Font.Style  := [fsBold]; 
  Cnv.Font.Color := clWhite; 
  Cnv.TextOut(Left + 16 , Top +6 , Caption); 
  Cnv.Font.Color  := clBlack; 
  Cnv.TextOut(left + 15,top +5,Caption); 
end;


Agora o meu problema é outro.
Quando tiro o focu e passo pra outro com alt+Tab (ex: MSN), a minha barra de titulo volta ao normal, tendo que redimensionar a mesma(maximizar, minimizar, restaurar) para que o ´efeito´ volte a ocorrer.

Será que não teria um modo de colocar sei la um tImage + os botões padrões (minimizar,fechar,restaurar) por exemplo sobre a barra de titulo?


GOSTEI 0
Vitor Alcantara

Vitor Alcantara

23/11/2007

Consegui resolver o problema de outro modo.
Ta ai a minha solução pra quem quizer ver.

procedure tf_Principal.DrawTitleButton;
var
  bmap : TBitmap; {Bitmap to be drawn - 16 X 16 : 16 Colors}
  XFrame,  {X and Y size of Sizeable area of Frame}
  YFrame,
  XTtlBit, {X and Y size of Bitmaps in caption}
  YTtlBit  : Integer;
  x:integer;
begin
  {Get size of form frame and bitmaps in title bar}
  XFrame  := GetSystemMetrics(SM_CXFRAME);
  YFrame  := GetSystemMetrics(SM_CYFRAME);
  XTtlBit := GetSystemMetrics(SM_CXSIZE);
  YTtlBit := GetSystemMetrics(SM_CYSIZE);

  TitleCaption := Bounds(1,
                            YFrame - 1,
                            width,
                            YTtlBit + 2);
  
  


  Canvas.Handle := GetWindowDC(Self.Handle); {Get Device context for drawing}
  try
    with TitleCaption do
    begin          
        Canvas.StretchDraw(TitleCaption,ImgTab.Picture.Bitmap);
        Canvas.Brush.Style := bsClear;
        Canvas.Font.Style  := [fsBold];
        Canvas.Font.Color := clWhite;
        Canvas.TextOut(Left + 16 , Top +6 , Caption);
        Canvas.Font.Color  := clBlack;
        Canvas.TextOut(left + 15,top +5,Caption);
    end;
  finally
    ReleaseDC(Self.Handle, Canvas.Handle);
    Canvas.Handle := 0;
  end;
end;


Dai no evento Paint d form.

procedure TF_Principal.FormPaint(Sender: TObject);
begin
   DrawTitleButton;
end;


So que quando a aplicação perde o focu o efeito desaparece dai então eu coloquei um component ApplicationEvents e no evento Message coloquei

procedure TF_Principal.ApplicationEvents1Message(var Msg: tagMSG;
  var Handled: Boolean);
begin

  Case Msg.message  of
    49334,257  : Repaint;
    WM_NCMOUSEMOVE:
    if not active then
    Repaint;
  End;

end;


Ta faltando desenhar os botões (minimizar, maximizar e fechar).
Se alguem tiver alguma idéia ai, sera bem vinda.


GOSTEI 0
POSTAR