//桌面 透明 三角形 分层窗口 DX
//IDirect3DSurface9 GetDC UpdateLayeredWindow #include <Windows.h>
#include <mmsystem.h>
#include <d3dx9.h>
#pragma warning( disable : 4996 )
#include <strsafe.h>
#pragma warning( default : 4996 ) //include path $(DXSDK_DIR)Include;
//library path $(DXSDK_DIR)Lib\x86
//library d3dx9.lib d3d9.lib Winmm.lib LPDIRECT3D9 g_pD3D = NULL;
LPDIRECT3DDEVICE9 g_pd3dDevice = NULL;
LPDIRECT3DVERTEXBUFFER9 g_pVB = NULL; HWND g_hWnd = NULL;
IDirect3DSurface9* g_pkRenderTarget = NULL;
IDirect3DSurface9* g_pkOffscreenPlainSurface = NULL; struct CUSTOMVERTEX
{
FLOAT x, y, z;
DWORD color;
}; #define D3DFVF_CUSTOMVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE) HRESULT InitD3D(HWND hWnd)
{
if (NULL == (g_pD3D = Direct3DCreate9(D3D_SDK_VERSION)))
{
return E_FAIL;
} D3DPRESENT_PARAMETERS d3dpp;
ZeroMemory(&d3dpp, sizeof(d3dpp));
d3dpp.Windowed = TRUE;
d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
d3dpp.BackBufferFormat = D3DFMT_UNKNOWN; if (FAILED(g_pD3D->CreateDevice(D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice)))
{
return E_FAIL;
} g_pd3dDevice->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
g_pd3dDevice->SetRenderState(D3DRS_LIGHTING, FALSE); return S_OK;
} HRESULT InitGeometry()
{
CUSTOMVERTEX g_Vertices[] =
{
{ -1.0f, -1.0f, 0.0f, 0xffff0000, },
{ 1.0f, -1.0f, 0.0f, 0xff0000ff, },
{ 0.0f, 1.0f, 0.0f, 0xffffffff, },
}; if (FAILED(g_pd3dDevice->CreateVertexBuffer( * sizeof(CUSTOMVERTEX), , D3DFVF_CUSTOMVERTEX, D3DPOOL_DEFAULT, &g_pVB, NULL)))
{
return E_FAIL;
} VOID* pVertices;
if (FAILED(g_pVB->Lock(, sizeof(g_Vertices), (void**)&pVertices, )))
{
return E_FAIL;
}
memcpy(pVertices, g_Vertices, sizeof(g_Vertices));
g_pVB->Unlock(); return S_OK;
} VOID Cleanup()
{
if (g_pVB != NULL)
{
g_pVB->Release();
}
if (g_pd3dDevice != NULL)
{
g_pd3dDevice->Release();
}
if (g_pD3D != NULL)
{
g_pD3D->Release();
}
} VOID SetupMatrices()
{
D3DXMATRIXA16 matWorld;
UINT iTime = timeGetTime() % ;
FLOAT fAngle = iTime * (2.0f * D3DX_PI) / 1000.0f;
D3DXMatrixRotationY(&matWorld, fAngle);
g_pd3dDevice->SetTransform(D3DTS_WORLD, &matWorld); D3DXVECTOR3 vEyePt(0.0f, 3.0f, -5.0f);
D3DXVECTOR3 vLookatPt(0.0f, 0.0f, 0.0f);
D3DXVECTOR3 vUpVec(0.0f, 1.0f, 0.0f);
D3DXMATRIXA16 matView;
D3DXMatrixLookAtLH(&matView, &vEyePt, &vLookatPt, &vUpVec);
g_pd3dDevice->SetTransform(D3DTS_VIEW, &matView); D3DXMATRIXA16 matProj;
D3DXMatrixPerspectiveFovLH(&matProj, D3DX_PI / , 1.0f, 1.0f, 100.0f);
g_pd3dDevice->SetTransform(D3DTS_PROJECTION, &matProj); } VOID Render()
{ RECT kRect;
GetWindowRect(g_hWnd, &kRect); UINT uiWndWidth = kRect.right - kRect.left;
UINT uiWndHeight = kRect.bottom - kRect.top; if (!g_pkOffscreenPlainSurface)
{
g_pd3dDevice->CreateOffscreenPlainSurface(uiWndWidth, uiWndHeight, D3DFMT_X8R8G8B8, D3DPOOL_SYSTEMMEM, &g_pkOffscreenPlainSurface, );
g_pd3dDevice->CreateRenderTarget(uiWndWidth, uiWndHeight, D3DFMT_X8R8G8B8, D3DMULTISAMPLE_NONE, , true, &g_pkRenderTarget, );
}
else
{
D3DSURFACE_DESC kDesc;
g_pkOffscreenPlainSurface->GetDesc(&kDesc); if (kDesc.Width != uiWndWidth || kDesc.Width != uiWndHeight)
{
g_pkOffscreenPlainSurface->Release();
g_pkRenderTarget->Release();
g_pd3dDevice->CreateOffscreenPlainSurface(uiWndWidth, uiWndHeight, D3DFMT_X8R8G8B8, D3DPOOL_SYSTEMMEM, &g_pkOffscreenPlainSurface, );
g_pd3dDevice->CreateRenderTarget(uiWndWidth, uiWndHeight, D3DFMT_X8R8G8B8, D3DMULTISAMPLE_NONE, , true, &g_pkRenderTarget, );
}
} if (!g_pkOffscreenPlainSurface || !g_pkRenderTarget)
{
return;
} HRESULT hr = g_pd3dDevice->SetRenderTarget(, g_pkRenderTarget);
g_pd3dDevice->Clear(, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(, , ), 1.0f, ); if (SUCCEEDED(g_pd3dDevice->BeginScene()))
{
SetupMatrices(); g_pd3dDevice->SetStreamSource(, g_pVB, , sizeof(CUSTOMVERTEX));
g_pd3dDevice->SetFVF(D3DFVF_CUSTOMVERTEX);
g_pd3dDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, , ); g_pd3dDevice->EndScene();
} g_pd3dDevice->Present(NULL, NULL, NULL, NULL); hr = g_pd3dDevice->GetRenderTargetData(g_pkRenderTarget, g_pkOffscreenPlainSurface); HDC hDC = ;
//g_pkRenderTarget->GetDC(&hDC);
g_pkOffscreenPlainSurface->GetDC(&hDC); POINT kPoint = { , };
SIZE kSize = { uiWndWidth, uiWndHeight }; BLENDFUNCTION kBlend;
kBlend.AlphaFormat = AC_SRC_ALPHA;
kBlend.SourceConstantAlpha = ;
kBlend.BlendFlags = ;
kBlend.BlendOp = AC_SRC_OVER; UpdateLayeredWindow(g_hWnd, , &kPoint, &kSize, hDC, &kPoint, , &kBlend, ULW_ALPHA); g_pkOffscreenPlainSurface->ReleaseDC(hDC);
//g_pkRenderTarget->ReleaseDC(hDC);
} LRESULT WINAPI MsgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
switch (msg)
{
case WM_DESTROY:
Cleanup();
PostQuitMessage();
return ;
} return DefWindowProc(hWnd, msg, wParam, lParam);
} INT WINAPI wWinMain(HINSTANCE hInst, HINSTANCE, LPWSTR, INT)
{
UNREFERENCED_PARAMETER(hInst); WNDCLASSEX wc =
{
sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, L"D3D Tutorial", NULL
};
RegisterClassEx(&wc); g_hWnd = CreateWindowEx(WS_EX_LAYERED, L"D3D Tutorial", L"D3D Tutorial 03: Matrices", WS_POPUP | WS_THICKFRAME, , , , , NULL, NULL, wc.hInstance, NULL); if (SUCCEEDED(InitD3D(g_hWnd)))
{
if (SUCCEEDED(InitGeometry()))
{
ShowWindow(g_hWnd, SW_SHOWDEFAULT);
UpdateWindow(g_hWnd); MSG msg;
ZeroMemory(&msg, sizeof(msg));
while (msg.message != WM_QUIT)
{
if (PeekMessage(&msg, NULL, 0U, 0U, PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
Render();
}
}
}
} UnregisterClass(L"D3D Tutorial", wc.hInstance);
return ;
}

桌面 透明 三角形 分层窗口 DX的更多相关文章

  1. [置顶] VC++界面编程之--使用分层窗口实现界面皮肤

    使用分层界面来实现界面皮肤的好处是:可以保证图片边缘处理不失真,且能用于异形窗口上,如一些不规则的窗口,你很难用SetWindowRgn来达到理想效果. 在很多情况下,界面的漂亮与否,取决于PS的制作 ...

  2. VC++界面编程之--使用分层窗口实现界面皮肤

    使用分层界面来实现界面皮肤的好处是:可以保证图片边缘处理不失真,且能用于异形窗口上,如一些不规则的窗口,你很难用SetWindowRgn来达到理想效果. 在很多情况下,界面的漂亮与否,取决于PS的制作 ...

  3. 第二十篇:在SOUI中使用分层窗口

    从Windows 2K开始,MS为UI开发引入了分层窗口这一窗口风格.使用分层窗口,应用程序的主窗口可以是半透明,也可以是逐点半透明(即每一个像素点的透明度可以不同). 可以说,正是因为有了分层窗口, ...

  4. android在桌面弹出一个窗口

    android在桌面弹出一个窗口 遇到了这种需求,要和iPhone一样的效果. 下面是简单实现功能,优化和美化部分,有时间慢慢搞. 方法应该有不少吧,我用的是弹出一个activity,将这个activ ...

  5. C# 实现窗口程序winform像QQ一样靠近桌面边缘自动隐藏窗口

    实现原理: 实现这个功能的原理步骤如下: 1.判断窗体程序是否靠近桌面边缘: 2.获取桌面屏幕大小与窗体程序大小: 3.把窗体程序显示在桌面以外隐藏起来,预留部分窗体方便用户拉出程序: 4.判断鼠标是 ...

  6. android 桌面透明

      目录(?)[-] public void setWallpaperOffsetSteps float xStep float yStep Parameters public void setWal ...

  7. winform, 实现窗口程序像QQ一样靠近桌面边缘自动隐藏窗口

    实现原理: 步骤如下: 1.判断窗体程序是否靠近桌面边缘: 2.获取桌面屏幕大小与窗体程序大小: 3.把窗体程序显示在桌面以外隐藏起来,预留部分窗体方便用户拉出程序: 4.判断鼠标是否在窗体程序上,在 ...

  8. Windows 10设置桌面图标间距、窗口的背景颜色、选中文字的背景颜色

    Windows 10取消了“高级外观设置”(或者叫“窗口颜色和外观”设置),想调整一些参数只能进注册表了. 修改后可能需要注销或重启才能生效. 按Win+R,然后输入regedit进入注册表编辑器. ...

  9. css实现的透明三角形

    css实现下图样式,具体像素值记不住了,很好设置,html code (2014百度秋招面试题): <div id="demo"></div>   分析:这 ...

随机推荐

  1. clr via c# 读书笔记

    WOW64 WOW64 (Windows 位应用程序提供了 位的模拟,可以使大多数 位应用程序在无需修改的情况下运行在 Windows 位版本上. com对象 COM:The Component Ob ...

  2. OA及权限系统

    一直想找一款适合自己的权限管理后台,始终都没找到合适的,决定自己写一个 开发环境:vs2012 ,sql2008 语言:C# 前端:ligurui,jquery ORM框架:EF6.0 先来晒下我的数 ...

  3. Web工作原理

    第一步:寻找域名服务器,将域名(www.nice.com)的主机解析成服务器的ip的地址. 第二步:使用http协议连接Apache网页服务器,请求到服务器对应的目录下的文件,例如:index.php ...

  4. Zabbix(一)--zabbix 2.4.8 安装

    zabbix依赖于LAMP,所以部署前要先保证这个平台. 安装服务端(Server) zabbix官网的rpm包都是按照功能分开一个个,比如: zabbix-server-2.4.7-1.el7.x8 ...

  5. About memories in ASIC FPGA

    1. Write first | Read First | No Change区别在于:en & wr的时候,dout是什么,三种case对应于: dout = din; dout = mem ...

  6. 如何用Tacker将NFV带入OpenStack?

    最初社区里很多人争论过NFV是否属于OpenStack,而后来可以确定的是OpenStack的确占据了NFV会话中的很大一部分,并且形象地反映在了下面的ETSI MANO概念架构图中,OpenStac ...

  7. Spring知识点总结大全(2)

    3.Spring的AOP 一.AOP(Aspect-oriented programming,面向切面编程): 什么是AOP? 定义:将程序中的交叉业务逻辑提取出来,称之为切面.将这些切面动态织入到目 ...

  8. UIScrollView的三个属性

    contentSize.contentOffset.contentInset   UIScrollView的frame的size 指的是可视范围   contentSize  内容大小,滚动的范围 创 ...

  9. max min 与 min max 的差别

    在求解最优化问题时,遇到一个对偶问题的转换:对于形如 的问题,可以转换为求解 即原问题的对偶问题.而在一般情况下: 对于这个为题的说明我参照http://math.stackexchange.com/ ...

  10. .net配置文件读取

    public static string LogPath { get { return AppSettingValue(); } } public static string AppSettingVa ...