Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 渲染到桌面_C++_Windows_Directx_Rendering_Wallpaper - Fatal编程技术网

C++ 渲染到桌面

C++ 渲染到桌面,c++,windows,directx,rendering,wallpaper,C++,Windows,Directx,Rendering,Wallpaper,我希望能够渲染一件东西,就像它是一张壁纸一样。我使用Windows,我更喜欢DirectX。我知道VLC可以在DirectX模式下渲染视频,所以这是可能的 因此,一个简单的问题是,我如何设置rendertarget,使其像Windows中的墙纸一样进行渲染?以下是一些代码,它将为您提供一个窗口句柄(HWND),该窗口可用于在Windows桌面上方绘制。其工作原理的主要问题是桌面图标仍然存在,但这将允许您在其上方绘制。如果你想让图标看起来正常(后面有你的东西),你需要在你画完你的东西后重新画它们,

我希望能够渲染一件东西,就像它是一张壁纸一样。我使用Windows,我更喜欢DirectX。我知道VLC可以在DirectX模式下渲染视频,所以这是可能的


因此,一个简单的问题是,我如何设置rendertarget,使其像Windows中的墙纸一样进行渲染?

以下是一些代码,它将为您提供一个窗口句柄(HWND),该窗口可用于在Windows桌面上方绘制。其工作原理的主要问题是桌面图标仍然存在,但这将允许您在其上方绘制。如果你想让图标看起来正常(后面有你的东西),你需要在你画完你的东西后重新画它们,或者找到一种方法避免一开始就画在它们上面。这是相当不平凡的事情,我从来没有完全解决过

这在XP和Windows7(使用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,0,ScreenWidth,ScreenHeight);

    hProgMan = FindWindow("Progman", "Program Manager");
    if(hProgMan != NULL)
    {
        hShell = FindWindowEx(hProgMan, 0, "SHELLDLL_DefView", NULL);
    }
    else
    {
        hProgMan = FindWindow("DesktopBackgroundClass", NULL);
        if(hProgMan != NULL)
            hShell = FindWindowEx(hProgMan, 0, "DeskFolder", NULL);
    }

    hMainWnd = CreateWindowEx( WS_EX_TRANSPARENT, "MyWindowClass", "Window Title", WS_CHILDWINDOW | WS_OVERLAPPED | WS_CLIPCHILDREN, 0,0,ScreenWidth,ScreenHeight, hShell,NULL,hInstance,NULL );
    EnableWindow(hMainWnd,FALSE);
    SetWindowPos(hMainWnd,HWND_BOTTOM,0,0,0,0,SWP_NOSIZE|SWP_NOMOVE);
。。。然后对于绘图(使用GDI),类似这样的东西

    HDC hDC = GetDC( hMainWnd );
    SelectClipRgn(hDC,ValidRGN);
    BitBlt( hDC, 0, 0, ScreenX, ScreenY, hBackBuffer, 0, 0, SRCCOPY );
    ReleaseDC( hMainWnd, hDC );

。。。并使用桌面图标的区域更新
ValidRGN
。通过使用桌面的listview控件窗口可以找到这些。这相当复杂,可能与这个问题无关。

好吧,我想让它像普通墙纸一样,上面有图标。无论如何,我会看看你的代码,看看是否可以做些什么来渲染图标后面的内容。谢谢。看起来你可以从桌面抓取一个DC并绘制到它:无需创建子窗口。该线程中的作者无法将Direct3D与该DC一起使用,但您应该能够渲染到隐藏窗口,捕获结果,然后将其blit到桌面。