Windows 分层窗口 桌面上透明 Direct3D
Windows 分层窗口 桌面上透明 Direct3D
1 //IDirect3DSurface9 GetDC UpdateLayeredWindow
2
3 #include <Windows.h>
4 #include <mmsystem.h>
5 #include <d3dx9.h>
6 #pragma warning( disable : 4996 )
7 #include <strsafe.h>
8 #pragma warning( default : 4996 )
9
10 //include path $(DXSDK_DIR)Include;
11 //library path $(DXSDK_DIR)Lib\x86
12 //library d3dx9.lib d3d9.lib Winmm.lib
13
14
15 LPDIRECT3D9 g_pD3D = NULL;
16 LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
17 LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL;
18
19 HWND g_hWnd = NULL;
20 IDirect3DSurface9* g_pkRenderTarget = NULL;
21 IDirect3DSurface9* g_pkOffscreenPlainSurface = NULL;
22
23 struct CUSTOMVERTEX
24 {
25 FLOAT x, y, z;
26 DWORD color;
27 };
28
29 #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE)
30
31 HRESULT InitD3D(HWND hWnd)
32 {
33 if (NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
34 {
35 return E_FAIL;
36 }
37
38 D3DPRESENT_PARAMETERS d3dpp;
39 ZeroMemory(&d3dpp, sizeof(d3dpp));
40 d3dpp.Windowed = TRUE;
41 d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
42 d3dpp.BackBufferFormat = D3DFMT_UNKNOWN;
43
44 if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice)))
45 {
46 return E_FAIL;
47 }
48
49 g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
50 g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE);
51
52 return S_OK;
53 }
54
55 HRESULT InitGeometry()
56 {
57 CUSTOMVERTEX g_Vertices[] =
58 {
59 { -1.0f, -1.0f, 0.0f, 0xffff0000, },
60 { 1.0f, -1.0f, 0.0f, 0xff0000ff, },
61 { 0.0f, 1.0f, 0.0f, 0xffffffff, },
62 };
63
64 if (FAILED(g_pd3dDevice->CreateVertexBuffer(3 * sizeof(CUSTOMVERTEX), 0, D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL)))
65 {
66 return E_FAIL;
67 }
68
69 VOID* pVertices;
70 if (FAILED(g_pVB->Lock(0, sizeof(g_Vertices), (void**)&pVertices, 0)))
71 {
72 return E_FAIL;
73 }
74 memcpy(pVertices, g_Vertices, sizeof(g_Vertices));
75 g_pVB->Unlock();
76
77 return S_OK;
78 }
79
80 VOID Cleanup()
81 {
82 if (g_pVB != NULL)
83 {
84 g_pVB->Release();
85 }
86 if (g_pd3dDevice != NULL)
87 {
88 g_pd3dDevice->Release();
89 }
90 if (g_pD3D != NULL)
91 {
92 g_pD3D->Release();
93 }
94 }
95
96 VOID SetupMatrices()
97 {
98 D3DXMATRIXA16 matWorld;
99 UINT iTime = timeGetTime() % 1000;
100 FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 1000.0f;
101 D3DXMatrixRotationY(&matWorld, fAngle);
102 g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld);
103
104 D3DXVECTOR3 vEyePt(0.0f, 3.0f, -5.0f);
105 D3DXVECTOR3 vLookatPt(0.0f, 0.0f, 0.0f);
106 D3DXVECTOR3 vUpVec(0.0f, 1.0f, 0.0f);
107 D3DXMATRIXA16 matView;
108 D3DXMatrixLookAtLH(&matView, &vEyePt, &vLookatPt, &vUpVec);
109 g_pd3dDevice->SetTransform(D3DTS_VIEW, &matView);
110
111 D3DXMATRIXA16 matProj;
112 D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI / 4, 1.0f, 1.0f, 100.0f);
113 g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &matProj);
114
115 }
116
117 VOID Render()
118 {
119
120 RECT kRect;
121 GetWindowRect(g_hWnd, &kRect);
122
123 UINT uiWndWidth = kRect.right - kRect.left;
124 UINT uiWndHeight = kRect.bottom - kRect.top;
125
126 if (!g_pkOffscreenPlainSurface)
127 {
128 g_pd3dDevice->CreateOffscreenPlainSurface(uiWndWidth, uiWndHeight, D3DFMT_X8R8G8B8, D3DPOOL_SYSTEMMEM, &g_pkOffscreenPlainSurface, 0);
129 g_pd3dDevice->CreateRenderTarget(uiWndWidth, uiWndHeight, D3DFMT_X8R8G8B8, D3DMULTISAMPLE_NONE, 0, true, &g_pkRenderTarget, 0);
130 }
131 else
132 {
133 D3DSURFACE_DESC kDesc;
134 g_pkOffscreenPlainSurface->GetDesc(&kDesc);
135
136 if (kDesc.Width != uiWndWidth || kDesc.Width != uiWndHeight)
137 {
138 g_pkOffscreenPlainSurface->Release();
139 g_pkRenderTarget->Release();
140 g_pd3dDevice->CreateOffscreenPlainSurface(uiWndWidth, uiWndHeight, D3DFMT_X8R8G8B8, D3DPOOL_SYSTEMMEM, &g_pkOffscreenPlainSurface, 0);
141 g_pd3dDevice->CreateRenderTarget(uiWndWidth, uiWndHeight, D3DFMT_X8R8G8B8, D3DMULTISAMPLE_NONE, 0, true, &g_pkRenderTarget, 0);
142 }
143 }
144
145 if (!g_pkOffscreenPlainSurface || !g_pkRenderTarget)
146 {
147 return;
148 }
149
150 HRESULT hr = g_pd3dDevice->SetRenderTarget(0, g_pkRenderTarget);
151 g_pd3dDevice->Clear(0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0, 0, 0), 1.0f, 0);
152
153 if (SUCCEEDED(g_pd3dDevice->BeginScene()))
154 {
155 SetupMatrices();
156
157 g_pd3dDevice->SetStreamSource(0, g_pVB, 0, sizeof(CUSTOMVERTEX));
158 g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
159 g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 1);
160
161 g_pd3dDevice->EndScene();
162 }
163
164 g_pd3dDevice->Present(NULL, NULL, NULL, NULL);
165
166 hr = g_pd3dDevice->GetRenderTargetData(g_pkRenderTarget, g_pkOffscreenPlainSurface);
167
168 HDC hDC = 0;
169 //g_pkRenderTarget->GetDC(&hDC);
170 g_pkOffscreenPlainSurface->GetDC(&hDC);
171
172 POINT kPoint = { 0, 0 };
173 SIZE kSize = { uiWndWidth, uiWndHeight };
174
175 BLENDFUNCTION kBlend;
176 kBlend.AlphaFormat = AC_SRC_ALPHA;
177 kBlend.SourceConstantAlpha = 255;
178 kBlend.BlendFlags = 0;
179 kBlend.BlendOp = AC_SRC_OVER;
180
181 UpdateLayeredWindow(g_hWnd, 0, &kPoint, &kSize, hDC, &kPoint, 0, &kBlend, ULW_ALPHA);
182
183 g_pkOffscreenPlainSurface->ReleaseDC(hDC);
184 //g_pkRenderTarget->ReleaseDC(hDC);
185 }
186
187 LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
188 {
189 switch (msg)
190 {
191 case WM_DESTROY:
192 Cleanup();
193 PostQuitMessage(0);
194 return 0;
195 }
196
197 return DefWindowProc(hWnd, msg, wParam, lParam);
198 }
199
200 INT WINAPI wWinMain(HINSTANCE hInst, HINSTANCE, LPWSTR, INT)
201 {
202 UNREFERENCED_PARAMETER(hInst);
203
204 WNDCLASSEX wc =
205 {
206 sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, L"D3D Tutorial", NULL
207 };
208 RegisterClassEx(&wc);
209
210 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);
211
212 if (SUCCEEDED(InitD3D(g_hWnd)))
213 {
214 if (SUCCEEDED(InitGeometry()))
215 {
216 ShowWindow(g_hWnd, SW_SHOWDEFAULT);
217 UpdateWindow(g_hWnd);
218
219 MSG msg;
220 ZeroMemory(&msg, sizeof(msg));
221 while (msg.message != WM_QUIT)
222 {
223 if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
224 {
225 TranslateMessage(&msg);
226 DispatchMessage(&msg);
227 }
228 else
229 {
230 Render();
231 }
232 }
233 }
234 }
235
236 UnregisterClass(L"D3D Tutorial", wc.hInstance);
237 return 0;
238 }
Windows 分层窗口 桌面上透明 Direct3D的更多相关文章
- C#使用Windows API实现桌面上的遮罩层(鼠标穿透)
C#使用Windows API实现桌面上的遮罩层(鼠标穿透) C#实现实现桌面上的遮罩层(鼠标穿透)主要通过一下几个API函数来实现:GetWindowLong,SetWindowLong,SetLa ...
- 桌面 透明 三角形 分层窗口 DX
//桌面 透明 三角形 分层窗口 DX //IDirect3DSurface9 GetDC UpdateLayeredWindow #include <Windows.h> #includ ...
- 在Windows Server 2012中如何快速开关桌面上经典的“计算机、我的文档”等通用图标
我们都知道,在Windows Server 2012系列的服务器版本中都已经引入了Modern的现代界面作为默认的用户交互界面,同时满足视觉一致化,新版的服务器管理程序也做成了扁平化.因此传统的计算机 ...
- Windows Server 2012 R2在桌面上顯示我的電腦等圖示
Windows Server 2012 R2在桌面上顯示我的電腦等圖示 從Windows2012開始,微軟取消了服務器桌面個性化選項,如何重新調出配置界面,可以使用微軟命令調出.方法如下: 同時按 ...
- Windows Server 2012 R2在桌面上显示计算机/网络图标
原文 Windows Server 2012 R2在桌面上显示计算机/网络图标 从Windows2012开始,微软取消了服务器桌面个性化选项,如何重新调出配置界面,可以使用微软命令调出.具体方法如下: ...
- c# Windows Service 桌面上显示UI
介绍 本文的目的是说明如何从Windows Vista中的服务正确启动交互式进程,以及演示如何以完全管理员权限启动该进程.交互式过程是能够在桌面上显示UI的过程. 本文介绍如何创建一个名为Loader ...
- Windows 10 如何在桌面上显示“此电脑”和“控制面板”
新电脑安装好 Windows 10 系统,默认在桌面上是不显示 "此电脑" 和 "控制面板" 图标的. 如果是 Windows 10 家庭版,桌面一般只显示&q ...
- 如何在windows server 2008的桌面上显示 我的电脑
装完windows server2008 r2 x64后发现桌面只有一个回收站图标,这一点和xp 20003都差不多,但是xp 2003很容易就把桌面上的 我的电脑 我的文档 网上邻居找到,但是win ...
- Oracle 11G R2 在windows server 2008 64位安装时提示:无法在windows "开始"菜单或桌面上创建项
错误代码及解释: 在windows server 2008 64 位操作系统中安装 oracle 11G R2 64位 版本时提示:无法在windows "开始"菜单或桌面上创建 ...
- 在Windows Server 2008的桌面上显示“我的电脑”“网上邻居”等图标?
装完windows server2008 r2 x64后发现桌面只有一个“回收站”图标,如何把“我的电脑”“网上邻居”等图标添加到桌面呢?操作步骤: 1. 点击 开始 在搜索中输入 icon 2. 点 ...
随机推荐
- Office2021专业增强版激活
1.以管理员权限运行win+R输入CMD,进入命令行界面,输入以下命令 32位系统输入:cd /d %ProgramFiles(x86)%\Microsoft Office\Office16 64位系 ...
- keepalived+nginx+应用
达到的效果就是,每个keepalived中都有一个weight,这个数最大的作为主节点.意外挂掉就另一个升为leader,比如开始一个6,一个5,挂一次这个数减2.6挂一次再启动就是5,4了,两台机器 ...
- CTF学习笔记(二)
二.常见的HTML知识 (一)rorbts协议 robots协议也称爬虫协议.爬虫规则等,是指网站可建立一个robots.txt文件来告诉搜索引擎哪些页面可以抓取,哪些页面不能抓取,而搜索引擎则通过读 ...
- 课程表及事件提醒app-界面原型设计
前端设计: 暂定为8个主要界面:程序初始界面.主界面(首页).课表界面."我的"界面.登录界面.注册界面.创建事件界面.新建课表界面 设计思路: 项目结构 三个主要界面 首页: 课 ...
- VS/QT--调用第三方库dll总结
假设外部第三方库为 test.h,test.lib,test.dll, 调用的函数是 int fnTest(int param); 一.VS中的静态调用和动态调用 1.1 静态调用 静态调用需要用到 ...
- Win10桌面点鼠标右键一直转圈的解决方法
win10桌面右键菜单就一直转圈,无法调出桌面右键菜单,下面给大家分享一下怎么解决的问题,一起了解一下! 步骤阅读 工具/原料 win10 企业版 HT1902 方法/步 ...
- 虚拟 DOM 的优缺点
优点: 保证性能下限: 框架的虚拟 DOM 需要适配任何上层 API 可能产生的操作,它的一些 DOM 操作的实现必须是普适的,所以它的性能并不是最优的:但是比起粗暴的 DOM 操作性能要好很多,因此 ...
- Python学习的第一次总结
执行Python的方式:1.交互器(不易保存,闪现,不方便看)2.用win-cmd 来执行(用notepad++保存后执行) 开始 >> cmd >> cd c:\ #切c盘& ...
- 25_Webapck原理
Webpack源代码解析 webpack其实也就是一个函数的调用,返回一个Compile的对象,再调用Compile的run方法就可以完成项目的构建 那么我们肯定是先要从webpack这个函数去理解它 ...
- 【Java学习Day10】类型转换
类型转换 由于Java是强类型语言,所以要进行某些运算的时候,需要用到类型转换 低------------------------------------------>高 byte-->s ...