SetDIBits() в Win98 и WinNT
От: Michail_TV  
Дата: 23.09.03 04:35
Оценка:
Подскажите, какие отличия в использовании SetDIBits() под 98 и NT ?
У меня в 98 все работает (почти всегда), а под NT (2000 и ХР) работает через раз
или не работает совсем. Говорит "Недостаточно памяти для выполнения команды".

HDC dev_h=CreateCompatibleDC(NULL);
MY_BITMAPINFO *bmp_data=new MY_BITMAPINFO; // заголовок для 256 моих цветов
Graphics::TBitmap *bmp1=((Graphics::TBitmap*)(ListGrafPlace1->Items[num])); // num — просто индекс

size=params[6]*(Length); // Length — ширина картинки
params[2]=((Length + 3) & 0xfffc);
bmp_data->bmiHeader.biSizeImage=size;
bmp_data->bmiHeader.biHeight = -params[6]; // -количество строк
bmp_data->bmiHeader.biWidth = params[2]; // делится на 4

res=SetDIBits(dev_h,bmp1->Handle,0,params[6],(void*)Array_Color1,(BITMAPINFO*)bmp_data,DIB_RGB_COLORS);

ReleaseDC(NULL,dev_h);
DeleteDC(dev_h);

Я пробовал изменять знак высоты картинки — не помогло.
Пробовал изменять размер картинки — не помогло.
Какая же хитрость?
Re: SetDIBits() в Win98 и WinNT
От: Patalog Россия  
Дата: 23.09.03 10:52
Оценка:
Здравствуйте, Michail_TV, Вы писали:

[]

Хотелось бы посмотреть, что это за MY_BITMAPINFO и как ты его инициализируешь.
Почетный кавалер ордена Совка.
Re[2]: SetDIBits() в Win98 и WinNT
От: Аноним  
Дата: 24.09.03 03:13
Оценка:
Здравствуйте, Patalog, Вы писали:
P>Хотелось бы посмотреть, что это за MY_BITMAPINFO и как ты его инициализируешь.

Пожалуйста

struct MY_BITMAPINFO
{ BITMAPINFOHEADER bmiHeader;
RGBQUAD bmiColors[30];
};
MY_BITMAPINFO *bmp_data=new MY_BITMAPINFO;
bmp_data->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);
bmp_data->bmiHeader.biBitCount=8;
bmp_data->bmiHeader.biPlanes=1;
bmp_data->bmiHeader.biCompression=BI_RGB;
bmp_data->bmiHeader.biClrUsed=30;
bmp_data->bmiHeader.biClrImportant=30;

for (int i=0;i < 30;i++)
bmp_data->bmiColors[i]=TO_RGB(8*i,8*i,8*i);
bmp_data->bmiColors[30-1]=TO_RGB(0,160,0);
bmp_data->bmiColors[30-2]=TO_RGB(255,255,255);
bmp_data->bmiColors[30-3]=TO_RGB(0,0,0);
bmp_data->bmiColors[30-4]=TO_RGB(128,128,128);
bmp_data->bmiColors[30-5]=TO_RGB(192,192,192);
bmp_data->bmiColors[30-6]=TO_RGB(0,0,160);
bmp_data->bmiColors[30-7]=TO_RGB(255,0,0);
bmp_data->bmiColors[30-8]=TO_RGB(255,255,0);
bmp_data->bmiColors[30-9]=TO_RGB(160,0,0); // TO_RGB возвращает объект RGBQUAD по заданым оттенкам

я что-то забыл сделать ?
Re[3]: SetDIBits() в Win98 и WinNT
От: Вадим Никулин Россия Здесь
Дата: 24.09.03 05:46
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Patalog, Вы писали:

P>>Хотелось бы посмотреть, что это за MY_BITMAPINFO и как ты его инициализируешь.

А>Пожалуйста


А>struct MY_BITMAPINFO

А>{ BITMAPINFOHEADER bmiHeader;
А> RGBQUAD bmiColors[30];
А>};
А>MY_BITMAPINFO *bmp_data=new MY_BITMAPINFO;
А вот здесь неплохо сделать memset( bmp_data, 0, sizeof(MY_BITMAPINFO) ), там ведь есть еще поля!

А> bmp_data->bmiHeader.biSize=sizeof(BITMAPINFOHEADER);

А> bmp_data->bmiHeader.biBitCount=8;
А> bmp_data->bmiHeader.biPlanes=1;
А> bmp_data->bmiHeader.biCompression=BI_RGB;
А> bmp_data->bmiHeader.biClrUsed=30;
А> bmp_data->bmiHeader.biClrImportant=30;
Интересно, bitCount==8, а значения RGB?

А> for (int i=0;i < 30;i++)

А> bmp_data->bmiColors[i]=TO_RGB(8*i,8*i,8*i);
А> bmp_data->bmiColors[30-1]=TO_RGB(0,160,0);
А> bmp_data->bmiColors[30-2]=TO_RGB(255,255,255);
А> bmp_data->bmiColors[30-3]=TO_RGB(0,0,0);
А> bmp_data->bmiColors[30-4]=TO_RGB(128,128,128);
А> bmp_data->bmiColors[30-5]=TO_RGB(192,192,192);
А> bmp_data->bmiColors[30-6]=TO_RGB(0,0,160);
А> bmp_data->bmiColors[30-7]=TO_RGB(255,0,0);
А> bmp_data->bmiColors[30-8]=TO_RGB(255,255,0);
А> bmp_data->bmiColors[30-9]=TO_RGB(160,0,0); // TO_RGB возвращает объект RGBQUAD по заданым оттенкам

А>я что-то забыл сделать ?
Re[4]: SetDIBits() в Win98 и WinNT
От: Michail_TV  
Дата: 25.09.03 06:15
Оценка:
Здравствуйте, Вадим Никулин, Вы писали:

А>>MY_BITMAPINFO *bmp_data=new MY_BITMAPINFO;

ВН>А вот здесь неплохо сделать memset( bmp_data, 0, sizeof(MY_BITMAPINFO) ), там ведь есть еще поля!

Насколько я знаю, все используемые поля мною заполняются. (см первое сообщение)
не заполняются только biXPelsPerMeter и biУPelsPerMeter

А если их надо заполнить, то почему, по-вашему, именно нулями?
Нехорошо же так?

ВН>Интересно, bitCount==8, а значения RGB?


bitCount отвечает за размер массива, а не за цветность
а RGB — потому что моя палитра (256 цветов) отличается от системной
и я ее записываю сам руками, а в палитре должно быть в RGB виде
Что ли нет ?
Re: SetDIBits() в Win98 и WinNT
От: Michail_TV  
Дата: 26.09.03 04:50
Оценка:
M_T>Подскажите, какие отличия в использовании SetDIBits() под 98 и NT ?
M_T>У меня в 98 все работает (почти всегда), а под NT (2000 и ХР) работает через раз
M_T>или не работает совсем. Говорит "Недостаточно памяти для выполнения команды".

Еще смешнее, когда SetDIBits(...) возвращает ошибку с кодом 0 (ноль)
а ОС говорит, что это значит Error_Success или No_Error %-|

растолкуйте мне пожалуйста, в чем дело-то ?
Re[2]: SetDIBits() в Win98 и WinNT
От: Андрей Россия  
Дата: 26.09.03 05:18
Оценка:
Здравствуйте, Michail_TV, Вы писали:

skip

M_T>Еще смешнее, когда SetDIBits(...) возвращает ошибку с кодом 0 (ноль)

M_T>а ОС говорит, что это значит Error_Success или No_Error %-|

M_T>растолкуйте мне пожалуйста, в чем дело-то ?


И ОС абсолютно права
Если ты хочешь получить описание ошибки, используй GetLastError() в том случае, если SetDIBits вернула 0
Re[3]: SetDIBits() в Win98 и WinNT
От: Michail_TV  
Дата: 08.10.03 10:50
Оценка:
Здравствуйте, Андрей, Вы писали:

А>И ОС абсолютно права

А>Если ты хочешь получить описание ошибки, используй GetLastError() в том случае, если SetDIBits вернула 0

дык я же и говорю, что
GetLastError() возвращает Ноль (что значит — "Все в порядке")
даже в том случае, когда SetDIBits(...) тоже нолик возвращает
(что означает — "Ноль строк перенесено/установлено").
я почему и удивляюсь...
Re[4]: SetDIBits() в Win98 и WinNT
От: Андрей Россия  
Дата: 08.10.03 11:03
Оценка:
Здравствуйте, Michail_TV, Вы писали:

skip

Из того кода, что ты привел, трудно сделать какие-либо предположения.
Но непонятно, зачем вызывать ReleaseDC и DeleteDC для одного и того же dc? Для контекста, полученного через CreateCompatibleDC, нужно вызывать DeleteDC, а вот для полученного через GetDC — ReleaseDC.

Так что убери вызов ReleaseDC, может быть и поможет — чем черт не шутит, пока Бог спит
Re[5]: SetDIBits() в Win98 и WinNT
От: Michail_TV  
Дата: 10.10.03 06:14
Оценка:
Здравствуйте, Андрей, Вы писали:

А>Из того кода, что ты привел, трудно сделать какие-либо предположения.

А>Но непонятно, зачем вызывать ReleaseDC и DeleteDC для одного и того же dc? ...

Я уж пробовал всяко разно комбинировать и убирать — НЕ ПОМОГАЕТ !

Выяснил попутно, что если стоит _RGB_COLORS последняя константа,
то первый device_context в SetDIBits(...) НЕ Игнорируется;
или по крайней мере, если вместо него поставить NULL, то еще хуже работает.

Может я зря эти функции пользую, вдруг другой способ есть ?
Re[6]: SetDIBits() в Win98 и WinNT
От: Андрей Россия  
Дата: 10.10.03 06:56
Оценка:
Здравствуйте, Michail_TV, Вы писали:

skip

M_T>Может я зря эти функции пользую, вдруг другой способ есть ?


С этого и надо было начинать
А что ты вообще делаешь? Из кода, приведенного тобой, не ясно, для чего вся эта бодяга затеяна
Re[7]: SetDIBits() в Win98 и WinNT
От: Michail_TV  
Дата: 14.10.03 10:29
Оценка:
Здравствуйте, Андрей, Вы писали:

А>А что ты вообще делаешь? Из кода, приведенного тобой, не ясно...


Моя задача — нарисовать картинку БЫСТРО.
Картинка состоит из линий.
Рисовать стандартными средствами Borland Builder — ДОЛГО.
Вот и мучусь. Идея то проста — нарисовать в массиве картинку, а потом ее запихнуть в нечто стандартное —
в BitMap например. Чтоб оттуда брать если надо.

А вообще эта "бодяга" — моя РАБОТА.
Re[8]: SetDIBits() в Win98 и WinNT
От: Андрей Россия  
Дата: 14.10.03 10:36
Оценка:
Здравствуйте, Michail_TV, Вы писали:

skip

А не проще ли тогда в memory context рисовать? При этом ты получаешь bitmap, который потом можно быстро рендерить куда надо?
Re[9]: SetDIBits() в Win98 и WinNT
От: Michail_TV  
Дата: 16.10.03 07:38
Оценка:
Здравствуйте, Андрей, Вы писали:

А>А не проще ли тогда в memory context рисовать? При этом ты получаешь bitmap, который потом можно быстро рендерить куда надо?


Возможно. Тогда подскажите как или с чего начать ...?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.