soui 5.0.0.1
Soui5 Doc
 
Loading...
Searching...
No Matches
SDragWnd.cpp
1#include "souistd.h"
2#include "helper/SDragWnd.h"
3#include "helper/SMemDC.h"
4SNSBEGIN
5
6SDragWnd *SDragWnd::s_pCurDragWnd = NULL;
7
8SDragWnd::SDragWnd(void)
9 : m_bmp(NULL)
10{
11}
12
13SDragWnd::~SDragWnd(void)
14{
15}
16
17void SDragWnd::OnPaint(HDC dc)
18{
19 PAINTSTRUCT ps;
20 dc = ::BeginPaint(m_hWnd, &ps);
21 if (m_bmp)
22 {
23 CRect rc;
24 GetClientRect(rc);
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);
29 ::DeleteDC(hMemDC);
30 }
31 ::EndPaint(m_hWnd, &ps);
32}
33
34BOOL SDragWnd::BeginDrag(HBITMAP hBmp, POINT ptHot, COLORREF crKey, BYTE byAlpha, DWORD dwFlags)
35{
36 if (s_pCurDragWnd)
37 return FALSE;
38 s_pCurDragWnd = new SDragWnd;
39 BITMAP bm;
40 GetObject(hBmp, sizeof(bm), &bm);
41
42#ifdef _WIN32
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))
44 {
45 delete s_pCurDragWnd;
46 s_pCurDragWnd = NULL;
47 return FALSE;
48 }
49
50 s_pCurDragWnd->ModifyStyleEx(0, WS_EX_LAYERED);
51
52 if (bm.bmBitsPixel == 32)
53 {
54 HDC dc = s_pCurDragWnd->GetDC();
55 SMemDC memdc(dc, hBmp);
56 BLENDFUNCTION bf = { AC_SRC_OVER, 0, byAlpha, AC_SRC_ALPHA };
57 CPoint pt(0, 0);
58 CSize sz(bm.bmWidth, bm.bmHeight);
59 CPoint pt1(0, 0);
60 s_pCurDragWnd->UpdateLayeredWindow(dc, &pt, &sz, memdc, &pt1, crKey, &bf, LWA_ALPHA);
61 s_pCurDragWnd->ReleaseDC(dc);
62 }
63 else
64 {
65 s_pCurDragWnd->SetLayeredWindowAttributes(crKey, byAlpha, dwFlags);
66 s_pCurDragWnd->m_bmp = hBmp;
67 s_pCurDragWnd->Invalidate();
68 }
69#else //_WIN32
70
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))
75 {
76 delete s_pCurDragWnd;
77 s_pCurDragWnd = NULL;
78 return FALSE;
79 }
80 s_pCurDragWnd->m_bmp = hBmp;
81 s_pCurDragWnd->SetLayeredWindowAttributes(crKey, byAlpha, dwFlags);
82 s_pCurDragWnd->Invalidate();
83#endif //_WIN32
84 s_pCurDragWnd->m_ptHot = ptHot;
85 return TRUE;
86}
87
88void SDragWnd::DragMove(POINT pt)
89{
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);
92}
93
94void SDragWnd::EndDrag()
95{
96 SASSERT(s_pCurDragWnd);
97 s_pCurDragWnd->DestroyWindow();
98 delete s_pCurDragWnd;
99 s_pCurDragWnd = NULL;
100}
101
102SNSEND
HWND m_hWnd
Handle to the window.
Definition SNativeWnd.h:744
BOOL GetClientRect(LPRECT lpRect) SCONST OVERRIDE
Retrieves the client rectangle.