2012-07-11 4 views
5

일부 부품에서는 QML을 사용하여 Qt/C++ 응용 프로그램을 만들고 있습니다. 창 아래에서 내 창 클래스에서이 스 니펫에서 본 ExtendFrameIntoClientArea를 사용하여 반투명 창을 사용하고 싶습니다.QT 반투명 창 및 원격 데스크톱

#ifdef Q_WS_WIN 
    if (QSysInfo::windowsVersion() == QSysInfo::WV_VISTA || 
     QSysInfo::windowsVersion() == QSysInfo::WV_WINDOWS7) 
    { 
     EnableBlurBehindWidget(this, true); 
     ExtendFrameIntoClientArea(this); 
    } 
#else 

코드는 한 가지 예외를 제외하고는 잘 작동합니다. 투명한 윈도우 시스템이 꺼져 있으면 배경이 검은 색이되고 내 UI의 일부분이 투명 해져 어두워집니다. 위의 코드가 다시 실행될 때까지 투명 창 시스템이 즉시 다시 초기화되는 경우에도 응용 프로그램을 실행하는 원격 컴퓨터에 로그인 할 때 동일한 문제가 발생합니다. Comparison of failed rendering (in background) and correct (in front).

문제는 투명 창을 다시 초기화하는 데 필요한 신호를 찾고, 그렇지 않은 경우 창을 투명하게 그릴 때 감지하여 그에 따라 UI를 그립니다. 다른 대안도 환영합니다.

답변

2

Qt와 MSDN Aero documentation에서 파기 한 후 두 단계의 해결책을 찾았습니다. 메인 윈도우의 winEvent 메소드를 오버라이드함으로써, 반투명 윈도우 시스템이 활성화되거나 비활성화 될 때마다 트리거되는 신호를 수신 할 수있었습니다. 나를 아주 가까운했다, 그러나 DWM은 현재 투명 창을 그리거나하지되었는지 여부를 말하지 않았다

#define WM_DWMCOMPOSITIONCHANGED  0x031E 

bool MainWindow::winEvent(MSG *message, long *result) { 
    if (message->message == WM_DWMCOMPOSITIONCHANGED) { 
     // window manager signaled change in composition 
     return true; 
    } 
    return false; 
} 

. dwmapi.dll를 사용하여 나는 정확히을하는 방법을 찾을 수 있었고, 그것은 다음과 같이 액세스 할 수 있습니다

// QtDwmApi.cpp 
extern "C" 
{ 
    typedef HRESULT (WINAPI *t_DwmIsCompositionEnabled)(BOOL *pfEnabled); 
} 

bool DwmIsCompositionEnabled() { 
    HMODULE shell; 

    shell = LoadLibrary(L"dwmapi.dll"); 
    if (shell) { 
     BOOL enabled; 
     t_DwmIsCompositionEnabled is_composition_enabled = \ 
       reinterpret_cast<t_DwmIsCompositionEnabled>(
        GetProcAddress (shell, "DwmIsCompositionEnabled") 
       ); 
     is_composition_enabled(&enabled); 

     FreeLibrary (shell); 

     if (enabled) { 
      return true; 
     } else { 
      return false; 
     } 
    } 
    return false; 
} 

내 구현은 이제 에어로의 변화에 ​​반응하고 그에 따라 GUI를 그릴 수있다. 원격 데스크톱을 통해 로그인 할 때 투명성을 사용하여 창을 그릴 수 있습니다.

0
The function should be written as follows to avoid the GPA failure 

// QtDwmApi.cpp 
extern "C" 
{ 
    typedef HRESULT (WINAPI *t_DwmIsCompositionEnabled)(BOOL *pfEnabled); 
} 

bool DwmIsCompositionEnabled() { 
    HMODULE shell; 
    BOOL enabled=false; 

    shell = LoadLibrary(L"dwmapi.dll"); 
    if (shell) { 
     t_DwmIsCompositionEnabled is_composition_enabled = \ 
       reinterpret_cast<t_DwmIsCompositionEnabled>(
        GetProcAddress (shell, "DwmIsCompositionEnabled") 
       ); 
     if (is_composition_enabled) 
      is_composition_enabled(&enabled); 

     FreeLibrary (shell); 
    } 
    return enabled; 
}