Помощь - Поиск - Пользователи - Календарь
Полная версия: CreatePalette
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
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. А не знал бы - не понял бы, что надо прочитать до самого конца.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.