Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Загрузка в ImageList, несколько иконок в одном битмапе 
V
    Опции темы
GORA
Дата 14.10.2007, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 28.8.2007
Где: Stavropol

Репутация: нет
Всего: нет



Когда на этапе редактирования формы в ImageList добавляется Bitmap, содержащий несколько картинок, то автоматически появляется запрос на разделение картинки на отдельные битмапы. 
Наприпер у меня в битмапе который я загружаю 57 маленьких иконок, и мне надо чтобы при рантайм-загрузке этого битмапа Imagelist автоматически разбил ее на 57 значков
Так вот вопрос: как это сделать?
PM MAIL ICQ   Вверх
Alix
Дата 14.10.2007, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


L45
**


Профиль
Группа: Участник
Сообщений: 581
Регистрация: 4.5.2005
Где: Pskov/Spb

Репутация: 7
Всего: 23



Вот как это происходит в диалоге добавления картинок в imagelist:
Код

    ...

    if Execute then
    begin
      // инициализация
      Modified := False;
      Picture := TPicture.Create;
      NewBitmaps := TList.Create;
      NewBitmap := TBitmap.Create;

      { Add at least one bitmap and mask }
      NewBitmaps.Add(NewBitmap);
      AddCount := 0;

      ...

        // для каждого файла выбранного в диалоге открытия файлов
        for I := 0 to Files.Count - 1 do
        begin
          Picture.LoadFromFile(Files[I]);
          if Picture.Graphic is TIcon then
          begin
            ...
          end;
          IWidth := ImageBitmap.Width;
          IHeight := ImageBitmap.Height;
          if Picture.Graphic is TBitmap then
          begin
            { Find out if the new image is a list of bitmaps to be extracted }
            SubDivideX := (Picture.Graphic.Width > IWidth) and   // нужно ли разделять по оси Х
              (Picture.Graphic.Width mod IWidth = 0);
            SubDivideY := (Picture.Graphic.Height > IHeight) and // нужно ли разделять по оси Y
              (Picture.Graphic.Height mod IHeight = 0);
            if SubDivideX then
              DivideX := Picture.Graphic.Width div IWidth
            else
              DivideX := 1;
            if SubDivideY then
              DivideY := Picture.Graphic.Height div IHeight
            else
              DivideY := 1;

            // если надо, то спросим об этом у пользователя
            if SubDivideX or SubDivideY then
            begin
                ...
                DialogResult := MessageDlg(Format(SImageListDivide,
                  [ExtractFileName(Files[I]), DivideX * DivideY]), mtInformation,
                  [mbYes, mbNo], 0);
            end
            else
              if DialogResult = mrYes then DialogResult := mrNo;

            // если не надо, вырежем только одну
            if DialogResult in [mrNo, mrNoToAll] then
            begin
              DivideX := 1;  //!
              DivideY := 1;  //!
              IWidth := Picture.Bitmap.Width;
              IHeight := Picture.Bitmap.Height;
            end;

            ...

            for Y := 0 to DivideY - 1 do
              for X := 0 to DivideX - 1 do
              begin
                // собстевенно процесс добавления картинок путем вырезания из старой
                { Add new bitmap if necessary }
                if NewBitmaps.Count <= (Y * DivideX + X) then
                begin
                  NewBitmap := TBitmap.Create;
                  NewBitmaps.Add(NewBitmap);
                end
                else
                  NewBitmap := TBitmap(NewBitmaps[Y * DivideX + X]);
                NewBitmap.Assign(Nil);
                NewBitmap.Height := IHeight;
                NewBitmap.Width := IWidth;
                NewBitmap.Canvas.CopyRect(Rect(0, 0, NewBitmap.Width,
                  NewBitmap.Height), Picture.Bitmap.Canvas,
                  Rect(X * IWidth, Y * IHeight, (X + 1) * IWidth,
                  (Y + 1) * IHeight));
              end;
  ...

попробуй сделать по образу и подобию. Писать код примера сейчас ужасно лень...


--------------------
Знание только тогда знание, когда оно приобретено усилиями своей мысли, а не памятью (с) Л. Толстой
High tech. Low live. (с) Gardner Dozois
PM MAIL ICQ Skype   Вверх
GORA
Дата 14.10.2007, 13:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 28.8.2007
Где: Stavropol

Репутация: нет
Всего: нет



извиняюсь, уже разобрался
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0839 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.