Читаем Виртуальная библиотека Delphi полностью

Delphi всегда принимает, что цвет пикселя в левом нижнем углу картинки является фоновым цветом и должен отображаться на экране как прозрачный. Это нигде не документировано, но если у вас есть исходники VCL, вы можете посмотреть код в BUTTONS.PAS .

9. Как отобразить bitmap в 256 цветах?

Как подгрузить 256 цветный bitmap из ресурса и отобразить его в нормальной палитре?

Обычно это делается следующим образом. Код Вадима Пузанова (Красноярск).

Image1.Bitmap.Handle := LoadBitmap(hInstance, 'BMP_NAME');

LoadBitmap загружает только картинку, без палитры. Если палитра у картинки отличается от системной, то ее надо устанавливать "вручную". Могут возникнуть проблемы, если на одной форме расположены две картинки с разными палитрами.

procedure XLoadBitmap(Instance: THandle; BitmapName: PChar; var HB: HBitmap; var HP: Palette); 

var 

  DC: HDC; 

  BI: PBitMapInfo; 

  Pal: PLogPalette; 

  I: Integer; 

  ResIdHandle: THandle; 

  ResDataHandle: THandle; 

  Bitmap: HBitmap; 

  C: HWnd; 

  OldPalette, Palette: HPalette; 

begin 

  Bitmap := 0; 

  Palette := 0; 

  HB := 0; 

  HP := 0; 

{ Получить ресурс из модуля } 

  ResIDHandle := FindResource(Instance, BitmapName, RT_BITMAP); 

  if ResIDHandle <> 0 then 

  begin 

    ResDataHandle := LoadResource(Instance, ResIDHandle); 

    if ResDataHandle <> 0 then  

    begin 

      BI := LockResource(ResDataHandle); 

      if BI <> nil then 

      begin 

      { 256-цветный битмап? } 

        if BI^.bmiHeader.biBitCount = 8 then 

        begin 

        { Создать палитру } 

          GetMem(Pal, SizeOf(TLogPalette) + 256*SizeOf(TPaletteEntry)); 

          for I := 0 to 255 do with Pal^.palPalEntry[I] do 

          begin 

            peRed  := BI^.bmiColors[I].rgbRed; 

            peGreen:= BI^.bmiColors[I].rgbGreen; 

            peBlue := BI^.bmiColors[I].rgbBlue; 

            peFlags:= 0; 

          end

          Pal^.palNumEntries := 256; 

          Pal^.palVersion := $300; 

          Palette := CreatePalette(Pal^); 

          FreeMem(Pal, SizeOf(TLogPalette) + 256 * SizeOf(TPaletteEntry)); 

        { Привести цвета палитры в системные } 

          DC := CreateDC('Display', nil, nil, nil); 

          OldPalette := SelectPalette(DC, Palette, False); 

          UnrealizeObject(Palette); 

          RealizePalette(DC); 

        { Создать битмап } 

          BitMap:= CreateDIBitmap(DC, BI^.bmiHeader, CBM_INIT, 

            @PByteArray(BI)^[SizeOf(TBitMapInfo) + SizeOf(TRGBQuad) * 256 - 4], BI^, DIB_RGB_COLORS); 

        { Освободить ресурсы } 

          UnlockResource(ResDataHandle); 

          FreeResource(ResDataHandle); 

          SelectPalette(DC, OldPalette, False); 

          DeleteDC(DC); 

        end else  

        begin 

        { Не 256-цветный битмап } 

          UnlockResource(ResDataHandle); 

          FreeResource(ResDataHandle); 

          BitMap := LoadBitmap(Instance, BitmapName); 

        end

        HB := Bitmap; 

        HP := Palette; 

      end

    end

  end

end

procedure TForm1.FormCreate(Sender: TObject); 

var 

  HB: HBitmap; 

  HP: HPalette; 

begin 

  XLoadBitmap(hInstance, 'PHOTO', HB, HP); 

  Image1.Picture.Bitmap.Handle  := HB; 

  Image1.Picture.Bitmap.Palette := HP; 

end

10. Если я хочу рассылать EXE файл, созданный в Delphi, какие еще файлы нужно посылать с ним?

Hикакие. Все компилируется в .EXE файл. Конечно, если вы разработали другие файлы (HLP, данные и т.д. ), или если вы используете VBX/OCX файлы, тогда вы должны распространять и их заодно. Если вы используете файлы VBX, то в поставку нужно также включать BIVBX11.DLL.

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных