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


Автор: GORA 14.10.2007, 12:57
Когда на этапе редактирования формы в ImageList добавляется Bitmap, содержащий несколько картинок, то автоматически появляется запрос на разделение картинки на отдельные битмапы. 
Наприпер у меня в битмапе который я загружаю 57 маленьких иконок, и мне надо чтобы при рантайм-загрузке этого битмапа Imagelist автоматически разбил ее на 57 значков
Так вот вопрос: как это сделать?

Автор: Alix 14.10.2007, 13:32
Вот как это происходит в диалоге добавления картинок в 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;
  ...

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

Автор: GORA 14.10.2007, 13:32
извиняюсь, уже разобрался

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