Mercurial > projects > dwt-win
diff dwt/dnd/TableDragSourceEffect.d @ 213:36f5cb12e1a2
Update to SWT 3.4M7
author | Frank Benoit <benoit@tionex.de> |
---|---|
date | Sat, 17 May 2008 17:34:28 +0200 |
parents | 3afcd4ddcf90 |
children | fd9c62a2998e |
line wrap: on
line diff
--- a/dwt/dnd/TableDragSourceEffect.d Mon May 05 00:12:38 2008 +0200 +++ b/dwt/dnd/TableDragSourceEffect.d Sat May 17 17:34:28 2008 +0200 @@ -14,6 +14,8 @@ import dwt.DWT; import dwt.graphics.Image; +import dwt.graphics.ImageData; +import dwt.graphics.PaletteData; import dwt.graphics.Rectangle; import dwt.internal.win32.OS; import dwt.widgets.Display; @@ -87,10 +89,78 @@ Image getDragSourceImage(DragSourceEvent event) { if (dragSourceImage !is null) dragSourceImage.dispose(); dragSourceImage = null; + if (!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION (5, 1)) { + SHDRAGIMAGE shdi; + int DI_GETDRAGIMAGE = OS.RegisterWindowMessage ( "ShellGetDragImage"w.ptr ); //$NON-NLS-1$ + if (OS.SendMessage (control.handle, DI_GETDRAGIMAGE, 0, &shdi) !is 0) { + event.x += shdi.ptOffset.x; + event.y += shdi.ptOffset.y; + auto hImage = shdi.hbmpDragImage; + if (hImage !is null) { + BITMAP bm; + OS.GetObject (hImage, BITMAP.sizeof, &bm); + int srcWidth = bm.bmWidth; + int srcHeight = bm.bmHeight; + + /* Create resources */ + auto hdc = OS.GetDC (null); + auto srcHdc = OS.CreateCompatibleDC (hdc); + auto oldSrcBitmap = OS.SelectObject (srcHdc, hImage); + auto memHdc = OS.CreateCompatibleDC (hdc); + BITMAPINFOHEADER bmiHeader; + bmiHeader.biSize = BITMAPINFOHEADER.sizeof; + bmiHeader.biWidth = srcWidth; + bmiHeader.biHeight = -srcHeight; + bmiHeader.biPlanes = 1; + bmiHeader.biBitCount = 32; + bmiHeader.biCompression = OS.BI_RGB; + void* pBits; + auto memDib = OS.CreateDIBSection (null, cast(BITMAPINFO*)&bmiHeader, OS.DIB_RGB_COLORS, &pBits, null, 0); + if (memDib is null) DWT.error (DWT.ERROR_NO_HANDLES); + auto oldMemBitmap = OS.SelectObject (memHdc, memDib); + + BITMAP dibBM; + OS.GetObject (memDib, BITMAP.sizeof, &dibBM); + int sizeInBytes = dibBM.bmWidthBytes * dibBM.bmHeight; + + /* Get the foreground pixels */ + OS.BitBlt (memHdc, 0, 0, srcWidth, srcHeight, srcHdc, 0, 0, OS.SRCCOPY); + //byte[] srcData = new byte [sizeInBytes]; + //OS.MoveMemory (srcData, dibBM.bmBits, sizeInBytes); + byte[] srcData = (cast(byte*) dibBM.bmBits)[ 0 .. BITMAPINFOHEADER.sizeof ]; + + byte[] alphaData = new byte[srcWidth * srcHeight]; + int spinc = dibBM.bmWidthBytes - srcWidth * 4; + int ap = 0, sp = 3; + for (int y = 0; y < srcHeight; ++y) { + for (int x = 0; x < srcWidth; ++x) { + alphaData [ap++] = srcData [sp]; + sp += 4; + } + sp += spinc; + } + PaletteData palette = new PaletteData(0xFF00, 0xFF0000, 0xFF000000); + ImageData data = new ImageData(srcWidth, srcHeight, bm.bmBitsPixel, palette, bm.bmWidthBytes, srcData); + data.alphaData = alphaData; + data.transparentPixel = shdi.crColorKey; + dragSourceImage = new Image(control.getDisplay(), data); + OS.SelectObject (memHdc, oldMemBitmap); + OS.DeleteDC (memHdc); + OS.DeleteObject (memDib); + OS.SelectObject (srcHdc, oldSrcBitmap); + OS.DeleteDC (srcHdc); + OS.ReleaseDC (null, hdc); + return dragSourceImage; + } + } + return null; + } Table table = cast(Table) control; + //TEMPORARY CODE + if (table.isListening (DWT.EraseItem) || table.isListening (DWT.PaintItem)) return null; TableItem[] selection = table.getSelection(); if (selection.length is 0) return null; - int tableImageList = OS.SendMessage (table.handle, OS.LVM_GETIMAGELIST, OS.LVSIL_SMALL, 0); + int /*long*/ tableImageList = OS.SendMessage (table.handle, OS.LVM_GETIMAGELIST, OS.LVSIL_SMALL, 0); if (tableImageList !is 0) { int count = Math.min(selection.length, 10); Rectangle bounds = selection[0].getBounds(0);