c – 渲染到桌面
发布时间:2020-12-16 07:27:07 所属栏目:百科 来源:网络整理
导读:我希望能够渲染一个像壁纸一样的东西.我使用 Windows,我更喜欢DirectX.我知道VLC可以在DirectX模式下呈现视频壁纸,所以它是可能的. 所以,一个简单的问题,我怎么能设置rendertarget呈现,如果它是Windows中的壁纸? 解决方法 这里有一些代码可以让你获得一个窗
我希望能够渲染一个像壁纸一样的东西.我使用
Windows,我更喜欢DirectX.我知道VLC可以在DirectX模式下呈现视频壁纸,所以它是可能的.
所以,一个简单的问题,我怎么能设置rendertarget呈现,如果它是Windows中的壁纸? 解决方法
这里有一些代码可以让你获得一个窗口的句柄(HWND),可以用来绘制windows桌面的顶部.这是如何工作的主要问题是桌面图标仍然存在,但这将允许您绘制它们之上.如果你想让图标显示为正常(你的东西在它们后面),你需要在绘制完东西之后重新绘制它们,或者找到一种方法来避免首先绘制它们.这是非常重要的,我从未完全解决过.
这肯定适用于XP和Windows 7(使用Areo),以获得普通GDI绘图可以使用的东西.我从未使用DirectX对其进行测试,但我怀疑如果您使用hMainWnd作为演示窗口,它会起作用. HWND hProgMan = NULL; HWND hShell = NULL; HWND hMainWnd = NULL; unsigned int ScreenWidth = 0; unsigned int ScreenHeight = 0; int ScreenTop = 0; int ScreenLeft = 0; HRGN ValidRGN = NULL; // ... ScreenWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN); if ( ScreenWidth == 0 ) ScreenWidth = GetSystemMetrics( SM_CXSCREEN ); ScreenHeight = GetSystemMetrics(SM_CYVIRTUALSCREEN); if ( ScreenHeight == 0 ) ScreenHeight = GetSystemMetrics(SM_CYSCREEN); ScreenTop = GetSystemMetrics(SM_YVIRTUALSCREEN); ScreenLeft = GetSystemMetrics(SM_XVIRTUALSCREEN); ValidRGN = CreateRectRgn(0,ScreenWidth,ScreenHeight); hProgMan = FindWindow("Progman","Program Manager"); if(hProgMan != NULL) { hShell = FindWindowEx(hProgMan,"SHELLDLL_DefView",NULL); } else { hProgMan = FindWindow("DesktopBackgroundClass",NULL); if(hProgMan != NULL) hShell = FindWindowEx(hProgMan,"DeskFolder",NULL); } hMainWnd = CreateWindowEx( WS_EX_TRANSPARENT,"MyWindowClass","Window Title",WS_CHILDWINDOW | WS_OVERLAPPED | WS_CLIPCHILDREN,ScreenHeight,hShell,NULL,hInstance,NULL ); EnableWindow(hMainWnd,FALSE); SetWindowPos(hMainWnd,HWND_BOTTOM,SWP_NOSIZE|SWP_NOMOVE); …然后用于绘图(使用GDI),像这样…… HDC hDC = GetDC( hMainWnd ); SelectClipRgn(hDC,ValidRGN); BitBlt( hDC,ScreenX,ScreenY,hBackBuffer,SRCCOPY ); ReleaseDC( hMainWnd,hDC ); …并使用桌面图标的区域更新ValidRGN.通过Desktop的listview控制窗口可以找到一些工具.对于这个问题,这个问题相当复杂. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |