Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: jasf от Февраль 24, 2012, 09:49



Название: QPixmap курсора в Windows 7 (32 bit) [РЕШЕНО]
Отправлено: 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.


Название: Re: QPixmap курсора в Windows 7 (32 bit)
Отправлено: Bepec от Февраль 24, 2012, 10:14
Эммм.... Pixmap самого курсора, или Pixmap области рядом с курсором?


Название: Re: QPixmap курсора в Windows 7 (32 bit)
Отправлено: jasf от Февраль 24, 2012, 13:18
Pixmap самого курсора. Точнее его иконку, что бы с полупрозрачностью.


Название: Re: QPixmap курсора в Windows 7 (32 bit) [РЕШЕНО]
Отправлено: jasf от Февраль 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;
}