마치 벽지 인 것처럼 렌더링 할 수 있기를 원합니다. 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);
... 그리고 그리기 용,
HDC hDC = GetDC(hMainWnd);
SelectClipRgn(hDC,ValidRGN);
BitBlt(hDC, 0, 0, ScreenX, ScreenY, hBackBuffer, 0, 0, SRCCOPY);
ReleaseDC(hMainWnd, hDC);
을 이런 식으로 뭔가를 (GDI를 사용하여) ... 그리고 바탕 화면 아이콘의 영역과 ValidRGN
를 업데이트합니다. 그것들은 Desktop의 listview 컨트롤 윈도우에서 약간의 작업으로 발견 할 수 있습니다. 그것은 상당히 복잡하고 어쩌면이 질문에 대한 주제와 관련이 없습니다.
글쎄, 정상적인 벽지처럼 아이콘이있는 것처럼 행동하고 싶습니다. 어쨌든 아이콘 뒤에 렌더링 할 수 있는지 알아보기 위해 코드를 둘러 보겠습니다. 감사. – user950760
데스크톱에서 DC를 가져 와서 그릴 수있는 것처럼 보입니다. http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/5700adf8-5c47-404f-8741-600643442449 만들기없이 자식 창. 이 스레드의 작성자는 해당 DC에서 Direct3D를 사용할 수 없지만 숨겨진 창으로 렌더링하고 결과를 캡처 한 다음 데스크톱으로 블릿 할 수 있어야합니다. – IronMensan