Russian Qt Forum
Май 05, 2024, 06:03 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QPixmap курсора в Windows 7 (32 bit) [РЕШЕНО]  (Прочитано 4563 раз)
jasf
Гость
« : Февраль 24, 2012, 09:49 »

Здравствуйте.
Не получается вытащить QPixmap курсора.
Делаю так:

Код:
CURSORINFO cinfo;
cinfo.cbSize = sizeof(CURSORINFO);
::GetCursorInfo(&cinfo);
QPixmap picon = QPixmap::fromWinHICON(cinfo.hCursor);

Почти нерабочий метод. Дефолный курсор (стрелочка) при таком варианте возвращает picon.size == QSize(0,0).
Хорошо отображаются только курсоры, устанавливаемые в QtCreator.
Иногда возвращает мусор, похожий на миниатюру курсора.

Подскажите пожалуйста, как получить QPixmap курсора в Windows.
« Последнее редактирование: Февраль 24, 2012, 19:52 от jasf » Записан
Bepec
Гость
« Ответ #1 : Февраль 24, 2012, 10:14 »

Эммм.... Pixmap самого курсора, или Pixmap области рядом с курсором?
Записан
jasf
Гость
« Ответ #2 : Февраль 24, 2012, 13:18 »

Pixmap самого курсора. Точнее его иконку, что бы с полупрозрачностью.
Записан
jasf
Гость
« Ответ #3 : Февраль 24, 2012, 19:53 »

В 95% случаев работает.

Код:
QPixmap topPart(QPixmap pixmap)
{
    QSize size(pixmap.width(), pixmap.height()/2);
    return pixmap.copy(QRect(QPoint(), size));
}

QPixmap bottomPart(QPixmap pixmap)
{
    QSize size(pixmap.width(), pixmap.height()/2);
    return pixmap.copy(QRect(QPoint(0, size.height()), size));
}

void drawTop(QPixmap& dest, const QPixmap& src)
{
    QPainter p(&dest);
    p.drawPixmap(QPoint(0,0), src);
}

QPixmap compileIcon(const QPixmap& p1Top, const QPixmap& p2Top, const QPixmap& p2Bottom)
{
    QPixmap result = p1Top;
    result.setMask(p2Top);
    drawTop(result, p2Bottom);
    return result;
}


QPixmap grabCurrentCursor()
{
    CURSORINFO cinfo;
    cinfo.cbSize = sizeof(CURSORINFO);
    bool result = ::GetCursorInfo(&cinfo);
    if(!result)
        return QPixmap();

    QPixmap pixmap;
    ICONINFO iconinfo = {0};
    GetIconInfo(cinfo.hCursor, &iconinfo);

    DIBSECTION dsBitmap;
    DIBSECTION dsMask;

    if(!::GetObject(iconinfo.hbmColor, sizeof DIBSECTION, &dsBitmap)) {
        if(::GetObject(iconinfo.hbmMask, sizeof DIBSECTION, &dsMask)) {
            QPixmap p1 = QPixmap::fromWinHBITMAP(iconinfo.hbmMask);
            QPixmap p2 = QPixmap::fromWinHBITMAP(iconinfo.hbmMask, QPixmap::Alpha);

            QPixmap p1Top = topPart(p1);
            QPixmap p2Top = topPart(p2);

            QPixmap p2Bottom = bottomPart(p2);

            pixmap = compileIcon(p1Top, p2Top, p2Bottom);
        }
        return pixmap;
    }

    pixmap = QPixmap::fromWinHBITMAP(iconinfo.hbmColor, QPixmap::Alpha);
    return pixmap;
}
« Последнее редактирование: Февраль 24, 2012, 19:54 от jasf » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.05 секунд. Запросов: 20.