Advertisement
keybode

overlay wut

Dec 22nd, 2014
450
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.06 KB | None | 0 0
  1. #include "Overlay.h"
  2.  
  3. COverlay::COverlay ()
  4.     :   m_hOverlay ( NULL ),
  5.         m_hTarget ( NULL ),
  6.         m_pDirect3D ( nullptr ),
  7.         m_pDevice ( nullptr )
  8. {
  9.     memset ( &m_MSG, NULL, sizeof(MSG) );
  10.     memset ( &m_Present, NULL, sizeof(D3DPRESENT_PARAMETERS) );
  11. }
  12.  
  13. COverlay::~COverlay ()
  14. {
  15.     if ( m_pDevice )
  16.     {
  17.         m_pDevice->Release ();
  18.         m_pDevice = nullptr;
  19.     }
  20.  
  21.     if ( m_pDirect3D )
  22.     {
  23.         m_pDirect3D->Release ();
  24.         m_pDirect3D = nullptr;
  25.     }
  26. }
  27.  
  28. bool COverlay::Attach ( HWND hWnd )
  29. {
  30.     m_hTarget = hWnd;
  31.  
  32.     if ( !m_hTarget )
  33.         return false;
  34.  
  35.     while ( GetForegroundWindow () != m_hTarget )
  36.         Sleep ( 100 );
  37.  
  38.     RECT Client;
  39.  
  40.     GetClientRect ( m_hTarget, &Client );
  41.  
  42.     m_iSize[0] = Client.right;
  43.     m_iSize[1] = Client.bottom;
  44.  
  45.     WNDCLASSEX wc = { NULL };
  46.  
  47.     wc.cbSize           = sizeof(WNDCLASSEX);
  48.     wc.style            = CS_VREDRAW | CS_HREDRAW;
  49.     wc.lpfnWndProc      = WndProc;
  50.     wc.cbClsExtra       = NULL;
  51.     wc.cbWndExtra       = NULL;
  52.     wc.hInstance        = NULL;
  53.     wc.hIcon            = LoadIconA ( NULL, IDI_APPLICATION );
  54.     wc.hCursor          = LoadCursorA ( NULL, IDC_ARROW );
  55.     wc.hbrBackground    = (HBRUSH)COLOR_WINDOW;
  56.     wc.lpszMenuName     = NULL;
  57.     wc.lpszClassName    = OVERLAY_NAME;
  58.     wc.hIconSm          = LoadIconA ( NULL, IDI_APPLICATION );
  59.  
  60.     if ( !RegisterClassExA ( &wc ) )
  61.         return false;
  62.  
  63.     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 );
  64.  
  65.     if ( !m_hOverlay )
  66.         return false;
  67.  
  68.     const MARGINS Margin = { -1, -1, -1, -1 };
  69.  
  70.     DwmExtendFrameIntoClientArea ( m_hOverlay, &Margin );
  71.        
  72.     ShowWindow ( m_hOverlay, SW_SHOWDEFAULT );
  73.  
  74.     UpdateWindow ( m_hOverlay );
  75.  
  76.     RECT Application;
  77.    
  78.     GetWindowRect ( m_hTarget, &Application );
  79.  
  80.     int Width = Application.right - Application.left;
  81.     int Height = Application.bottom - Application.top;
  82.  
  83.     LONG Style = GetWindowLongA ( m_hTarget, GWL_STYLE );
  84.  
  85.     if ( Style & WS_BORDER )
  86.     {
  87.         int BorderX = GetSystemMetrics ( SM_CXBORDER );
  88.         int BorderY = GetSystemMetrics ( SM_CYCAPTION );
  89.        
  90.         Application.left += BorderX;
  91.         Application.top += BorderY;
  92.        
  93.         Width -= BorderX;
  94.         Height -= BorderY;
  95.     }
  96.  
  97.     MoveWindow ( m_hOverlay, Application.left, Application.top, Width, Height, TRUE );
  98.  
  99.     return InitDirectX ( m_hOverlay );
  100. }
  101.  
  102. bool COverlay::PreFrame ()
  103. {
  104.     if ( PeekMessageA ( &m_MSG, NULL, NULL, NULL, PM_REMOVE ) )
  105.     {
  106.         if ( m_MSG.message == WM_QUIT )
  107.             return false;
  108.  
  109.         TranslateMessage ( &m_MSG );
  110.         DispatchMessageA ( &m_MSG );
  111.     }
  112.  
  113.     if ( FAILED(m_pDevice->Clear ( NULL, NULL, D3DCLEAR_TARGET, NULL, 1.0f, NULL )) )
  114.         return false;
  115.  
  116.     if ( FAILED(m_pDevice->BeginScene ()) )
  117.         return false;
  118.  
  119.     return true;
  120. }
  121.  
  122. bool COverlay::PostFrame ()
  123. {
  124.     if ( FAILED(m_pDevice->EndScene ()) )
  125.         return false;
  126.  
  127.     if ( FAILED(m_pDevice->Present ( NULL, NULL, NULL, NULL )) )
  128.         return false;
  129.  
  130.     return true;
  131. }
  132.  
  133. IDirect3DDevice9* COverlay::GetDevice ()
  134. {
  135.     return m_pDevice;
  136. }
  137.  
  138. bool COverlay::InitDirectX ( HWND hWnd )
  139. {
  140.     m_Present.EnableAutoDepthStencil    = TRUE;
  141.     m_Present.AutoDepthStencilFormat    = D3DFMT_D16;
  142.     m_Present.Windowed                  = TRUE;
  143.     m_Present.BackBufferCount           = 1;
  144.     m_Present.BackBufferFormat          = D3DFMT_A8R8G8B8;
  145.     m_Present.BackBufferWidth           = m_iSize[0];
  146.     m_Present.BackBufferHeight          = m_iSize[1];
  147.     m_Present.MultiSampleType           = D3DMULTISAMPLE_NONE;
  148.     m_Present.SwapEffect                = D3DSWAPEFFECT_DISCARD;
  149.     m_Present.PresentationInterval      = D3DPRESENT_INTERVAL_IMMEDIATE;
  150.     m_Present.hDeviceWindow             = hWnd;
  151.    
  152.     m_pDirect3D = Direct3DCreate9 ( D3D_SDK_VERSION );
  153.  
  154.     if ( !m_pDirect3D )
  155.         return false;
  156.  
  157.     if ( FAILED(m_pDirect3D->CreateDevice ( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_HARDWARE_VERTEXPROCESSING, &m_Present, &m_pDevice )) )
  158.         return false;
  159.  
  160.     if ( !m_pDevice )
  161.         return false;
  162.  
  163.     return true;
  164. }
  165.  
  166. LRESULT CALLBACK COverlay::WndProc ( HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam )
  167. {
  168.     switch ( message )
  169.     {
  170.     case WM_DESTROY:
  171.         PostQuitMessage ( NULL );
  172.         break;
  173.     default:
  174.         return DefWindowProcA ( hWnd, message, wParam, lParam );
  175.     }
  176.  
  177.     return NULL;
  178. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement