HCURSOR QWindowsCursor::createPixmapCursor(const QPixmap &pixmap, int hotX, int hotY) { HCURSOR cur = 0; QBitmap mask = pixmap.mask(); if (mask.isNull()) { mask = QBitmap(pixmap.size()); mask.fill(Qt::color1); } HBITMAP ic = qt_pixmapToWinHBITMAP(pixmap, /* HBitmapAlpha */ 2); const HBITMAP im = qt_createIconMask(mask); ICONINFO ii; ii.fIcon = 0; ii.xHotspot = hotX; ii.yHotspot = hotY; ii.hbmMask = im; ii.hbmColor = ic; cur = CreateIconIndirect(&ii); DeleteObject(ic); DeleteObject(im); return cur; }
void MainInterface::createTaskBarButtons() { /*Here is the code for the taskbar thumb buttons FIXME:We need pretty buttons in 16x16 px that are handled correctly by masks in Qt FIXME:the play button's picture doesn't changed to pause when clicked */ HRESULT hr = CoInitializeEx( NULL, COINIT_MULTITHREADED ); if( hr == RPC_E_CHANGED_MODE ) hr = CoInitializeEx( NULL, COINIT_APARTMENTTHREADED ); if( SUCCEEDED(hr) && S_OK == CoCreateInstance( CLSID_TaskbarList, NULL, CLSCTX_INPROC_SERVER, IID_ITaskbarList3, (void **)&p_taskbl) ) { p_taskbl->HrInit(); if( (himl = ImageList_Create( 16, //cx 16, //cy ILC_COLOR32,//flags 4,//initial nb of images 0//nb of images that can be added ) ) != NULL ) { QPixmap img = QPixmap(":/win7/prev"); QPixmap img2 = QPixmap(":/win7/pause"); QPixmap img3 = QPixmap(":/win7/play"); QPixmap img4 = QPixmap(":/win7/next"); QBitmap mask = img.createMaskFromColor(Qt::transparent); QBitmap mask2 = img2.createMaskFromColor(Qt::transparent); QBitmap mask3 = img3.createMaskFromColor(Qt::transparent); QBitmap mask4 = img4.createMaskFromColor(Qt::transparent); if(-1 == ImageList_Add(himl, qt_pixmapToWinHBITMAP(img, PremultipliedAlpha), qt_pixmapToWinHBITMAP(mask))) msg_Err( p_intf, "First ImageList_Add failed" ); if(-1 == ImageList_Add(himl, qt_pixmapToWinHBITMAP(img2, PremultipliedAlpha), qt_pixmapToWinHBITMAP(mask2))) msg_Err( p_intf, "Second ImageList_Add failed" ); if(-1 == ImageList_Add(himl, qt_pixmapToWinHBITMAP(img3, PremultipliedAlpha), qt_pixmapToWinHBITMAP(mask3))) msg_Err( p_intf, "Third ImageList_Add failed" ); if(-1 == ImageList_Add(himl, qt_pixmapToWinHBITMAP(img4, PremultipliedAlpha), qt_pixmapToWinHBITMAP(mask4))) msg_Err( p_intf, "Fourth ImageList_Add failed" ); } // Define an array of two buttons. These buttons provide images through an // image list and also provide tooltips. THUMBBUTTONMASK dwMask = THUMBBUTTONMASK(THB_BITMAP | THB_FLAGS); THUMBBUTTON thbButtons[3]; thbButtons[0].dwMask = dwMask; thbButtons[0].iId = 0; thbButtons[0].iBitmap = 0; thbButtons[0].dwFlags = THBF_HIDDEN; thbButtons[1].dwMask = dwMask; thbButtons[1].iId = 1; thbButtons[1].iBitmap = 2; thbButtons[1].dwFlags = THBF_HIDDEN; thbButtons[2].dwMask = dwMask; thbButtons[2].iId = 2; thbButtons[2].iBitmap = 3; thbButtons[2].dwFlags = THBF_HIDDEN; HRESULT hr = p_taskbl->ThumbBarSetImageList(WinId(this), himl ); if(S_OK != hr) msg_Err( p_intf, "ThumbBarSetImageList failed with error %08lx", hr ); else { hr = p_taskbl->ThumbBarAddButtons(WinId(this), 3, thbButtons); if(S_OK != hr) msg_Err( p_intf, "ThumbBarAddButtons failed with error %08lx", hr ); } CONNECT( THEMIM->getIM(), playingStatusChanged( int ), this, changeThumbbarButtons( int ) ); }