Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include "Overlay.h"
- COverlay::COverlay ()
- : m_hOverlay ( NULL ),
- m_hTarget ( NULL ),
- m_pDirect3D ( nullptr ),
- m_pDevice ( nullptr )
- {
- memset ( &m_MSG, NULL, sizeof(MSG) );
- memset ( &m_Present, NULL, sizeof(D3DPRESENT_PARAMETERS) );
- }
- COverlay::~COverlay ()
- {
- if ( m_pDevice )
- {
- m_pDevice->Release ();
- m_pDevice = nullptr;
- }
- if ( m_pDirect3D )
- {
- m_pDirect3D->Release ();
- m_pDirect3D = nullptr;
- }
- }
- bool COverlay::Attach ( HWND hWnd )
- {
- m_hTarget = hWnd;
- if ( !m_hTarget )
- return false;
- while ( GetForegroundWindow () != m_hTarget )
- Sleep ( 100 );
- RECT Client;
- GetClientRect ( m_hTarget, &Client );
- m_iSize[0] = Client.right;
- m_iSize[1] = Client.bottom;
- WNDCLASSEX wc = { NULL };
- wc.cbSize = sizeof(WNDCLASSEX);
- wc.style = CS_VREDRAW | CS_HREDRAW;
- wc.lpfnWndProc = WndProc;
- wc.cbClsExtra = NULL;
- wc.cbWndExtra = NULL;
- wc.hInstance = NULL;
- wc.hIcon = LoadIconA ( NULL, IDI_APPLICATION );
- wc.hCursor = LoadCursorA ( NULL, IDC_ARROW );
- wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
- wc.lpszMenuName = NULL;
- wc.lpszClassName = OVERLAY_NAME;
- wc.hIconSm = LoadIconA ( NULL, IDI_APPLICATION );
- if ( !RegisterClassExA ( &wc ) )
- return false;
- m_hOverlay = CreateWindowExA ( WS_EX_TOPMOST | WS_EX_COMPOSITED | WS_EX_TRANSPARENT | WS_EX_LAYERED, OVERLAY_NAME, OVERLAY_NAME, WS_POPUP, CW_USEDEFAULT, CW_USEDEFAULT, m_iSize[0], m_iSize[1], NULL, NULL, NULL, NULL );
- if ( !m_hOverlay )
- return false;
- const MARGINS Margin = { -1, -1, -1, -1 };
- DwmExtendFrameIntoClientArea ( m_hOverlay, &Margin );
- ShowWindow ( m_hOverlay, SW_SHOWDEFAULT );
- UpdateWindow ( m_hOverlay );
- RECT Application;
- GetWindowRect ( m_hTarget, &Application );
- int Width = Application.right - Application.left;
- int Height = Application.bottom - Application.top;
- LONG Style = GetWindowLongA ( m_hTarget, GWL_STYLE );
- if ( Style & WS_BORDER )
- {
- int BorderX = GetSystemMetrics ( SM_CXBORDER );
- int BorderY = GetSystemMetrics ( SM_CYCAPTION );
- Application.left += BorderX;
- Application.top += BorderY;
- Width -= BorderX;
- Height -= BorderY;
- }
- MoveWindow ( m_hOverlay, Application.left, Application.top, Width, Height, TRUE );
- return InitDirectX ( m_hOverlay );
- }
- bool COverlay::PreFrame ()
- {
- if ( PeekMessageA ( &m_MSG, NULL, NULL, NULL, PM_REMOVE ) )
- {
- if ( m_MSG.message == WM_QUIT )
- return false;
- TranslateMessage ( &m_MSG );
- DispatchMessageA ( &m_MSG );
- }
- if ( FAILED(m_pDevice->Clear ( NULL, NULL, D3DCLEAR_TARGET, NULL, 1.0f, NULL )) )
- return false;
- if ( FAILED(m_pDevice->BeginScene ()) )
- return false;
- return true;
- }
- bool COverlay::PostFrame ()
- {
- if ( FAILED(m_pDevice->EndScene ()) )
- return false;
- if ( FAILED(m_pDevice->Present ( NULL, NULL, NULL, NULL )) )
- return false;
- return true;
- }
- IDirect3DDevice9* COverlay::GetDevice ()
- {
- return m_pDevice;
- }
- bool COverlay::InitDirectX ( HWND hWnd )
- {
- m_Present.EnableAutoDepthStencil = TRUE;
- m_Present.AutoDepthStencilFormat = D3DFMT_D16;
- m_Present.Windowed = TRUE;
- m_Present.BackBufferCount = 1;
- m_Present.BackBufferFormat = D3DFMT_A8R8G8B8;
- m_Present.BackBufferWidth = m_iSize[0];
- m_Present.BackBufferHeight = m_iSize[1];
- m_Present.MultiSampleType = D3DMULTISAMPLE_NONE;
- m_Present.SwapEffect = D3DSWAPEFFECT_DISCARD;
- m_Present.PresentationInterval = D3DPRESENT_INTERVAL_IMMEDIATE;
- m_Present.hDeviceWindow = hWnd;
- m_pDirect3D = Direct3DCreate9 ( D3D_SDK_VERSION );
- if ( !m_pDirect3D )
- return false;
- if ( FAILED(m_pDirect3D->CreateDevice ( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &m_Present, &m_pDevice )) )
- return false;
- if ( !m_pDevice )
- return false;
- return true;
- }
- LRESULT CALLBACK COverlay::WndProc ( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
- {
- switch ( message )
- {
- case WM_DESTROY:
- PostQuitMessage ( NULL );
- break;
- default:
- return DefWindowProcA ( hWnd, message, wParam, lParam );
- }
- return NULL;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement