2#include "helper/SDragWnd.h"
3#include "helper/SMemDC.h"
6SDragWnd *SDragWnd::s_pCurDragWnd = NULL;
8SDragWnd::SDragWnd(
void)
13SDragWnd::~SDragWnd(
void)
17void SDragWnd::OnPaint(HDC dc)
20 dc = ::BeginPaint(
m_hWnd, &ps);
25 HDC hMemDC = CreateCompatibleDC(dc);
26 HGDIOBJ hOldBmp = SelectObject(hMemDC, m_bmp);
27 BitBlt(dc, 0, 0, rc.Width(), rc.Height(), hMemDC, 0, 0, SRCCOPY);
28 ::SelectObject(hMemDC, hOldBmp);
34BOOL SDragWnd::BeginDrag(HBITMAP hBmp, POINT ptHot, COLORREF crKey, BYTE byAlpha, DWORD dwFlags)
38 s_pCurDragWnd =
new SDragWnd;
40 GetObject(hBmp,
sizeof(bm), &bm);
43 if (!s_pCurDragWnd->CreateNative(NULL, WS_POPUP, WS_EX_TRANSPARENT | WS_EX_TOOLWINDOW | WS_EX_TOPMOST, 0, 0, bm.bmWidth, bm.bmHeight, 0, 0, NULL))
50 s_pCurDragWnd->ModifyStyleEx(0, WS_EX_LAYERED);
52 if (bm.bmBitsPixel == 32)
54 HDC dc = s_pCurDragWnd->GetDC();
55 SMemDC memdc(dc, hBmp);
56 BLENDFUNCTION bf = { AC_SRC_OVER, 0, byAlpha, AC_SRC_ALPHA };
58 CSize sz(bm.bmWidth, bm.bmHeight);
60 s_pCurDragWnd->UpdateLayeredWindow(dc, &pt, &sz, memdc, &pt1, crKey, &bf, LWA_ALPHA);
61 s_pCurDragWnd->ReleaseDC(dc);
65 s_pCurDragWnd->SetLayeredWindowAttributes(crKey, byAlpha, dwFlags);
66 s_pCurDragWnd->m_bmp = hBmp;
67 s_pCurDragWnd->Invalidate();
71 DWORD dwExStyle = WS_EX_TRANSPARENT | WS_EX_TOOLWINDOW | WS_EX_TOPMOST | WS_EX_LAYERED;
72 if (bm.bmBitsPixel == 32)
73 dwExStyle |= WS_EX_COMPOSITED;
74 if (!s_pCurDragWnd->CreateNative(NULL, WS_POPUP, dwExStyle, 0, 0, bm.bmWidth, bm.bmHeight, 0, 0, NULL))
80 s_pCurDragWnd->m_bmp = hBmp;
81 s_pCurDragWnd->SetLayeredWindowAttributes(crKey, byAlpha, dwFlags);
82 s_pCurDragWnd->Invalidate();
84 s_pCurDragWnd->m_ptHot = ptHot;
88void SDragWnd::DragMove(POINT pt)
90 SASSERT(s_pCurDragWnd);
91 s_pCurDragWnd->SetWindowPos(HWND_TOPMOST, pt.x - s_pCurDragWnd->m_ptHot.x, pt.y - s_pCurDragWnd->m_ptHot.y, 0, 0, SWP_NOSIZE | SWP_NOSENDCHANGING | SWP_NOOWNERZORDER | SWP_SHOWWINDOW | SWP_NOACTIVATE);
94void SDragWnd::EndDrag()
96 SASSERT(s_pCurDragWnd);
97 s_pCurDragWnd->DestroyWindow();
HWND m_hWnd
Handle to the window.
BOOL GetClientRect(LPRECT lpRect) SCONST OVERRIDE
Retrieves the client rectangle.