2016-06-30 7 views
0

Я пытаюсь получить мой (ый) значок курсора мыши в QPixmap.Qt Windows получить значок курсора мыши

После прочтения документации Qt и MSDN я придумал этот кусок кода:

Я не уверен о смешивании HCURSOR и HICON, но я видел некоторые примеры, когда они делают это.

QPixmap MouseCursor::getMouseCursorIconWin() 
{ 
    CURSORINFO ci; 
    ci.cbSize = sizeof(CURSORINFO); 

    if (!GetCursorInfo(&ci)) 
     qDebug() << "GetCursorInfo fail"; 

    QPixmap mouseCursorPixmap = QtWin::fromHICON(ci.hCursor); 
    qDebug() << mouseCursorPixmap.size(); 

    return mouseCursorPixmap; 
} 

Однако мой размер mouseCursorPixmap всегда равен QSize (0,0). Что пошло не так?

+0

Почему вы думаете, 'член hCursor' из' CURSORINFO' структуры ручка иконы? – mvidelgauz

+0

Да, HCURSOR и HICON идентичны. Я понятия не имею, почему это не работает. Действительно ли 'ci.hCursor' содержит действительный дескриптор? Если это так, я полагаю, что проблема кроется в 'QtWin :: fromHICON', потому что я многократно использовал идентичный код для получения растрового изображения курсора мыши. –

+0

В соответствии с этим ответом: http://stackoverflow.com/questions/10469538/winapi-get-mouse-cursor-icon Они используют HCURSOR в DrawIcon() – eKKiM

ответ

0

Я понятия не имею, почему приведенный выше код не работает.

Однако следующий пример кода сделал работы:

QPixmap MouseCursor::getMouseCursorIconWin() 
{ 
    // Get Cursor Size 
    int cursorWidth = GetSystemMetrics(SM_CXCURSOR); 
    int cursorHeight = GetSystemMetrics(SM_CYCURSOR); 

    // Get your device contexts. 
    HDC hdcScreen = GetDC(NULL); 
    HDC hdcMem = CreateCompatibleDC(hdcScreen); 

    // Create the bitmap to use as a canvas. 
    HBITMAP hbmCanvas = CreateCompatibleBitmap(hdcScreen, cursorWidth, cursorHeight); 

    // Select the bitmap into the device context. 
    HGDIOBJ hbmOld = SelectObject(hdcMem, hbmCanvas); 

    // Get information about the global cursor. 
    CURSORINFO ci; 
    ci.cbSize = sizeof(ci); 
    GetCursorInfo(&ci); 

    // Draw the cursor into the canvas. 
    DrawIcon(hdcMem, 0, 0, ci.hCursor); 

    // Convert to QPixmap 
    QPixmap cursorPixmap = QtWin::fromHBITMAP(hbmCanvas, QtWin::HBitmapAlpha); 

    // Clean up after yourself. 
    SelectObject(hdcMem, hbmOld); 
    DeleteObject(hbmCanvas); 
    DeleteDC(hdcMem); 
    ReleaseDC(NULL, hdcScreen); 

    return cursorPixmap; 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^