Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: StretchDIBits  (Прочитано 13055 раз)
0 Пользователей и 3 Гостей смотрят эту тему.
Marya
Гость
« : 24-01-2010 12:28 » 

Подскажите, пожалуйста, в чём может быть дело:

Использую функцию StretchDIBits для вывода на экран картинок, в случае, если прямоугольники одинакового размера, всё работает; если значением последнего параметра ставлю SRCPAINT или SRCINVERT или SRCAND - тоже всё работает правильно даже при изменении размера одного из прямоугольников, но если ставлю SRCCOPY, то при неравных размерах вместо изображений всё закрашивается чёрным, хотя ошибки не возникает (функция возвращает положительное значение, как будто всё нарисовала).
Записан
Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #1 : 24-01-2010 22:09 » new

А чуть подробней? Желательно с кодом.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Marya
Гость
« Ответ #2 : 25-01-2010 04:56 » 

Вот такой код:

Код:
    m_hdc = CreateCompatibleDC( hdc );
    bitmap = CreateCompatibleBitmap( hdc, SCREEN_WIDTH_MAX, SCREEN_HEIGTH_MAX );
    
    GetObject(bitmap, sizeof(bm), (LPSTR)&bm);
    biBits = bm.bmPlanes * bm.bmBitsPixel;
    m_bi.biSize          = sizeof(BITMAPINFOHEADER);
    m_bi.biWidth         = bm.bmWidth;
    m_bi.biHeight        = -bm.bmHeight;
    m_bi.biPlanes        = 1;
    m_bi.biBitCount      = 32,//24;
    m_bi.biCompression   = BI_RGB;
    m_bi.biSizeImage     = 0;
    m_bi.biXPelsPerMeter = 0;
    m_bi.biYPelsPerMeter = 0;
    m_bi.biClrUsed       = 0;
    m_bi.biClrImportant  = 0;

    dwLen = m_bi.biSize;
    hdib = GlobalAlloc(GHND, dwLen);
    lpbi = (BITMAPINFOHEADER FAR *)GlobalLock(hdib);
    *lpbi = m_bi;

    rez = GetDIBits( hdc, bitmap, 0, (WORD)m_bi.biHeight, NULL, (LPBITMAPINFO)lpbi, DIB_RGB_COLORS );

    m_bmi.bmiColors[0].rgbRed = 0;
    m_bmi.bmiColors[0].rgbGreen  = 0;
    m_bmi.bmiColors[0].rgbBlue  = 0;
    m_bmi.bmiColors[0].rgbReserved   = 0;
    m_bmi.bmiHeader = m_bi;

    DeleteObject( bitmap );

{...}
    p_imgpar[m_num].m_bitmap = CreateDIBSection(m_hdc, &m_bmi, DIB_RGB_COLORS, &p_imgpar[m_num].pbuf, NULL, 0);
    if( p_imgpar[m_num].m_bitmap == NULL ) return false;
    GdiFlush();

{...}

    // рисование картинки
    SelectObject( m_hdc, p_imgpar[m_num].m_bitmap );

    for(i1=0; i1<factor; i1++){
    for(i2=0; i2<factor; i2++){
for(r1=0; r1<h1; r1++){
   y_d = y + (int)(r1) + i1;
   if( y_d >= 0 ){
   for(int r2=0; r2<(w1); r2++){
        x_d = x + (int)(r2) + i2;
if( x_d >= 0 ){
p = (char *)( p_imgpar[m_num].pbuf) + (y_d*SCREEN_WIDTH_MAX + x_d )*4;
ps = row_pointer + (  (int)(r1/factor)*width + (int)(r2/factor)   )*3;
        *( p+3 ) =  0;
*( p+2 ) =  *( ps );
*( p+1 ) =  *( ps+1 );
*( p+0 ) =  *( ps+2 );
}
   }
}
    }
    }
}


{...}
// вывод картинки на экран
SelectObject( m_hdc, p_imgpar[num].m_bitmap );
rez = StretchDIBits(p_hdc, x, y, w, h, 0, 0, 160, 160,
p_imgpar[num].pbuf, &m_bmi, DIB_RGB_COLORS, SRCCOPY);//SRCPAINT);
« Последнее редактирование: 25-01-2010 05:35 от Вад » Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 25-01-2010 06:41 » 

Marya, лучше небольшой работающий проектик с данным кодом. Начал разбираться - то не определено, это не определено, нету на это времени (

Сложные расчёты графики тоже ни к чему - простого примера достаточно
Записан

Marya
Гость
« Ответ #4 : 25-01-2010 06:46 » 

Вместо  
rez = StretchDIBits(p_hdc, x, y, w, h, 0, 0, 160, 160, p_imgpar[num].pbuf, &m_bmi, DIB_RGB_COLORS, SRCCOPY);
подставила
rez = StretchBlt( p_hdc, x, y, w, h, m_hdc, 0, 0, 160, 160, SRCCOPY);
- заработало  Отлично
Проблема, конечно решилась каким-то образом, но всё-таки хотелось бы понять, почему StretchDIBits не заработала  Не понял.
Цитата
Marya, лучше небольшой работающий проектик с данным кодом. Начал разбираться - то не определено, это не определено, нету на это времени (
Работающий проектик постараюсь сегоня нарисовать, потому что интересно всё-таки понять в чём тут дело.
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 25-01-2010 07:10 » 

О, я и не обратил внимание на то, что у тебя StretchDIBits вместо StretchBlt Улыбаюсь Я первую функцию и не применял никогда, вторая не подводила - она именно для копирования с контекста на контекст

А почему не работеат StretchDIBits - надо экспериментировать Улыбаюсь Если это вообще нужно. Но то, что хочешь понять причину глюка - это супер похвально Улыбаюсь Лишь бы начальство время на это выделило Ага
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #6 : 25-01-2010 07:51 » 

Да, для этого надо в дебаге посмотреть внимательно на параметры всех участвующих в операции объектов и структур (p_imgpar, m_bmi ) и сверить их валидность с документацией.
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Marya
Гость
« Ответ #7 : 25-01-2010 11:59 » 

На простом примере StretchDIBits заработала - наверное что-то с динамическим выделением памяти не сраслось, но это уже другая опера. Спасибо за поддержку  Улыбаюсь
Записан
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #8 : 25-01-2010 12:10 » 

Marya, Улыбаюсь
Записан

Джон
просто
Администратор

de
Offline Offline
Пол: Мужской

« Ответ #9 : 26-01-2010 08:04 » 

Вероятность адекватного срабатывания ф-ци, обратно пропорциональна количеству передаваемых в ф-ю параметров. Ага
Записан

Я вам что? Дурак? По выходным и праздникам на работе работать. По выходным и праздникам я работаю дома.
"Just because the language allows you to do something does not mean that it’s the correct thing to do." Trey Nash
"Physics is like sex: sure, it may give some practical results, but that's not why we do it." Richard P. Feynman
"All science is either physics or stamp collecting." Ernest Rutherford
"Wer will, findet Wege, wer nicht will, findet Gründe."
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines