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