Calcular altura da barra de titulo do form. (Skin)
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.
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
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
Curtidas 0
Respostas
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.
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
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.
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?
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
23/11/2007
Consegui resolver o problema de outro modo.
Ta ai a minha solução pra quem quizer ver.
Dai no evento Paint d form.
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
Ta faltando desenhar os botões (minimizar, maximizar e fechar).
Se alguem tiver alguma idéia ai, sera bem vinda.
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