2011-09-17 6 views
4

마치 벽지 인 것처럼 렌더링 할 수 있기를 원합니다. Windows를 사용하며 DirectX를 선호합니다. 나는 VLC가 비디오를 DirectX 모드의 배경 화면으로 렌더링 할 수 있다는 것을 알고 있으므로 가능합니다.바탕 화면으로 렌더링

Windows에서 배경 무늬 인 것처럼 렌더 타겟을 어떻게 렌더링 할 수 있습니까?

답변

2

다음은 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 컨트롤 윈도우에서 약간의 작업으로 발견 할 수 있습니다. 그것은 상당히 복잡하고 어쩌면이 질문에 대한 주제와 관련이 없습니다.

+0

글쎄, 정상적인 벽지처럼 아이콘이있는 것처럼 행동하고 싶습니다. 어쨌든 아이콘 뒤에 렌더링 할 수 있는지 알아보기 위해 코드를 둘러 보겠습니다. 감사. – user950760

+1

데스크톱에서 DC를 가져 와서 그릴 수있는 것처럼 보입니다. http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/5700adf8-5c47-404f-8741-600643442449 만들기없이 자식 창. 이 스레드의 작성자는 해당 DC에서 Direct3D를 사용할 수 없지만 숨겨진 창으로 렌더링하고 결과를 캡처 한 다음 데스크톱으로 블릿 할 수 있어야합니다. – IronMensan

관련 문제