壁紙のようにレンダリングできるようにしたい。私はWindowsを使い、DirectXが好きです。私はVLCがDirectXモードの壁紙をビデオにレンダリングできることを知っているので、可能です。デスクトップにレンダリングする
Windowsの壁紙のようにレンダーターゲットをレンダリングするにはどうすればよいですか?
壁紙のようにレンダリングできるようにしたい。私はWindowsを使い、DirectXが好きです。私はVLCがDirectXモードの壁紙をビデオにレンダリングできることを知っているので、可能です。デスクトップにレンダリングする
Windowsの壁紙のようにレンダーターゲットをレンダリングするにはどうすればよいですか?
Windowsデスクトップの上に描画するためのウィンドウにハンドル(HWND)を表示するコードです。この仕組みの主な問題は、デスクトップのアイコンがまだ存在していることですが、これによりトップアイコンを上に描画できます。アイコンを通常のように表示するには(アイテムの背後にあるアイテム)、アイテムを描画した後にアイコンを再描画するか、最初にアイコンを描画しないようにする必要があります。これはかなり簡単ではありませんし、決して完全に解決していないものです。
これは、通常のGDI描画で使用できるものを取得するために、XPとWindows 7(Areoを使用)では間違いなく動作します。 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
を更新します。それらは、デスクトップのリストビューコントロールウィンドウで少しの作業で見つけることができます。それはかなり複雑で、おそらくこの質問の話題にはなりません。
まあ、普通の壁紙のように振る舞い、その上にアイコンがあるようにしたい。とにかく、アイコンの後ろにレンダリングすることができるかどうかを調べるためにコードを見ていきます。ありがとう。 – user950760
デスクトップからDCを取得して描画できるようです。http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/5700adf8-5c47-404f-8741-600643442449作成せずに子ウィンドウそのスレッドの作者は、そのDCでDirect3Dを使用することはできませんでしたが、非表示のウィンドウにレンダリングし、結果をキャプチャしてからデスクトップにblitできなければなりません。 – IronMensan