Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Подчеркивание в меню

16K
11 июля 2009 года
alenov
36 / / 20.09.2007
Добрый день. Возникла проблема с использованием компонента меню в стиле ХР. В заголовках пунктов меню подчеркивается первый символ (Заголовок), а если заголовок начинается с того же символа, что и предыдущий, то второй. Меня это не устраивает, хотелось бы, чтобы подчеркивался или все время первый символ, или вообще подчеркивания не было. Вот процедура ответственная за прорисовку пунктов меню:
Код:
procedure TMXPMenu.DrawMenuItem;
var
  Text: string;
  Bitmap: TBitmap;
  IconRect,
  TextRect,
  CheckRect: TRect;
  i,x1,x2,TextFormat: integer;
  MenuItem: TMenuItem;
  Menu: TMenu;
begin
  MenuItem:=TMenuItem(Sender);
  Menu:=MenuItem.Parent.GetParentMenu;
  if Menu.IsRightToLeft then begin
    x1:=ARect.Right-20;
    x2:=ARect.Right;
  end else begin
    x1:=ARect.Left;
    x2:=ARect.Left+20;
  end;
  IconRect:=Rect(x1,ARect.Top,x2,ARect.Bottom);
  TextRect:=ARect;
  Text:=#32+MenuItem.Caption;
  Bitmap:=TBitmap.Create;
  Bitmap.Transparent:=True;
  if Assigned(MenuItem.Parent.GetParentMenu.Images) or Assigned(MenuItem.Parent.SubMenuImages) then begin
    if (MenuItem.ImageIndex<>-1) then begin
      if Assigned(MenuItem.Parent.SubMenuImages) then
        MenuItem.Parent.SubMenuImages.GetBitmap(MenuItem.ImageIndex,Bitmap)
      else
        MenuItem.Parent.GetParentMenu.Images.GetBitmap(MenuItem.ImageIndex,Bitmap)
    end;
  end;
  if Menu.IsRightToLeft then begin
    x1:=ARect.Left;
    x2:=ARect.Right-20;
  end else begin
    x1:=ARect.Left+20;
    x2:=ARect.Right;
  end;
  TextRect:=Rect(x1,ARect.Top,x2,ARect.Bottom);
  ACanvas.Brush.Color:=FBackColor;
  ACanvas.FillRect(TextRect);
  if (Menu is TMainMenu) then begin
    for i:=0 to MenuItem.GetParentMenu.Items.Count-1 do begin
      if (MenuItem.GetParentMenu.Items=MenuItem) then begin
        ACanvas.Brush.Color:=FIconBackColor;
        ACanvas.FillRect(ARect);
        if (MenuItem.ImageIndex=-1) and (MenuItem.Bitmap.Width=0) then begin
          TextRect:=ARect;
          Break;
        end;
      end;
    end;
  end;
  ACanvas.Brush.Color:=FIconBackColor;
  ACanvas.FillRect(IconRect);
  if MenuItem.Enabled then
    ACanvas.Font.Color:=FFontColor
  else
    ACanvas.Font.Color:=FDisabledFontColor;
  if (odSelected in State) or (odHotLight in State) then begin
    ACanvas.Brush.Style:=bsSolid;
    ACanvas.Brush.Color:=FSelectedBackColor;
    ACanvas.FillRect(TextRect);
    ACanvas.Pen.Color:=FSelectedBorderColor;  //Цвет рамки области выделения
    ACanvas.Brush.Style:=bsClear;
    ACanvas.RoundRect(TextRect.Left,TextRect.Top,TextRect.Right,TextRect.Bottom,6,6); //Углы области выделения
    if MenuItem.Enabled then
      ACanvas.Font.Color:=FSelectedFontColor;
  end;
  x1:=IconRect.Left+2;
  if MenuItem.Checked then begin    //Галочка
    ACanvas.Pen.Color:=FCheckedColor;
    ACanvas.Brush.Style:=bsClear;
    if (Bitmap.Width=0) then begin
      ACanvas.RoundRect(IconRect.Left+5,IconRect.Top+5,IconRect.Right-5,IconRect.Bottom-5,3,3);
      CopyRect(CheckRect,IconRect);
      InflateRect(CheckRect,-7,-7);
      ACanvas.Brush.Color:=FCheckSignColor;
      ACanvas.FillRect(CheckRect);
    end else begin
      ACanvas.Brush.Color:=FCheckSignColor;
      ACanvas.RoundRect(IconRect.Left,IconRect.Top,IconRect.Right,IconRect.Bottom,3,3);
    end;
  end;
  if Assigned(Bitmap) then
    ACanvas.Draw(x1,IconRect.Top+1,Bitmap);
  if not MenuItem.IsLine then begin
    SetBkMode(ACanvas.Handle,TRANSPARENT);
    ACanvas.Font.Name:='Tahoma';
    ACanvas.Font.Style:=[];
    if Menu.IsRightToLeft then
      ACanvas.Font.Charset:=DEFAULT_CHARSET;
    if Menu.IsRightToLeft then
      TextFormat:=DT_RIGHT+DT_RTLREADING
    else
      TextFormat:=0;
    if MenuItem.Default then
      ACanvas.Font.Style:=ACanvas.Font.Style+[fsBold];
    inc(TextRect.Left,2);
    inc(TextRect.Top,FInterval); //Здесь опускается текст
    DrawTextEx(ACanvas.Handle,PChar(Text),Length(Text),TextRect,TextFormat,nil);
    Text:=ShortCutToText(MenuItem.ShortCut)+' ';
    if Menu.IsRightToLeft then
      TextFormat:=DT_LEFT
    else
      TextFormat:=DT_RIGHT;
    DrawTextEx(ACanvas.Handle,PChar(Text),Length(Text),TextRect,TextFormat,nil);
  end else begin
    ACanvas.Pen.Color:=FSeparatorColor;  //Сепаратор
    ACanvas.MoveTo(ARect.Left+10,TextRect.Top+Round((TextRect.Bottom-TextRect.Top)/2));
    ACanvas.LineTo(ARect.Right-2,TextRect.Top+Round((TextRect.Bottom-TextRect.Top)/2));
  end;
  Bitmap.Free;
end;
3.7K
12 июля 2009 года
0nni
326 / / 24.06.2008
Вообще смысл "Подчеркиваний" в быстрой навигации по меню, ты нажимаешь alt+подчеркнутую букву и попадаешь в нужный пункт меню, если буквы будут совпадать, то вся скорость теряется.
А вообщем решается так, называешь все пункты меню таким образом:
 
Код:
"&File" "&Forms" "&History" "&Help"

символ & в начале каждой строки
И в свойствах меню сделай так:
 
Код:
TMainMenu.AutoHotKeys := maManual
16K
12 июля 2009 года
alenov
36 / / 20.09.2007
Большое спасибо за полный и исчерпывающий ответ!
16K
12 июля 2009 года
alenov
36 / / 20.09.2007
Неожиданно указанная выше проблема получила развитие. Я меню поместил на тулбар (чтобы полоску под меню в цвет формы закрасить). Так вот эта команда на меню в тулбаре не действует - подчеркивание не убирается. А если AutoMerge:=true не ставить (получается 2 меню: одно сверху, другое пониже на тулбаре), то происходит странная вещь: сначала пункты верхнего меню не подчеркнутые, но если сходить в меню тулбара, то они (верхние) последовательно (какой пункт посмотришь) становятся подчеркнутые (как в тулбаре).
Что происходит? Можно ли как-нибудь нейтрализовать эффект тулбара?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог