PDA

Ver la Versión Completa : Cambiar fuente del menu


VRO
14-11-2007, 17:30:50
Hola, ¿hay alguna manera de cambiar las fuentes que se usan en los menus? ¿y en todo el programa?.

Gracias por adelantado.

jhonny
14-11-2007, 17:48:21
Hola, ¿hay alguna manera de cambiar las fuentes que se usan en los menus? ¿y en todo el programa?.

Gracias por adelantado.

Si, hay manera de hacerlo, pero antes de decir cualquier cosa respondeme lo siguiente... ¿Realmente te refieres a todo en el programa, Osea Menus, Botones, Paneles, Titulos, etc, etc... o solo a algunos controles en especifico?

VRO
15-11-2007, 17:14:24
Correcto, me estoy refiriendo a cambiar la fuente de cualquier control para todo el programa.

Gracias por responder

jhonny
15-11-2007, 17:58:56
Hay dos posibilidades, tu decides cual es mejor para vos :).

1) Bueno, para ser sincero no encontre una clase donde Font sea una propiedad común, en un principio creí que sería TWinControl pero pensandolo un poco mas y al ver que no tenia esa propiedad entendí que no tendria mucho sentido, quizá porque hay WinControls que no necesitan un Font (Como por ejemplo el TScrollBar)... en todo caso podriamos "engañar" un poco esto y hacerle creer a todos por unos instantes que solo estamos trabajando con Edits... despues de todo los demas tambien son descendientes de TControl y podemos hacer un Cast entre ellos, asi:


procedure CambiarFont(Forma :TForm; Fuente :String);
var
i :Integer;
begin
for i := 0 to Forma.ControlCount -1 do
begin
TEdit(Forma.Controls[i]).Font.Name := Fuente;
end;
end;


Donde Forma es el formulario al que queremos aplicar dicho algortimo y fuente es el nombre de la fuente que queremos ver...


2) Todo lo anterior no seria necesario si tenemos todos los controles con su propiedad ParentFont en True y luego simplemente cambiamos el Font del formulario con una funcion tan sencilla como la siguiente:


procedure CambiarFont(Forma :TForm; Fuente :String);
begin
Forma.Font.Name := Fuente;
end;


Automaticamente todos los controles que esten sobre él cambiaran su tipo de letra.

Espero que esto te sirva de algo ;).

jhonny
15-11-2007, 19:18:48
Bueno, estuve investigando un poco y note que para cambiar el tipo de fuente en un TMenu es necesario interceptar el evento OnDrawItem de los MenuItems, por ejemplo asi:


procedure TForm1.Prueba11DrawItem(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Selected: Boolean);
begin
ACanvas.Font.Name := 'Comic Sans MS';
ACanvas.TextRect(ARect, ARect.Left, ARect.Top, StringReplace(TMenuItem(Sender).Caption,'&', '', []));
end;
// Para que este evento se "dispare" es necesario tener la propiedad
// OwnerDraw del TMainMenu en True...


Pero como lo que queremos es cambiarlo en todos los items de menu del TMainMenu, pues podemos recorrer todos los Items de menu asignandole a este evento uno que nosotros creamos "manualmente", asi por ejemplo:


//Este es el metodo que creamos "manualmente", muy parecido al OnDrawItem
//original, para poderlo asignar mas adelante
procedure TForm1.AplicarEstoAlDibujar(Sender: TObject; ACanvas: TCanvas;
ARect: TRect; Selected: Boolean);
begin
ACanvas.Font.Name := 'Comic Sans MS';
ACanvas.TextRect(ARect, ARect.Left, ARect.Top, StringReplace(TMenuItem(Sender).Caption,'&', '', []));
end;


//Con el siguiente metodo recorremos todos los Items del Menu y le
//asignamos al evento OnDrawItem del Item en curso el metodo anterior

procedure TForm1.CambiarFontMenus(vMenu :TMenuItem; Indice :Integer = 0);
var
i :Integer;
begin
if vMenu.MenuIndex <> -1 then
begin
vMenu.OnDrawItem := AplicarEstoAlDibujar; //<-- Aqui lo asignamos
end;

if vMenu.Count > 0 then
for i := 0 to vMenu.Count -1 do
begin
CambiarFontMenus(vMenu.Items[i]); //<- Aplicamos una retroalimentación
end;
end;


//El siguiente metodo es un ejemplo de llamar al metodo anterior...
procedure TForm1.FormCreate(Sender: TObject);
begin
CambiarFontMenus(Self.Menu.Items);
end;


Espero que todo este asunto te sirva de algo :).

VRO
15-11-2007, 19:48:58
Muchas gracias por tus respuesta jhonny, voy a probarlas :)