| | 91 | if (!OS.IsWinCE && OS.WIN32_VERSION >= OS.VERSION (5, 1)) { |
|---|
| | 92 | SHDRAGIMAGE shdi; |
|---|
| | 93 | int DI_GETDRAGIMAGE = OS.RegisterWindowMessage ("ShellGetDragImage"w.ptr); //$NON-NLS-1$ |
|---|
| | 94 | if (OS.SendMessage (control.handle, DI_GETDRAGIMAGE, 0, &shdi) !is 0) { |
|---|
| | 95 | event.x += shdi.ptOffset.x; |
|---|
| | 96 | event.y += shdi.ptOffset.y; |
|---|
| | 97 | auto hImage = shdi.hbmpDragImage; |
|---|
| | 98 | if (hImage !is null) { |
|---|
| | 99 | BITMAP bm; |
|---|
| | 100 | OS.GetObject (hImage, BITMAP.sizeof, &bm); |
|---|
| | 101 | int srcWidth = bm.bmWidth; |
|---|
| | 102 | int srcHeight = bm.bmHeight; |
|---|
| | 103 | |
|---|
| | 104 | /* Create resources */ |
|---|
| | 105 | auto hdc = OS.GetDC (null); |
|---|
| | 106 | auto srcHdc = OS.CreateCompatibleDC (hdc); |
|---|
| | 107 | auto oldSrcBitmap = OS.SelectObject (srcHdc, hImage); |
|---|
| | 108 | auto memHdc = OS.CreateCompatibleDC (hdc); |
|---|
| | 109 | BITMAPINFOHEADER bmiHeader; |
|---|
| | 110 | bmiHeader.biSize = BITMAPINFOHEADER.sizeof; |
|---|
| | 111 | bmiHeader.biWidth = srcWidth; |
|---|
| | 112 | bmiHeader.biHeight = -srcHeight; |
|---|
| | 113 | bmiHeader.biPlanes = 1; |
|---|
| | 114 | bmiHeader.biBitCount = 32; |
|---|
| | 115 | bmiHeader.biCompression = OS.BI_RGB; |
|---|
| | 116 | void* pBits; |
|---|
| | 117 | auto memDib = OS.CreateDIBSection (null, cast(BITMAPINFO*)&bmiHeader, OS.DIB_RGB_COLORS, &pBits, null, 0); |
|---|
| | 118 | if (memDib is null) DWT.error (DWT.ERROR_NO_HANDLES); |
|---|
| | 119 | auto oldMemBitmap = OS.SelectObject (memHdc, memDib); |
|---|
| | 120 | |
|---|
| | 121 | BITMAP dibBM; |
|---|
| | 122 | OS.GetObject (memDib, BITMAP.sizeof, &dibBM); |
|---|
| | 123 | int sizeInBytes = dibBM.bmWidthBytes * dibBM.bmHeight; |
|---|
| | 124 | |
|---|
| | 125 | /* Get the foreground pixels */ |
|---|
| | 126 | OS.BitBlt (memHdc, 0, 0, srcWidth, srcHeight, srcHdc, 0, 0, OS.SRCCOPY); |
|---|
| | 127 | byte[] srcData = (cast(byte*)dibBM.bmBits)[ 0 .. sizeInBytes ]; |
|---|
| | 128 | |
|---|
| | 129 | PaletteData palette = new PaletteData(0xFF00, 0xFF0000, 0xFF000000); |
|---|
| | 130 | ImageData data = new ImageData(srcWidth, srcHeight, bm.bmBitsPixel, palette, bm.bmWidthBytes, srcData); |
|---|
| | 131 | data.transparentPixel = shdi.crColorKey << 8; |
|---|
| | 132 | dragSourceImage = new Image (control.getDisplay (), data); |
|---|
| | 133 | OS.SelectObject (memHdc, oldMemBitmap); |
|---|
| | 134 | OS.DeleteDC (memHdc); |
|---|
| | 135 | OS.DeleteObject (memDib); |
|---|
| | 136 | OS.SelectObject (srcHdc, oldSrcBitmap); |
|---|
| | 137 | OS.DeleteDC (srcHdc); |
|---|
| | 138 | OS.ReleaseDC (null, hdc); |
|---|
| | 139 | return dragSourceImage; |
|---|
| | 140 | } |
|---|
| | 141 | } |
|---|
| | 142 | return null; |
|---|
| | 143 | } |
|---|
| | 144 | |
|---|