mirror of
https://github.com/duilib/duilib.git
synced 2026-10-18 14:50:35 +08:00
67 lines
1.7 KiB
C++
67 lines
1.7 KiB
C++
#include "StdAfx.h"
|
|
#include "Util.h"
|
|
|
|
HBITMAP CreateDesktopBitmap(HWND hWnd)
|
|
{
|
|
HWND hWndDesktop = ::GetDesktopWindow();
|
|
RECT rect;
|
|
GetWindowRect(hWndDesktop, &rect);
|
|
rect.right -= rect.left;
|
|
rect.bottom -= rect.top;
|
|
rect.left = rect.top = 0;
|
|
|
|
HDC hDcDesktop = GetDC(hWndDesktop);
|
|
HDC hDcMem = CreateCompatibleDC(hDcDesktop);
|
|
HBITMAP hBmp = CreateCompatibleBitmap(hDcDesktop, rect.right, rect.bottom);
|
|
HGDIOBJ hOld = SelectObject(hDcMem, hBmp);
|
|
::BitBlt(hDcMem, 0, 0, rect.right, rect.bottom, hDcDesktop, 0, 0, SRCCOPY|CAPTUREBLT);
|
|
::ReleaseDC(hWndDesktop, hDcDesktop);
|
|
::DeleteDC(hDcMem);
|
|
return hBmp;
|
|
}
|
|
|
|
HBITMAP CreateDesktopMaskBitmap(HWND hWnd)
|
|
{
|
|
HDC hDCMem = CreateCompatibleDC(NULL);
|
|
RECT rect;
|
|
GetWindowRect(::GetDesktopWindow(), &rect);
|
|
rect.right -= rect.left;
|
|
rect.bottom -= rect.top;
|
|
rect.left = rect.top = 0;
|
|
|
|
HBITMAP hBmp = NULL;
|
|
|
|
HDC hDC = GetDC(hWnd);
|
|
hBmp = CreateCompatibleBitmap(hDC, rect.right, rect.bottom);
|
|
ReleaseDC(hWnd, hDC);
|
|
|
|
HGDIOBJ hOld = SelectObject(hDCMem, hBmp);
|
|
CRenderEngine::DrawColor(hDCMem, rect, 0x4F000000);
|
|
SelectObject(hDCMem, hOld);
|
|
|
|
DeleteObject(hDCMem);
|
|
return hBmp;
|
|
}
|
|
|
|
HWND SmallestWindowFromCursor(RECT& rcWindow)
|
|
{
|
|
HWND hWnd, hTemp;
|
|
POINT pt;
|
|
::GetCursorPos(&pt);
|
|
hWnd = ::ChildWindowFromPointEx(::GetDesktopWindow(), pt, CWP_SKIPDISABLED|CWP_SKIPINVISIBLE);
|
|
if( hWnd != NULL )
|
|
{
|
|
hTemp = hWnd;
|
|
while (true) {
|
|
::GetCursorPos(&pt);
|
|
::ScreenToClient(hTemp, &pt);
|
|
hTemp = ::ChildWindowFromPointEx(hTemp, pt, CWP_SKIPINVISIBLE);
|
|
if (hTemp == NULL || hTemp == hWnd)
|
|
break;
|
|
hWnd = hTemp;
|
|
}
|
|
::GetWindowRect(hWnd, &rcWindow);
|
|
}
|
|
return hWnd;
|
|
}
|