10#include <QtGui/qbitmap.h>
11#include <QtGui/qimage.h>
12#include <QtGui/qbitmap.h>
13#include <QtGui/qguiapplication.h>
14#include <QtGui/qscreen.h>
15#include <QtGui/private/qguiapplication_p.h>
16#include <QtGui/private/qhighdpiscaling_p.h>
17#include <QtGui/private/qpixmap_win_p.h>
18#include <QtCore/private/qwinregistry_p.h>
20#include <QtCore/qdebug.h>
21#include <QtCore/qscopedpointer.h>
25#if QT_CONFIG(imageformat_png)
41 : bitmapCacheKey(
c.
pixmap().cacheKey()), maskCacheKey(0)
67 const qreal pixmapScaleFactor = scaleFactor /
pixmap.devicePixelRatio();
83 ii.xHotspot = DWORD(
qRound(hotSpot.
x() * scaleFactor));
84 ii.yHotspot = DWORD(
qRound(hotSpot.
y() * scaleFactor));
88 cur = CreateIconIndirect(&ii);
98 bool invb =
false,
bool invm =
false)
103 hotSpot.setX(
width / 2);
113 for (
int j = 0;
j <
n; ++
j) {
125 return CreateCursor(GetModuleHandle(
nullptr), hotSpot.x(), hotSpot.y(),
width,
height,
137 const QSize scaledSize = (
QSizeF(bbits.
size()) * scaleFactor).toSize();
158 if (
screen != primaryScreen) {
159 const qreal logicalDpi =
screen->logicalDpi().first;
160 const qreal primaryScreenLogicalDpi = primaryScreen->
logicalDpi().first;
162 return (
QSizeF(primaryScreenCursorSize) * logicalDpi / primaryScreenLogicalDpi).toSize();
166 return primaryScreenCursorSize;
169#if !QT_CONFIG(imageformat_png)
180 const QSize &bitmapTargetCursorSize,
183 const uchar *maskBits)
191 if (
qAbs(factor - 1.0) > 0.4) {
204 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
205 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
206 0x00, 0x80, 0x00, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xe0, 0x03, 0x00,
207 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
208 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xff, 0x7f, 0x00,
209 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x7f, 0x00,
210 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
211 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0xe0, 0x03, 0x00,
212 0x00, 0xc0, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
213 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
214 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
216 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
217 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00,
218 0x00, 0xc0, 0x01, 0x00, 0x00, 0xe0, 0x03, 0x00, 0x00, 0xf0, 0x07, 0x00,
219 0x00, 0xf8, 0x0f, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00,
220 0x00, 0xc0, 0x01, 0x00, 0x80, 0xff, 0xff, 0x00, 0x80, 0xff, 0xff, 0x00,
221 0x80, 0xff, 0xff, 0x00, 0x80, 0xff, 0xff, 0x00, 0x80, 0xff, 0xff, 0x00,
222 0x80, 0xff, 0xff, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0xc0, 0x01, 0x00,
223 0x00, 0xc0, 0x01, 0x00, 0x00, 0xf8, 0x0f, 0x00, 0x00, 0xf0, 0x07, 0x00,
224 0x00, 0xe0, 0x03, 0x00, 0x00, 0xc0, 0x01, 0x00, 0x00, 0x80, 0x00, 0x00,
225 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
226 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
228 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
229 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
230 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00,
231 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00,
232 0x00, 0x41, 0x82, 0x00, 0x80, 0x41, 0x82, 0x01, 0xc0, 0x7f, 0xfe, 0x03,
233 0x80, 0x41, 0x82, 0x01, 0x00, 0x41, 0x82, 0x00, 0x00, 0x40, 0x02, 0x00,
234 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00,
235 0x00, 0x40, 0x02, 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00,
236 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
237 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
238 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
240 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
241 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
242 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00,
243 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe2, 0x47, 0x00, 0x00, 0xe3, 0xc7, 0x00,
244 0x80, 0xe3, 0xc7, 0x01, 0xc0, 0xff, 0xff, 0x03, 0xe0, 0xff, 0xff, 0x07,
245 0xc0, 0xff, 0xff, 0x03, 0x80, 0xe3, 0xc7, 0x01, 0x00, 0xe3, 0xc7, 0x00,
246 0x00, 0xe2, 0x47, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00,
247 0x00, 0xe0, 0x07, 0x00, 0x00, 0xe0, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00,
248 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
249 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
250 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 };
252 0x80,0x01,0x58,0x0e,0x64,0x12,0x64,0x52,0x48,0xb2,0x48,0x92,
253 0x16,0x90,0x19,0x80,0x11,0x40,0x02,0x40,0x04,0x40,0x04,0x20,
254 0x08,0x20,0x10,0x10,0x20,0x10,0x00,0x00};
256 0x80,0x01,0xd8,0x0f,0xfc,0x1f,0xfc,0x5f,0xf8,0xff,0xf8,0xff,
257 0xf6,0xff,0xff,0xff,0xff,0x7f,0xfe,0x7f,0xfc,0x7f,0xfc,0x3f,
258 0xf8,0x3f,0xf0,0x1f,0xe0,0x1f,0x00,0x00};
260 0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x0d,0x48,0x32,0x08,0x50,
261 0x10,0x40,0x18,0x40,0x04,0x40,0x04,0x20,0x08,0x20,0x10,0x10,
262 0x20,0x10,0x20,0x10,0x00,0x00,0x00,0x00};
264 0x00,0x00,0x00,0x00,0x00,0x00,0xb0,0x0d,0xf8,0x3f,0xf8,0x7f,
265 0xf0,0x7f,0xf8,0x7f,0xfc,0x7f,0xfc,0x3f,0xf8,0x3f,0xf0,0x1f,
266 0xe0,0x1f,0xe0,0x1f,0x00,0x00,0x00,0x00};
268 static const char *
const moveDragCursorXpmC[] = {
294 static const char *
const copyDragCursorXpmC[] = {
299 "XX......................",
300 "XaX.....................",
301 "XaaX....................",
302 "XaaaX...................",
303 "XaaaaX..................",
304 "XaaaaaX.................",
305 "XaaaaaaX................",
306 "XaaaaaaaX...............",
307 "XaaaaaaaaX..............",
308 "XaaaaaaaaaX.............",
309 "XaaaaaaXXXX.............",
310 "XaaaXaaX................",
311 "XaaXXaaX................",
312 "XaX..XaaX...............",
313 "XX...XaaX...............",
314 "X.....XaaX..............",
315 "......XaaX..............",
316 ".......XaaX.............",
317 ".......XaaX.............",
318 "........XX...aaaaaaaaaaa",
319 ".............aXXXXXXXXXa",
320 ".............aXXXXXXXXXa",
321 ".............aXXXXaXXXXa",
322 ".............aXXXXaXXXXa",
323 ".............aXXaaaaaXXa",
324 ".............aXXXXaXXXXa",
325 ".............aXXXXaXXXXa",
326 ".............aXXXXXXXXXa",
327 ".............aXXXXXXXXXa",
328 ".............aaaaaaaaaaa"};
330 static const char *
const linkDragCursorXpmC[] = {
335 "XX......................",
336 "XaX.....................",
337 "XaaX....................",
338 "XaaaX...................",
339 "XaaaaX..................",
340 "XaaaaaX.................",
341 "XaaaaaaX................",
342 "XaaaaaaaX...............",
343 "XaaaaaaaaX..............",
344 "XaaaaaaaaaX.............",
345 "XaaaaaaXXXX.............",
346 "XaaaXaaX................",
347 "XaaXXaaX................",
348 "XaX..XaaX...............",
349 "XX...XaaX...............",
350 "X.....XaaX..............",
351 "......XaaX..............",
352 ".......XaaX.............",
353 ".......XaaX.............",
354 "........XX...aaaaaaaaaaa",
355 ".............aXXXXXXXXXa",
356 ".............aXXXaaaaXXa",
357 ".............aXXXXaaaXXa",
358 ".............aXXXaaaaXXa",
359 ".............aXXaaaXaXXa",
360 ".............aXXaaXXXXXa",
361 ".............aXXaXXXXXXa",
362 ".............aXXXaXXXXXa",
363 ".............aXXXXXXXXXa",
364 ".............aaaaaaaaaaa"};
366 switch (cursorShape) {
386struct QWindowsCustomPngCursor {
396 static const QWindowsCustomPngCursor pngCursors[] = {
421 const QWindowsCustomPngCursor *sEnd = pngCursors +
sizeof(pngCursors) /
sizeof(pngCursors[0]);
422 const QWindowsCustomPngCursor *bestFit =
nullptr;
423 int sizeDelta = INT_MAX;
424 for (
const QWindowsCustomPngCursor *
s = pngCursors;
s < sEnd; ++
s) {
425 if (
s->shape != cursorShape)
427 const int currentSizeDelta =
qMax(
s->size, cursorSize.
width()) -
qMin(
s->size, cursorSize.
width());
428 if (currentSizeDelta < sizeDelta) {
430 if (currentSizeDelta == 0)
432 sizeDelta = currentSizeDelta;
437 return PixmapCursor();
441 return PixmapCursor(rawImage,
QPoint(bestFit->hotSpotX, bestFit->hotSpotY));
471 switch (cursorShape) {
491 if (
s.shape == cursorShape) {
492 return static_cast<HCURSOR>(LoadImage(
nullptr,
s.resource, IMAGE_CURSOR,
493 0, 0, LR_DEFAULTSIZE | LR_SHARED));
497 qWarning(
"%s: Invalid cursor shape %d", __FUNCTION__, cursorShape);
508 if (
it == m_standardCursorCache.
end()) {
515HCURSOR QWindowsCursor::m_overriddenCursor =
nullptr;
516HCURSOR QWindowsCursor::m_overrideCursor =
nullptr;
526 if (
it == m_pixmapCursorCache.
end()) {
527 if (m_pixmapCursorCache.
size() > 50) {
531 const HCURSOR currentCursor = GetCursor();
532 for (
it = m_pixmapCursorCache.
begin();
it != m_pixmapCursorCache.
end() ; ) {
533 if (
it.value()->handle() != currentCursor)
584 qWarning(
"%s: Unable to obtain system cursor for %d",
585 __FUNCTION__, cursorIn->
shape());
594 SetCursor(m_overrideCursor);
600 if (
const auto overrideCursor = wcursor->
handle()) {
601 m_overrideCursor = overrideCursor;
602 const HCURSOR previousCursor = SetCursor(overrideCursor);
603 if (m_overriddenCursor ==
nullptr)
604 m_overriddenCursor = previousCursor;
606 qWarning(
"%s: Unable to obtain system cursor for %d",
613 if (m_overriddenCursor) {
614 SetCursor(m_overriddenCursor);
615 m_overriddenCursor = m_overrideCursor =
nullptr;
619 if (
it.value()->screen() == m_screen)
633 enum { cursorShowing = 0x1, cursorSuppressed = 0x2 };
634 CURSORINFO cursorInfo;
635 cursorInfo.cbSize =
sizeof(CURSORINFO);
636 if (GetCursorInfo(&cursorInfo)) {
637 if (cursorInfo.flags & cursorShowing)
639 if (cursorInfo.flags & cursorSuppressed)
666 if (!cursorSizeSetting.second)
667 return QSize(baseSize / 2, baseSize / 2);
670 int cursorSizeValue = cursorSizeSetting.first * m_screen->
logicalDpi().first
674 cursorSizeValue = (cursorSizeValue - 2 * baseSize) / baseSize;
675 const int cursorSize = baseSize + cursorSizeValue * (baseSize / 2);
676 return QSize(cursorSize, cursorSize);
683 if (m_copyDragCursor.
isNull())
685 return m_copyDragCursor;
688 if (m_moveDragCursor.
isNull())
690 return m_moveDragCursor;
692 if (m_linkDragCursor.
isNull())
694 return m_linkDragCursor;
699 static const char *
const ignoreDragCursorXpmC[] = {
704 "aa......................",
705 "aXa.....................",
706 "aXXa....................",
707 "aXXXa...................",
708 "aXXXXa..................",
709 "aXXXXXa.................",
710 "aXXXXXXa................",
711 "aXXXXXXXa...............",
712 "aXXXXXXXXa..............",
713 "aXXXXXXXXXa.............",
714 "aXXXXXXaaaa.............",
715 "aXXXaXXa................",
716 "aXXaaXXa................",
717 "aXa..aXXa...............",
718 "aa...aXXa...............",
719 "a.....aXXa..............",
720 "......aXXa.....XXXX.....",
721 ".......aXXa..XXaaaaXX...",
722 ".......aXXa.XaaaaaaaaX..",
723 "........aa.XaaaXXXXaaaX.",
724 "...........XaaaaX..XaaX.",
725 "..........XaaXaaaX..XaaX",
726 "..........XaaXXaaaX.XaaX",
727 "..........XaaX.XaaaXXaaX",
728 "..........XaaX..XaaaXaaX",
729 "...........XaaX..XaaaaX.",
730 "...........XaaaXXXXaaaX.",
731 "............XaaaaaaaaX..",
732 ".............XXaaaaXX...",
733 "...............XXXX....."};
735 if (m_ignoreDragCursor.
isNull()) {
737 ICONINFO iconInfo = {0, 0, 0,
nullptr,
nullptr};
738 GetIconInfo(
cursor, &iconInfo);
739 BITMAP bmColor = {0, 0, 0, 0, 0, 0,
nullptr};
741 if (iconInfo.hbmColor
742 && GetObject(iconInfo.hbmColor,
sizeof(BITMAP), &bmColor)
743 && bmColor.bmWidth == bmColor.bmWidthBytes / 4) {
744 const int colorBitsLength = bmColor.bmHeight * bmColor.bmWidthBytes;
745 auto *colorBits =
new uchar[colorBitsLength];
746 GetBitmapBits(iconInfo.hbmColor, colorBitsLength, colorBits);
747 const QImage colorImage(colorBits, bmColor.bmWidth, bmColor.bmHeight,
753 m_ignoreDragCursor =
QPixmap(ignoreDragCursorXpmC);
756 DeleteObject(iconInfo.hbmMask);
757 DeleteObject(iconInfo.hbmColor);
760 return m_ignoreDragCursor;
768 if (pit != m_pixmapCursorCache.
constEnd())
769 return pit.value()->handle();
771 const auto sit = m_standardCursorCache.
constFind(shape);
772 if (sit != m_standardCursorCache.
constEnd())
773 return sit.value()->handle();
static QBitmap fromData(const QSize &size, const uchar *bits, QImage::Format monoFormat=QImage::Format_MonoLSB)
Constructs a bitmap with the given size, and sets the contents to the bits supplied.
The QCursor class provides a mouse cursor with an arbitrary shape.
QBitmap bitmap() const
Returns the cursor bitmap, or a null bitmap if it is one of the standard cursors.
Qt::CursorShape shape() const
Returns the cursor shape identifier.
QPoint hotSpot() const
Returns the cursor hot spot, or (0, 0) if it is one of the standard cursors.
QBitmap mask() const
Returns the cursor bitmap mask, or a null bitmap if it is one of the standard cursors.
QScreen * primaryScreen
the primary (or default) screen of the application.
iterator begin()
Returns an \l{STL-style iterators}{STL-style iterator} pointing to the first item in the hash.
qsizetype size() const noexcept
Returns the number of items in the hash.
const_iterator constFind(const Key &key) const noexcept
const_iterator constEnd() const noexcept
Returns a const \l{STL-style iterators}{STL-style iterator} pointing to the imaginary item after the ...
iterator find(const Key &key)
Returns an iterator pointing to the item with the key in the hash.
iterator Iterator
Qt-style synonym for QHash::iterator.
iterator erase(const_iterator it)
iterator end() noexcept
Returns an \l{STL-style iterators}{STL-style iterator} pointing to the imaginary item after the last ...
iterator insert(const Key &key, const T &value)
Inserts a new item with the key and a value of value.
static qreal factor(C *context)
QImage scaled(int w, int h, Qt::AspectRatioMode aspectMode=Qt::IgnoreAspectRatio, Qt::TransformationMode mode=Qt::FastTransformation) const
This is an overloaded member function, provided for convenience. It differs from the above function o...
QRgb color(int i) const
Returns the color in the color table at index i.
QSize size() const
Returns the size of the image, i.e.
int width() const
Returns the width of the image.
int height() const
Returns the height of the image.
void fill(uint pixel)
Fills the entire image with the given pixelValue.
const uchar * constScanLine(int) const
Returns a pointer to the pixel data at the scanline with index i.
qreal devicePixelRatio() const
Returns the device pixel ratio for the image.
int colorCount() const
Returns the depth of the image.
QImage convertToFormat(Format f, Qt::ImageConversionFlags flags=Qt::AutoColor) const &
Returns a copy of the pixmap that is transformed using the given transformation transform and transfo...
int height() const
Returns the height of the pixmap.
QImage toImage() const
Converts the pixmap to a QImage.
bool isNull() const
Returns true if this is a null pixmap; otherwise returns false.
int width() const
Returns the width of the pixmap.
void setMask(const QBitmap &)
Sets a mask bitmap.
QPixmap transformed(const QTransform &, Qt::TransformationMode mode=Qt::FastTransformation) const
static QPixmap fromImage(const QImage &image, Qt::ImageConversionFlags flags=Qt::AutoColor)
Converts the given image to a pixmap using the specified flags to control the conversion.
\inmodule QtCore\reentrant
constexpr int x() const noexcept
Returns the x coordinate of this point.
constexpr int y() const noexcept
Returns the y coordinate of this point.
T * data() const noexcept
Returns the value of the pointer referenced by this object.
The QScreen class is used to query screen properties. \inmodule QtGui.
const_iterator cbegin() const noexcept
constexpr int width() const noexcept
Returns the width.
static QString fromLatin1(QByteArrayView ba)
This is an overloaded member function, provided for convenience. It differs from the above function o...
QPair< DWORD, bool > dwordValue(QStringView subKey) const
HandleBaseWindowHash & windows()
static QWindowsContext * instance()
static bool hasOverrideCursor()
static QPoint mousePosition()
void setOverrideCursor(const QCursor &cursor) override
Reimplement this function in subclass to set an override cursor on the associated screen and return t...
static HCURSOR createPixmapCursor(QPixmap pixmap, const QPoint &hotSpot, qreal scaleFactor=1)
void changeCursor(QCursor *widgetCursor, QWindow *widget) override
Set a cursor on a window.
static PixmapCursor customCursor(Qt::CursorShape cursorShape, const QPlatformScreen *screen=nullptr)
HCURSOR hCursor(const QCursor &c) const
void clearOverrideCursor() override
Reimplement this function in subclass to clear the override cursor.
CursorHandlePtr standardWindowCursor(Qt::CursorShape s=Qt::ArrowCursor)
Return cached standard cursor resources or create new ones.
static State cursorState()
static HCURSOR createCursorFromShape(Qt::CursorShape cursorShape, const QPlatformScreen *screen=nullptr)
static void enforceOverrideCursor()
QWindowsCursor(const QPlatformScreen *screen)
QPixmap dragDefaultCursor(Qt::DropAction action) const
CursorHandlePtr pixmapWindowCursor(const QCursor &c)
Return cached pixmap cursor or create new one.
QSize size() const override
Returns the size of the cursor, in native pixels.
QPoint pos() const override
void setPos(const QPoint &pos) override
static QWindowsWindow * windowsWindowOf(const QWindow *w)
void setCursor(const CursorHandlePtr &c)
QSet< QString >::iterator it
Combined button and popup list for selecting options.
std::pair< T1, T2 > QPair
bool qFuzzyCompare(qfloat16 p1, qfloat16 p2) noexcept
int qRound(qfloat16 d) noexcept
constexpr const T & qMin(const T &a, const T &b)
constexpr const T & qMax(const T &a, const T &b)
constexpr T qAbs(const T &t)
GLboolean GLboolean GLboolean b
GLint GLint GLint GLint GLint x
[0]
GLint GLsizei GLsizei height
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLint GLint GLint GLint GLint GLint GLint GLbitfield mask
GLuint GLenum GLenum transform
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const void * bits
static void initResources()
static HBITMAP qt_createIconMask(QImage bm)
HBITMAP qt_pixmapToWinHBITMAP(const QPixmap &p, int hbitmapFormat)
constexpr int qGray(int r, int g, int b)
#define QStringLiteral(str)
#define Q_INIT_RESOURCE(name)
static QWindowsCursor::PixmapCursor createPixmapCursorFromData(const QSize &screenCursorSize, const QSize &bitmapTargetCursorSize, int bitmapSize, const uchar *bits, const uchar *maskBits)
static bool initResources()
static QSize screenCursorSize(const QPlatformScreen *screen=nullptr)
static HCURSOR createBitmapCursor(const QImage &bbits, const QImage &mbits, QPoint hotSpot=QPoint(-1, -1), bool invb=false, bool invm=false)
static QSize systemCursorSize()
static QSize standardCursorSize()
QSharedPointer< CursorHandle > CursorHandlePtr
QWindowsPixmapCursorCacheKey(const QCursor &c)