桌面 透明 三角形 分层窗口 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)Lib\x86 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 }