Подскажите, какие отличия в использовании 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
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, 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 по заданым оттенкам
А>я что-то забыл сделать ?
Здравствуйте, Вадим Никулин, Вы писали:
А>>MY_BITMAPINFO *bmp_data=new MY_BITMAPINFO; ВН>А вот здесь неплохо сделать memset( bmp_data, 0, sizeof(MY_BITMAPINFO) ), там ведь есть еще поля!
Насколько я знаю, все используемые поля мною заполняются. (см первое сообщение)
не заполняются только biXPelsPerMeter и biУPelsPerMeter
А если их надо заполнить, то почему, по-вашему, именно нулями?
Нехорошо же так?
ВН>Интересно, bitCount==8, а значения RGB?
bitCount отвечает за размер массива, а не за цветность
а RGB — потому что моя палитра (256 цветов) отличается от системной
и я ее записываю сам руками, а в палитре должно быть в RGB виде
Что ли нет ?
M_T>Подскажите, какие отличия в использовании SetDIBits() под 98 и NT ? M_T>У меня в 98 все работает (почти всегда), а под NT (2000 и ХР) работает через раз M_T>или не работает совсем. Говорит "Недостаточно памяти для выполнения команды".
Еще смешнее, когда SetDIBits(...) возвращает ошибку с кодом 0 (ноль)
а ОС говорит, что это значит Error_Success или No_Error %-|
skip
M_T>Еще смешнее, когда SetDIBits(...) возвращает ошибку с кодом 0 (ноль) M_T>а ОС говорит, что это значит Error_Success или No_Error %-|
M_T>растолкуйте мне пожалуйста, в чем дело-то ?
И ОС абсолютно права
Если ты хочешь получить описание ошибки, используй GetLastError() в том случае, если SetDIBits вернула 0
Здравствуйте, Андрей, Вы писали:
А>И ОС абсолютно права А>Если ты хочешь получить описание ошибки, используй GetLastError() в том случае, если SetDIBits вернула 0
дык я же и говорю, что
GetLastError() возвращает Ноль (что значит — "Все в порядке")
даже в том случае, когда SetDIBits(...) тоже нолик возвращает
(что означает — "Ноль строк перенесено/установлено").
я почему и удивляюсь...
Из того кода, что ты привел, трудно сделать какие-либо предположения.
Но непонятно, зачем вызывать ReleaseDC и DeleteDC для одного и того же dc? Для контекста, полученного через CreateCompatibleDC, нужно вызывать DeleteDC, а вот для полученного через GetDC — ReleaseDC.
Так что убери вызов ReleaseDC, может быть и поможет — чем черт не шутит, пока Бог спит
Здравствуйте, Андрей, Вы писали:
А>Из того кода, что ты привел, трудно сделать какие-либо предположения. А>Но непонятно, зачем вызывать ReleaseDC и DeleteDC для одного и того же dc? ...
Я уж пробовал всяко разно комбинировать и убирать — НЕ ПОМОГАЕТ !
Выяснил попутно, что если стоит _RGB_COLORS последняя константа,
то первый device_context в SetDIBits(...) НЕ Игнорируется;
или по крайней мере, если вместо него поставить NULL, то еще хуже работает.
Может я зря эти функции пользую, вдруг другой способ есть ?
Здравствуйте, Андрей, Вы писали:
А>А что ты вообще делаешь? Из кода, приведенного тобой, не ясно...
Моя задача — нарисовать картинку БЫСТРО.
Картинка состоит из линий.
Рисовать стандартными средствами Borland Builder — ДОЛГО.
Вот и мучусь. Идея то проста — нарисовать в массиве картинку, а потом ее запихнуть в нечто стандартное —
в BitMap например. Чтоб оттуда брать если надо.
Здравствуйте, Андрей, Вы писали:
А>А не проще ли тогда в memory context рисовать? При этом ты получаешь bitmap, который потом можно быстро рендерить куда надо?
Возможно. Тогда подскажите как или с чего начать ...?