Помощь - Поиск - Пользователи - Календарь
Полная версия: CreatePalette
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Delphi
TarasBer
Решил я из 32-битного БМП сделать 4-битный, и чтобы при этом применялась не абы какая палитра, а умная, найденная квантованием цвета. Ну составил я палитру, а дальше какие-то что технические закидоны пошли:

type
  T4Arr = array [0 .. 3] of byte;
  P4Arr = ^T4Arr;
  TPalette = array [0 .. 15] of T4Arr;

var
  pal: record
    version: word;
    num: word;
    a: TPalette
  end;

  pal_: LOGPALETTE absolute pal; 
  // работать сразу с LOGPALETTE нельзя из-за длины массива в 1 элемент

  H: HPALETTE;
  
  B: TBitmap;

begin
  ...
  pal.version := 0;
  pal.num := 16;
  pal.a := Palette;

  H := CreatePalette( pal_ );  // возвращает 0

  Caption := IntToStr(GetLastError);  // выводит 8

  B.PixelFormat := pf4bit;         // в таком порядке, или наоборот, я не знаю?
  B.Palette := H;
end;



Почему так?
Я прочитал msdn, но это не помогло, так как там нет рабочего примера. Что писать в номер версии, и что это вообще за поле (зачем оно вообще), я тоже не понял, там ничего не написано. Я пробовал гуглить, но гугл выдал кучу бесплезных сайтов, с 1 строчкой типа "CreatePalette - создаёт палитру по структуре LOGPALETTE" (причём слово LOGPALETTE даже синим не подчёркнуто, перейти нельзя). Ай спасибо, блин, Капитан Очевидность!

Так вот, как правильно создавать палитру, и что означает ошибка 8 (то есть, если верить msdn, ERROR_NOT_ENOUGH_MEMORY)?
IUnknown
Pal.Version установи в $0300, этот формат палитры еще с Windows 3.0 пошел, и с тех пор не меняется, отсюда и эта "магическая константа".

Цитата
в таком порядке, или наоборот, я не знаю?
В таком, сначала - формат, потом - палитра.
TarasBer
О, спасибо, $0300 заработало.
Оказывается, в МСДН это тоже написано. В самом низу страницы. Я это понял, ища глазами число $0300. А не знал бы - не понял бы, что надо прочитать до самого конца.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.