crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

7 страниц V  « < 4 5 6 7 >  
Ответить в данную темуНачать новую тему
> Как узнать местоположение виджета
AD
  опции профиля:
сообщение 4.3.2009, 15:59
Сообщение #51


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата(SABROG @ 4.3.2009, 15:20) *
А парсера ARC/INFO формата нету?

Нет.

Наконец знаю как правильно задать вопрос еще один.
Какой функцией у QImage я могу заменить API-шную функцию SetDIBitsToDevice, которая на HDC отрисовывает пополосно карту?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 4.3.2009, 16:40
Сообщение #52


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Так уже у меня что-то получается. Выбрал QImage.
SubSahara::SubSahara(int iWidth, int iHeight): /* что-то другое*/, bitmap(new QImage(iWidth, iHeight, QImage::Format_ARGB32))
{
    SaharaInit(iWidth, iHeight);
}

/// Функция отрисовки карты
void SubSahara::Draw(QPainter* painter)
{ painter -> drawImage(QPoint(0, 0), *bitmap); }


Теперь бы узнать, как правильно этот QImage заполнить и проблем не будет. Т.е. надо найти замену функции FillBitmapInfo():
/// Заполнение картинки (для Windows)
void SubSahara::FillBitmapInfo()
{
    #ifdef Q_WS_WIN
        memset(pBmi,0,sizeof(BITMAPINFO) + sizeof(RGBQUAD) * 256);
        pBmi -> bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
        pBmi -> bmiHeader.biWidth = spSize.x;
        pBmi -> bmiHeader.biHeight = spSize.y;
        pBmi -> bmiHeader.biPlanes = 1;
        pBmi -> bmiHeader.biBitCount = 8;
        pBmi -> bmiHeader.biCompression = BI_RGB;
        pBmi -> bmiHeader.biSizeImage = 0;
        pBmi -> bmiHeader.biClrUsed = pDisplay -> PaletteSize();
        pBmi -> bmiHeader.biClrImportant = 0;

        for(int i = 0; i < pBmi->bmiHeader.biClrUsed; ++i)
        {
            pBmi -> bmiColors[i].rgbRed = pDisplay -> GetPaletteR(i);
            pBmi -> bmiColors[i].rgbGreen = pDisplay -> GetPaletteG(i);
            pBmi -> bmiColors[i].rgbBlue = pDisplay -> GetPaletteB(i);
        }
    #endif // Q_WS_WIN
}

Пока что сделал так (но это ничего не дало):
/// Заполнение картинки (для Windows)
void SubSahara::FillBitmapInfo()
{
    bitmap -> setNumColors(pDisplay -> PaletteSize());
    for(int i=0; i<bitmap -> numColors(); ++i)
    {
        QColor color(pDisplay -> GetPaletteR(i), pDisplay -> GetPaletteG(i), pDisplay -> GetPaletteB(i));
        bitmap -> setColor(i, color.rgb());
    }
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 4.3.2009, 17:01
Сообщение #53


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


FillBitmapInfo не нужен вообще имхо, это структура которая передается в SetDIBitsToDevice.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 4.3.2009, 17:07
Сообщение #54


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Цитата
FillBitmapInfo не нужен вообще имхо, это структура которая передается в SetDIBitsToDevice.

вах! А я и не додумался! :)

Это все ясно! Дело в том, что именно благодаря коду в указанной функции происходит отрисовка карты. Каким образом заполнить QImage так, чтобы эффект был тот же?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 4.3.2009, 17:11
Сообщение #55


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(AD @ 4.3.2009, 17:07) *
Цитата
FillBitmapInfo не нужен вообще имхо, это структура которая передается в SetDIBitsToDevice.

вах! А я и не додумался! :)

Это все ясно! Дело в том, что именно благодаря коду в указанной функции происходит отрисовка карты. Каким образом заполнить QImage так, чтобы эффект был тот же?

Если код сахары брал картинку и рисовал на некоторую область и только, то просто тупо можно передать картинку в QLabel.
Если помимо картинки надо на нее что-то рисовать или проводить трансформацию, или отображать только какую-то её часть, то QPainter + QImage, которому передается картинка и больше ничего не надо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 4.3.2009, 17:52
Сообщение #56


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Оказывается необходимо использовать функцию setPixel(). В качестве аргументов она имеет позицию картинки. Каким образом я могу разделить заполнение пикселей и саму отрисовку. В BITMAPINFO это и было сделано. А как это в QImage?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 4.3.2009, 17:55
Сообщение #57


астарожна ынтжинэр
*****

Группа: Участник
Сообщений: 1404
Регистрация: 26.11.2008
Из: ТаганрогРодинаЧехова
Пользователь №: 435

Спасибо сказали: 113 раз(а)




Репутация:   23  


AD,
в QImage есть setPixel();
см
Pixel Manipulation

Цитата(AD @ 4.3.2009, 17:52) *
Каким образом я могу разделить заполнение пикселей и саму отрисовку.


сначала заполни сохрани потом отрисуй.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 4.3.2009, 17:57
Сообщение #58


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(AD @ 4.3.2009, 17:52) *
Оказывается необходимо использовать функцию setPixel(). В качестве аргументов она имеет позицию картинки. Каким образом я могу разделить заполнение пикселей и саму отрисовку. В BITMAPINFO это и было сделано. А как это в QImage?

Вот я в блоге недавно такое делал. http://vingrad.ru/blogs/sabrog/2009/01/27/...aya-animatsiya/
Т.е. рисую на картинку все что нужно, а потом эту картинку отрисовываю. Правда я рисовал QPainter'ом, но никто не запрещает через QImage::setPixel(x,y)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 4.3.2009, 19:03
Сообщение #59


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

Спасибо сказали: 70 раз(а)




Репутация:   17  


Извините, что достал вопросами, но просто необходимо сделать хороший вариант без зависимости от местоположения виджета. Подсказали следующий вариант:
/// Заполнение картинки
void SubSahara::FillBitmapInfo()
{
    int i = 0;
    for(int y=0; y<bitmap -> height(); ++y)
    {
        uchar *p = bitmap -> scanLine(y);
        for(int x=0; x<bitmap -> width(); ++x)
        {
            p[0] = 255;
            p[1] = pDisplay -> GetPaletteR(i);
            p[2] = pDisplay -> GetPaletteG(i);
            p[3] = pDisplay -> GetPaletteB(i);
            ++i;
            p += 4;
        }
    }
}

Но есть проблема. Как видно из данного кода i = width * height. НО должно быть
i < pDisplay -> PaletteSize(), поэтому в программе происходит сбой. Если я добавляю след. строки, то выходит не карта, а фигня:
/// same
for(int x=0; x<bitmap -> width(); ++x)
{
        if(i >= pDisplay -> PaletteSize()) i %= pDisplay -> PaletteSize();
    p[0] = 255;
    p[1] = pDisplay -> GetPaletteR(i);
/// same
}
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 4.3.2009, 20:11
Сообщение #60


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Я например не пойму что этот код делает вообще, для меня это перестановка цифр и какие-то операции над ними. Все-равно что дать человеку формулу круга и не сказать, что с помощью неё его можно нарисовать.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

7 страниц V  « < 4 5 6 7 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


5 чел. читают эту тему (гостей: 5, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 29.11.2024, 13:44