Перейти к содержанию
Fire Monkey от А до Я

RoschinSpb

Пользователи
  • Постов

    187
  • Зарегистрирован

  • Посещение

  • Победитель дней

    10

Сообщения, опубликованные RoschinSpb

  1. Коллеги, появился TImageList и это очень хорошо. Но не совсем понятно до конца как он работает? К простой кнопке я его прикрутил TButton, и он картиночка отобразилась влева. Но мне совсем не нравиться вид ее! Она какая то маленькая и отступ слава маловат. Вот для примера посмотрите, наверху кнопка с иконок сделана по старому, положил TImage, а внизу по новому, через TImageList.

    Как менять параметры отображения у TButton?

    Поменять размер картинки можно путем изменения стиля.

    post-64-0-26957700-1430820134_thumb.png

    Вот результат:

    post-64-0-08020900-1430820246.png

    Можно пойти и традиционным путем и просто вставить в кнопку контрол TGlyph

    post-64-0-96979500-1430820422.png

     

     

    А, еще прикол! В маке она вообще не отображается!!! ))

    Если в каких-то стилях не отображается, или отображается не так красиво, как хотелось бы, то надо сообщить в QC. Проблема скорее всего в стиле. Возможно в него просто забыли добавить TGlyph.

    P.S. по предыдущему вопросу, что умолчательный размер картинки 16 рассчитан на кнопки умолчательного размера. Вот как это выглядит в VCL post-64-0-80445600-1430821597.png

  2. Если случится так, что проект будет известным и успешным, то весьма вероятно скоро придет овчарка с милиционером чтобы проверить лицензионность всего ПО (прецеденты с маскишоу :ph34r: были). Если ваш проект будет широко популярен среди пары родственников, то не беспокойтесь ни кто за Вами черный воронок не вышлет, разве что муки совести будут посещать по ночам.

  3. Вообще всегда приходит либо KeyChar, либо Key. Вроде бы об этом написано в тут и тут.
    Key - это код виртуальной клавиши vkXXX. Он зависит от конкретной нажатой клавиши, при чем на разных платформах он приводится к виндовым эквивалентам. 
    KeyChar - это символ который может быть изображен где-нибудь в поле ввода. Он зависит от текущего языка, раскладки, IME, способа ввода (в числе прочего можно использовать голосовой ввод) и еще неизвестно чего, короче его подставляет система по не известным в общем случае правилам. 
    Сделано так специально, чтобы не путали и не пытались выводить в виде текста букву А, когда нажато сочетание клавиш Ctrl+A. Эти два параметра принципиально по разному обрабатываются.

  4. Если мы растягиваем по ширине, то что-то мы должны обрезать.
    У Rectangle1 делаем ClipChildren = True
    А Image1 выравниваем по вертикали по центру Align = VertCenter
    В коде получаем масштаб исходя из ширины, а высоту ставим согласно полученного масштаба. В результате верхняя и нижняя части картинки может обрезаться. Если делать Align = Top, Bottom, то можно обрезать только нижнюю и только верхнюю часть картинки.

    Т. е. получается что-то типа этого

      object Rectangle1: TRectangle
        Align = Top
        ClipChildren = True
        Height = 150.000000000000000000
        Margins.Left = 5.000000000000000000
        Margins.Top = 5.000000000000000000
        Margins.Right = 5.000000000000000000
        Position.X = 5.000000000000000000
        Position.Y = 5.000000000000000000
        Width = 374.000000000000000000
        object Image1: TImage
          MultiResBitmap = <
            item
            end>
          Align = VertCenter
          Height = 274.000000000000000000
          Position.Y = -62.000000000000000000
          Width = 374.000000000000000000
          WrapMode = Stretch
        end
      end
      object Button1: TButton
        Align = Top
        Height = 44.000000000000000000
        Position.Y = 155.000000000000000000
        TabOrder = 1
        Text = #1055#1086#1076#1075#1088#1091#1079#1080#1090#1100
        Width = 384.000000000000000000
        OnClick = Button1Click
      end
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      Scale: Single;
    begin
      if i=3 then i := 1
      else i := i+1;
      Image1.BeginUpdate;
      try
        // Load image
        InStream := TResourceStream.Create(HInstance, 'Test_' + IntToStr(i), RT_RCDATA);
        try
          Image1.Bitmap.LoadFromStream(InStream);
          Scale := Image1.Width / Image1.Bitmap.Width;
          Image1.Height := Image1.Bitmap.Height * Scale;
        finally
          InStream.Free;
        end;
      finally
        Image1.EndUpdate;
        Invalidate;
      end;
    end;
  5. У TImage можно установить свойство WrapMode = Stretch. Оно будет растягивать изображение, правда без сохранения пропорций.
    Вам видимо придется самостоятельно изменить размеры TImage для сохранения пропорций.

    P.S. Кстати пользуясь случаем выкладываю ссылку на демо

  6. Когда вы загружаете картинку (в design time), то картинка подвергается изменениям.

    Обратите внимание на вторую строчку окна редактора IDE. Там по умолчанию выбрано Custom Size. Еще есть поля Width и Height

     

    Алгоритм работы при загрузке картинки в IDE примерно следующий:

    1. Если Width и Height равны 0 (по умолчанию), то эти размеры становятся равными размерам загруженной картинки поделенным на масштаб.
    2. Загружаемая картинка масштабируется таким образом чтобы соответствовать размерам Width и Height умноженным на текущий масштаб. Если картинка меньше, то она сжимается, если больше, то растягивается, а края заполняются прозрачным цветом.
    3. Все пиксели картинки которые имеют выбранный цвет TransparentColor заменяются на прозрачный черный цвет.
    4. Модифицированное таким образом изображение хранится в fmx-файле.

    Т.е. размеры хранящегося в fmx-файле изображения могут отличаться от размеров исходного изображения. Если вы захотите на кнопочку 16x16 поместить 10-мегапиксельную фотку, то в fmx-файле будет хранится изображение 16x16.

     

    А у Вас в примере масштабирования не происходит.

    Image1.Bitmap.LoadFromStream(InStream);

    Хранящееся изображение уже вписывается в границы TImage. Если оно меньше, то центрируется если больше, то сжимается с сохранением пропорций. В вашем примере в TImage вписывается исходное изображение из ресурса.

     

    Вы можете поместить TImage на другой контрол и установить у неё Width и Height нужных (заведомо меньших) размеров, и установить свойство Align в Center.

     

    Мне только не понятна целесообразность такого поведения. Получается в ресурсе хранятся лишние данные и всегда тратятся вычислительные ресурсы на масштабирование.
     

×
×
  • Создать...