Fórum Calcular altura da barra de titulo do form. (Skin) #349515
23/11/2007
0
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
Curtir tópico
+ 0Posts
23/11/2007
Vitor Alcantara
Declare unit UxTheme na uses do form.
Nela tem a função UseThemes que retorna true caso o estilo esteja aplicado.
Gostei + 0
23/11/2007
Vitor Alcantara
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
23/11/2007
Vitor Alcantara
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
Clique aqui para fazer login e interagir na Comunidade :)