crossplatform.ru

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

7 страниц V  « < 2 3 4 5 6 > »   
Ответить в данную темуНачать новую тему
> Как узнать местоположение виджета
SABROG
  опции профиля:
сообщение 4.3.2009, 12:10
Сообщение #31


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

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

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




Репутация:   34  


Цитата(AD @ 4.3.2009, 12:09) *
Цитата(SABROG @ 4.3.2009, 11:51) *
Скорее в paintEvent. Но что-то мне подсказывает, что изначально решение какой-то проблемы выбрано не правильно.

Тогда как правильно? :)

Пока не знаю, ты ведь не озвучил зачем тебе нужно узнавать позицию окна.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 4.3.2009, 12:15
Сообщение #32


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

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

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




Репутация:   17  


Цитата(SABROG @ 4.3.2009, 12:10) *
Пока не знаю, ты ведь не озвучил зачем тебе нужно узнавать позицию окна.

Смысл такой: я хочу переопределить этот виджет, для того, чтобы поместить туда картинку карты, ну соответственно и возможность работы с ней: масштабирование, перемещение по карте, выделение определенной области и т.п.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
kwisp
  опции профиля:
сообщение 4.3.2009, 12:22
Сообщение #33


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

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

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




Репутация:   23  


Цитата(AD @ 4.3.2009, 12:15) *
Смысл такой: я хочу переопределить этот виджет, для того, чтобы поместить туда картинку карты, ну соответственно и возможность работы с ней: масштабирование, перемещение по карте, выделение определенной области и т.п.

AD,
а зачем тебе позиция для "переопределения" и что понимается под "переопределением"???
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 4.3.2009, 13:04
Сообщение #34


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

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

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




Репутация:   17  


Цитата(kwisp @ 4.3.2009, 12:22) *
AD,
а зачем тебе позиция для "переопределения" и что понимается под "переопределением"???

переопределение:
class MyWidget: public QWidget
{
protected:
void paintEvent(QPaintEvent* event) {/* ... */}
void wheelEvent(QWheelEvent* event) {/* ... */}
};

Ну вот так например!

А точное местоположение нужно, для того, чтобы картинка попала ровно в этот виджет.
Вот в эти функции подставлять буду
void SaharaInit(int dx, int dy);
void SetBitmapSize(int dx, int dy);
void SetBitmapSize(int Xbeg, int Ybeg, int Xend, int Yend);


Сообщение отредактировал AD - 4.3.2009, 13:06
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 4.3.2009, 13:10
Сообщение #35


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

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

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




Репутация:   34  


А зачем SaharaInit координаты виджета?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 4.3.2009, 13:26
Сообщение #36


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

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

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




Репутация:   17  


Цитата(SABROG)
А зачем SaharaInit координаты виджета?

Тем самым определяются, куда эту карту рисовать. Что неясного-то? :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 4.3.2009, 13:35
Сообщение #37


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(AD @ 4.3.2009, 16:26) *
Тем самым определяются, куда эту карту рисовать. Что неясного-то?
дак ты ее не клади как в WinAPI по координатам, если она картинка - устанвливай ее в объект QLable, а его суй в компоновщик нужного виджета.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 4.3.2009, 13:49
Сообщение #38


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

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

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




Репутация:   17  


Вот некоторая реализация отрисовки карты:
Sahara
/// Класс набора необходимых Сахаровских классов
class SubSahara
{
protected:
    SPOINT spSize;
    SPOINT begSize;
TImageDrawer*        pImageDrawer;
TImageManager*        pImageManager;
    MEM256Display*        pDisplay;
    MEM256Device*       pDevice;
#ifdef Q_WS_WIN
        BITMAPINFO*         pBmi;
    #endif // Q_WS_WIN

protected:
    void SaharaInit(int dx, int dy);
    void SaharaShutdown();
    void FillBitmapInfo();

public:
    SubSahara(int iWigth, int iHeight);
#ifdef Q_WS_WIN
        void Draw(HDC hdc);
    #endif // Q_WS_WIN
void SetBitmapSize(int Xbeg, int Ybeg, int Xend, int Yend);
};


/// Заполнение картинки (для 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
}

/// Констуктор: все указатели наобъекты инициируются нулевыми указателями
SubSahara::SubSahara(int iWigth, int iHeight): pImageDrawer(0), pDisplay(0),
        pImageManager(0),  pDevice(0)
        #ifdef Q_WS_WIN
            , pBmi(static_cast<BITMAPINFO*> (HeapAlloc(GetProcessHeap(), 0, sizeof(BITMAPINFO) + sizeof(RGBQUAD) * 256)))
        #endif // Q_WS_WIN
{
    SaharaInit(iWigth, iHeight);
}


// Инициализация указателей на объекты соответствующими классами
void SubSahara::SaharaInit(int dx, int dy)
{
    spSize = SPOINT(dx, dy);

    pDisplay = new MEM256Display(*pRL);
    pImageManager = new TImageManager(*pDisplay);

    pDevice = new MEM256Device(*pDisplay, spSize);
    #ifdef Q_WS_WIN
        FillBitmapInfo();
    #endif // Q_WS_WIN
}

/// Установка размера картинки
void SubSahara::SetBitmapSize(int Xbeg, int Ybeg, int Xend, int Yend)
{
    if(spSize.x != Xend || spSize.y != Yend)
    {
        spSize = SPOINT(Xend, Yend);
        begSize = SPOINT(Xbeg, Ybeg);
        pImageDrawer -> SetBoundRect(SRECT(SPOINT(0, 0), spSize));
        pDevice -> SetSize(spSize);
        #ifdef Q_WS_WIN
            FillBitmapInfo();
        #endif // Q_WS_WIN
    }
}

/// Функция отрисовки карты (для Windows)
#ifdef Q_WS_WIN
void SubSahara::Draw(HDC hdc)
{
    if(!bInit) return;

    for(int y = begSize.y; y < spSize.y; y++)
    {
            SetDIBitsToDevice(hdc,                        ///< handle to DC
                begSize.x,                              ///< x-coord of destination upper-left corner
                y,                                        ///< y-coord of destination upper-left corner
                spSize.x,                                ///< source rectangle width
                1,                                        ///< source rectangle height
                0,                                        ///< x-coord of source lower-left corner
                0,                                        ///< y-coord of source lower-left corner
                0,                                        ///< first scan line in array
                1,                                        ///< number of scan lines
                                                        ///< array of DIB bits
                (CONST VOID *)(pDevice->GetSurface() + spSize.x * y),
                pBmi,                                    ///< bitmap information
                DIB_RGB_COLORS);
    }
}
#endif // Q_WS_WIN


Вот именно этой функцией и происходит само рисование:
void SubSahara::Draw(HDC hdc)


Цитата(Litkevich Yuriy)
дак ты ее не клади как в WinAPI по координатам, если она картинка - устанвливай ее в объект QLable, а его суй в компоновщик нужного виджета.

Я привел кусок кода, который выполняет отрисовку. Подскажи, пожалуйста, как изменить функции таким образом, чтобы можно было избавиться от этого WINAPI-кода. Тогда в моем другом проекте (TLV, результаты которого я приводил) я избавлюсь от кода, зависящего от Widows!

Сообщение отредактировал AD - 4.3.2009, 13:53
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 4.3.2009, 13:56
Сообщение #39


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


Цитата(AD @ 4.3.2009, 16:49) *
Подскажи, пожалуйста, как изменить функции таким образом
я человек ленивый, и мне лениво изучать код. Давай на пальцах объясняй как и что у тебя работает.

Например так:
Цитата
Есть картинка (какой формат)-> надо поместить в Q***widget.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 4.3.2009, 14:07
Сообщение #40


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

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

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




Репутация:   17  


Ну и ну....
Есть картинка - BITMAP.
Необходимо засунуть в переопределенном QWidget.
указанная функция Draw вызывается в paintEvent() переопределенного виджета.
указанные координаты для заполнения SPOINT spSize; SPOINT begSize! Эти координаты используются в Draw вот здесь:
for(int y = begSize.y; y < spSize.y; y++)
    {
            //SetDIBitsToDevice(hdc,
    }

Чем и что можно заменить, если хочется переделать в более универсальный код?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 1.12.2024, 23:46