Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > TMainMenu шрифт


Автор: Fomaa 19.10.2007, 14:43
Как поменять размер шрифта для компоненты TMainMenu?

Автор: VICTAR 19.10.2007, 15:42
OwnerDraw+OnMeasureItem+OnDrawItem

Автор: Fomaa 23.10.2007, 10:50
а можно объяснить это?

Автор: Anakin 23.10.2007, 11:47
Вот у меня тоже сегодня возник такой вопрос.. можно по подробней ??

Автор: Alix 23.10.2007, 13:19
чего-то меня глючит, но вроде так:
Код
type
  TForm1 = class(TForm)
    MainMenu1: TMainMenu;
    N1: TMenuItem;
    ...
    N9: TMenuItem;
    procedure FormCreate(Sender: TObject);
  private
    procedure DrawItem(Sender: TObject; ACanvas: TCanvas;
      ARect: TRect; State: TOwnerDrawState);
  end;

...

procedure TForm1.DrawItem(Sender: TObject; ACanvas: TCanvas;
  ARect: TRect; State: TOwnerDrawState);
var
  s : string;

begin
  with acanvas do begin
    if odSelected in state then
      brush.color := clLime
    else
      brush.Color := clBlack;

    FillRect(arect);

    if odSelected in State then
      font.Color := clBlack
    else
      font.Color := clLime;

    s := (sender as TMenuItem).Caption;
    if s = '-' then begin
      pen.Color := clLime;
      moveto(ARect.Left, arect.Top);
      lineto(arect.Right, arect.Top);
    end else begin
      offsetrect(arect, 5, 2);
      DrawText(Handle, pchar(s), length(s), arect, 0);
    end;
  end;
end;

procedure setItemDrawPropertyTo(mi : TMenuItem);
var
  i : integer;

begin
  mi.OnAdvancedDrawItem := Form1.DrawItem;
  for i := 0 to mi.Count-1 do
    setItemDrawPropertyTo(mi.Items[i]);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  setItemDrawPropertyTo(MainMenu1.Items);
end;

То что рисуется - просто демо, не воспринимайте так уж всерьез, setItemDrawProperty нужна чтобы выставить всем item'ам наш обработчик рисования, а не делать это вручную в редакторе mainmenu. В самом MainMenu все что надо - выставить OwnerDraw := True

Автор: Fomaa 23.10.2007, 14:10
Нашел такой вариант решения задачи:
Код

var ncm: TNonClientMetrics;
begin
  ncm.cbSize := SizeOf(TNonClientMetrics);
  SystemParametersInfo(SPI_GETNONCLIENTMETRICS, SizeOf(TNonClientMetrics), @ncm, 0);
  ncm.lfMenuFont.lfFaceName := 'Arial';
  ncm.lfMenuFont.lfHeight:=20;
  SystemParametersInfo(SPI_SETNONCLIENTMETRICS, SizeOf(TNonClientMetrics), @ncm, 0);

Автор: Alix 23.10.2007, 14:38
это затронет ВСЕ окна в системе, если только они не самоотрисовывающиеся

Автор: Anakin 24.10.2007, 11:25
Если чесно то вареант Alix я не понял (

Автор: Alix 24.10.2007, 11:33
Anakin, какой конкретно момент не понятен? Про setItemDrawProperty? Или вообще все? Быть может весь проект облегчит понимание.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)