2012-07-11 37 views
5

Tôi đang tạo ứng dụng Qt/C++ bằng QML cho một số phần. Dưới cửa sổ, tôi muốn sử dụng cửa sổ mờ bằng cách sử dụng ExtendFrameIntoClientArea như được thấy trong đoạn mã này từ lớp cửa sổ của tôi.QT Cửa sổ mờ và màn hình từ xa

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

Mã hoạt động độc đáo với một ngoại lệ. Nếu hệ thống cửa sổ trong suốt bị tắt nền sẽ trở thành màu đen, và như một phần của giao diện người dùng của tôi là trong suốt nó trở nên tối là tốt. Điều tương tự cũng xảy ra khi đăng nhập vào máy tính từ xa đang chạy ứng dụng, ngay cả khi hệ thống cửa sổ trong suốt được khởi tạo lại ngay lập tức nền vẫn giữ màu đen cho đến khi mã trên được thực hiện lại. Điều này được thể hiện trong hình ảnh này: Comparison of failed rendering (in background) and correct (in front).

Vấn đề là tìm một tín hiệu để kết nối để khởi tạo lại cửa sổ trong suốt hoặc tốt hơn để phát hiện khi cửa sổ được vẽ trong suốt và vẽ giao diện người dùng cho phù hợp. Bất kỳ giải pháp thay thế nào cũng được hoan nghênh.

Trả lời

2

Sau khi đào xung quanh trong cả Qt và MSDN Aero documentation Tôi đã đưa ra giải pháp hai bước. Bằng cách ghi đè phương thức winEvent của cửa sổ chính, tôi có thể nhận tín hiệu được kích hoạt mỗi lần hệ thống cửa sổ mờ được bật hoặc tắt.

#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; 
} 

Điều đó đã cho tôi khá gần, nhưng nó không cho tôi biết liệu DWM có đang vẽ các cửa sổ trong suốt hay không. Bằng cách sử dụng dwmapi.dll tôi đã có thể tìm thấy một phương pháp mà làm chính xác điều đó, và nó có thể được truy cập như dưới đây:

// 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; 
} 

thực hiện của tôi bây giờ là khả năng phản ứng với những thay đổi trong Aero và vẽ GUI cho phù hợp. Khi đăng nhập trên màn hình từ xa, cửa sổ sẽ được vẽ bằng cách sử dụng tính minh bạch khi có sẵn.

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; 
} 
Các vấn đề liên quan