[QT] Cursor aus Standardcursor + QIcon bauen
-
Hi,
ich möchte gerne an den Standardcursor ein Symbol anhängen dass über das gerade verwendete Tool aufschluss gibt. Meine Idee war einfach aus dem Standarcursor und dem Icon eine Pixmap zu baun und diese dann als Cursor zu verwenden.
Allerdings weiss ich nicht wie ich an die Pixmap / Bitmap des Standardcursors komme. (QCursor bietet bei Standardcursor die getter nicht an).
Kann mir da jemeind einen Tipp geben wie dass doch klappen könnte?Viele danke schonma
Grey
P.S: Ich glaube dass ich hier mit QT nicht weiterkomme, also handelt es sich fast eher um eine Winapi Frage. (Mir ist atm auch nur der Windows support wichtig)
-
HCURSOR curs = GetCursor(); QPixmap cursorMap = QPixmap::fromWinHICON( (HICON)curs );
Das is allerdings net so toll. ;// Die Funktion scheint den Cursor zu verkleinern.
Mein aktuelles Ergebnis sieht so aus: (Cursor ist default auf Normalgröße)
http://www.weown.de/files/misc/cursor.jpg
-
Ich weiss mir immer noch nicht 100% zu helfen. Der statische member QPixmap::fromWinHICON( HICON ); scheint nicht einwandfrei zu funktionieren. (Oder ich wende es einfach nur falsch?)
Momentan verwende ich allerdings folgenden Workarround:
HCURSOR curs = GetCursor(); SaveIconToFile((HICON)curs, TEXT("default.ico"), TRUE); QPixmap cursorMap = QPixmap("default.ico");
#include "Windows.h" #include <atlbase.h> void SaveIconToFile(HICON hico, LPCTSTR szFileName, BOOL bAutoDelete = FALSE) { PICTDESC pd = {sizeof(pd), PICTYPE_ICON}; pd.icon.hicon = hico; CComPtr<IPicture> pPict = NULL; CComPtr<IStream> pStrm = NULL; LONG cbSize = 0; BOOL res = FALSE; res = SUCCEEDED( ::CreateStreamOnHGlobal(NULL, TRUE, &pStrm) ); res = SUCCEEDED( ::OleCreatePictureIndirect(&pd, IID_IPicture, bAutoDelete, (void**)&pPict) ); res = SUCCEEDED( pPict->SaveAsFile( pStrm, TRUE, &cbSize ) ); if( res ) { // rewind stream to the beginning LARGE_INTEGER li = {0}; pStrm->Seek(li, STREAM_SEEK_SET, NULL); // write to file HANDLE hFile = ::CreateFile(szFileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, 0, NULL); if( INVALID_HANDLE_VALUE != hFile ) { DWORD dwWritten = 0, dwRead = 0, dwDone = 0; BYTE buf[4096]; //QImage::QImage ( uchar * data, int width, int height, Format format ) while( dwDone < cbSize ) { if( SUCCEEDED(pStrm->Read(buf, sizeof(buf), &dwRead)) ) { ::WriteFile(hFile, buf, dwRead, &dwWritten, NULL); if( dwWritten != dwRead ) break; dwDone += dwRead; } else break; } _ASSERTE(dwDone == cbSize); ::CloseHandle(hFile); } } }
Is unschön und optimierungsbedürftig aber es tut was es soll. Vielleicht hilft es ja mal jemand.
Mfg