• 桌面 透明 三角形 分层窗口 DX


      1 //桌面 透明 三角形 分层窗口 DX
      2 //IDirect3DSurface9 GetDC  UpdateLayeredWindow
      3 
      4 #include <Windows.h>
      5 #include <mmsystem.h>
      6 #include <d3dx9.h>
      7 #pragma warning( disable : 4996 ) 
      8 #include <strsafe.h>
      9 #pragma warning( default : 4996 )
     10 
     11 //include path $(DXSDK_DIR)Include;
     12 //library path $(DXSDK_DIR)Libx86
     13 //library d3dx9.lib d3d9.lib Winmm.lib
     14 
     15 
     16 LPDIRECT3D9             g_pD3D = NULL;
     17 LPDIRECT3DDEVICE9       g_pd3dDevice = NULL;
     18 LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL;
     19 
     20 HWND g_hWnd = NULL;
     21 IDirect3DSurface9*        g_pkRenderTarget = NULL;
     22 IDirect3DSurface9*        g_pkOffscreenPlainSurface = NULL;
     23 
     24 struct CUSTOMVERTEX
     25 {
     26     FLOAT x, y, z;
     27     DWORD color;
     28 };
     29 
     30 #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)
     31 
     32 HRESULT InitD3D(HWND hWnd)
     33 {
     34     if (NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
     35     {
     36         return E_FAIL;
     37     }
     38 
     39     D3DPRESENT_PARAMETERS d3dpp;
     40     ZeroMemory(&d3dpp, sizeof(d3dpp));
     41     d3dpp.Windowed = TRUE;
     42     d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
     43     d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
     44 
     45     if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice)))
     46     {
     47         return E_FAIL;
     48     }
     49 
     50     g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
     51     g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
     52 
     53     return S_OK;
     54 }
     55 
     56 HRESULT InitGeometry()
     57 {
     58     CUSTOMVERTEX g_Vertices[] =
     59     {
     60         { -1.0f, -1.0f, 0.0f, 0xffff0000, },
     61         { 1.0f, -1.0f, 0.0f, 0xff0000ff, },
     62         { 0.0f, 1.0f, 0.0f, 0xffffffff, },
     63     };
     64 
     65     if (FAILED(g_pd3dDevice->CreateVertexBuffer(3 * sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL)))
     66     {
     67         return E_FAIL;
     68     }
     69 
     70     VOID* pVertices;
     71     if (FAILED(g_pVB->Lock(0, sizeof(g_Vertices), (void**)&pVertices, 0)))
     72     {
     73         return E_FAIL;
     74     }
     75     memcpy(pVertices, g_Vertices, sizeof(g_Vertices));
     76     g_pVB->Unlock();
     77 
     78     return S_OK;
     79 }
     80 
     81 VOID Cleanup()
     82 {
     83     if (g_pVB != NULL)
     84     {
     85         g_pVB->Release();
     86     }
     87     if (g_pd3dDevice != NULL)
     88     {
     89         g_pd3dDevice->Release();
     90     }
     91     if (g_pD3D != NULL)
     92     {
     93         g_pD3D->Release();
     94     }
     95 }
     96 
     97 VOID SetupMatrices()
     98 {
     99     D3DXMATRIXA16 matWorld;
    100     UINT iTime = timeGetTime() % 1000;
    101     FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 1000.0f;
    102     D3DXMatrixRotationY(&matWorld, fAngle);
    103     g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld);
    104 
    105     D3DXVECTOR3 vEyePt(0.0f, 3.0f, -5.0f);
    106     D3DXVECTOR3 vLookatPt(0.0f, 0.0f, 0.0f);
    107     D3DXVECTOR3 vUpVec(0.0f, 1.0f, 0.0f);
    108     D3DXMATRIXA16 matView;
    109     D3DXMatrixLookAtLH(&matView, &vEyePt, &vLookatPt, &vUpVec);
    110     g_pd3dDevice->SetTransform(D3DTS_VIEW, &matView);
    111 
    112     D3DXMATRIXA16 matProj;
    113     D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI / 4, 1.0f, 1.0f, 100.0f);
    114     g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &matProj);
    115 
    116 }
    117 
    118 VOID Render()
    119 {
    120 
    121     RECT kRect;
    122     GetWindowRect(g_hWnd, &kRect);
    123 
    124     UINT uiWndWidth = kRect.right - kRect.left;
    125     UINT uiWndHeight = kRect.bottom - kRect.top;
    126 
    127     if (!g_pkOffscreenPlainSurface)
    128     {
    129         g_pd3dDevice->CreateOffscreenPlainSurface(uiWndWidth, uiWndHeight, D3DFMT_X8R8G8B8, D3DPOOL_SYSTEMMEM, &g_pkOffscreenPlainSurface, 0);
    130         g_pd3dDevice->CreateRenderTarget(uiWndWidth, uiWndHeight, D3DFMT_X8R8G8B8, D3DMULTISAMPLE_NONE, 0, true, &g_pkRenderTarget, 0);
    131     }
    132     else
    133     {
    134         D3DSURFACE_DESC kDesc;
    135         g_pkOffscreenPlainSurface->GetDesc(&kDesc);
    136 
    137         if (kDesc.Width != uiWndWidth || kDesc.Width != uiWndHeight)
    138         {
    139             g_pkOffscreenPlainSurface->Release();
    140             g_pkRenderTarget->Release();
    141             g_pd3dDevice->CreateOffscreenPlainSurface(uiWndWidth, uiWndHeight, D3DFMT_X8R8G8B8, D3DPOOL_SYSTEMMEM, &g_pkOffscreenPlainSurface, 0);
    142             g_pd3dDevice->CreateRenderTarget(uiWndWidth, uiWndHeight, D3DFMT_X8R8G8B8, D3DMULTISAMPLE_NONE, 0, true, &g_pkRenderTarget, 0);
    143         }
    144     }
    145 
    146     if (!g_pkOffscreenPlainSurface || !g_pkRenderTarget)
    147     {
    148         return;
    149     }
    150 
    151     HRESULT hr = g_pd3dDevice->SetRenderTarget(0, g_pkRenderTarget);
    152     g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
    153 
    154     if (SUCCEEDED(g_pd3dDevice->BeginScene()))
    155     {
    156         SetupMatrices();
    157 
    158         g_pd3dDevice->SetStreamSource(0, g_pVB, 0, sizeof(CUSTOMVERTEX));
    159         g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
    160         g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 1);
    161 
    162         g_pd3dDevice->EndScene();
    163     }
    164 
    165     g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
    166 
    167     hr = g_pd3dDevice->GetRenderTargetData(g_pkRenderTarget, g_pkOffscreenPlainSurface);
    168 
    169     HDC hDC = 0;
    170     //g_pkRenderTarget->GetDC(&hDC);
    171     g_pkOffscreenPlainSurface->GetDC(&hDC);
    172 
    173     POINT kPoint = { 0, 0 };
    174     SIZE kSize = { uiWndWidth, uiWndHeight };
    175 
    176     BLENDFUNCTION kBlend;
    177     kBlend.AlphaFormat = AC_SRC_ALPHA;
    178     kBlend.SourceConstantAlpha = 255;
    179     kBlend.BlendFlags = 0;
    180     kBlend.BlendOp = AC_SRC_OVER;
    181 
    182     UpdateLayeredWindow(g_hWnd, 0, &kPoint, &kSize, hDC, &kPoint, 0, &kBlend, ULW_ALPHA);
    183 
    184     g_pkOffscreenPlainSurface->ReleaseDC(hDC);
    185     //g_pkRenderTarget->ReleaseDC(hDC);
    186 }
    187 
    188 LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
    189 {
    190     switch (msg)
    191     {
    192     case WM_DESTROY:
    193         Cleanup();
    194         PostQuitMessage(0);
    195         return 0;
    196     }
    197 
    198     return DefWindowProc(hWnd, msg, wParam, lParam);
    199 }
    200 
    201 INT WINAPI wWinMain(HINSTANCE hInst, HINSTANCE, LPWSTR, INT)
    202 {
    203     UNREFERENCED_PARAMETER(hInst);
    204 
    205     WNDCLASSEX wc =
    206     {
    207         sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, L"D3D Tutorial", NULL
    208     };
    209     RegisterClassEx(&wc);
    210 
    211     g_hWnd = CreateWindowEx(WS_EX_LAYERED, L"D3D Tutorial", L"D3D Tutorial 03: Matrices", WS_POPUP | WS_THICKFRAME, 100, 100, 512, 512, NULL, NULL, wc.hInstance, NULL);
    212 
    213     if (SUCCEEDED(InitD3D(g_hWnd)))
    214     {
    215         if (SUCCEEDED(InitGeometry()))
    216         {
    217             ShowWindow(g_hWnd, SW_SHOWDEFAULT);
    218             UpdateWindow(g_hWnd);
    219 
    220             MSG msg;
    221             ZeroMemory(&msg, sizeof(msg));
    222             while (msg.message != WM_QUIT)
    223             {
    224                 if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
    225                 {
    226                     TranslateMessage(&msg);
    227                     DispatchMessage(&msg);
    228                 }
    229                 else
    230                 {
    231                     Render();
    232                 }
    233             }
    234         }
    235     }
    236 
    237     UnregisterClass(L"D3D Tutorial", wc.hInstance);
    238     return 0;
    239 }
  • 相关阅读:
    Linux vi/vim
    Linux 磁盘管理
    Linux 用户和用户组管理
    Linux 文件与目录管理
    Linux 文件基本属性
    Linux 远程登录
    Linux 忘记密码解决方法
    Linux 系统目录结构
    Linux 系统启动过程
    linux -- su和sudo命令的区别
  • 原文地址:https://www.cnblogs.com/binsys/p/4038908.html
Copyright © 2020-2023  润新知