2012-07-11 12 views
5

मैं कुछ हिस्सों के लिए क्यूएमएल का उपयोग कर एक क्यूटी/सी ++ एप्लिकेशन बना रहा हूं। विंडोज़ के तहत मैं अपनी विंडो क्लास से इस स्निपेट में देखी गई ExtendFrameIntoClientArea का उपयोग करके पारदर्शी विंडोिंग का उपयोग करना चाहता हूं।क्यूटी पारदर्शी खिड़की और रिमोट डेस्कटॉप

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

कोड एक अपवाद के साथ अच्छी तरह से काम कर रहा है। यदि पारदर्शी विंडो सिस्टम बंद हो जाता है तो पृष्ठभूमि काला हो जाती है, और मेरे यूआई का हिस्सा पारदर्शी होता है, यह भी अंधेरा हो जाता है। एक ही चीज होती है जब अनुप्रयोग चलाने वाले रिमोट कंप्यूटर में लॉग इन करते हैं, भले ही पारदर्शी विंडोिंग सिस्टम को फिर से शुरू किया जाए, फिर भी पृष्ठभूमि उपरोक्त कोड को फिर से निष्पादित होने तक काला रहता है। यह इस छवि में दर्शाया गया है: Comparison of failed rendering (in background) and correct (in front).

समस्या एक संकेत को खोजने के लिए पारदर्शी खिड़की फिर से आरंभ करने के लिए, या बेहतर अभी तक जब विंडोज़ पारदर्शी रूप से तैयार कर रहे हैं का पता लगाने और उसके अनुसार यूआई आकर्षित करने के लिए कनेक्ट करने के लिए है। किसी भी वैकल्पिक समाधान का भी स्वागत है।

उत्तर

2

दोनों क्यूटी और MSDN Aero documentation में चारों ओर खोदने के बाद मैं दो चरण समाधान के साथ आया। मेरी मुख्य विंडो की winEvent विधि को ओवरराइड करके, मैं उस सिग्नल को प्राप्त करने में सक्षम था जो पारदर्शी विंडो सिस्टम सक्षम या अक्षम होने पर हर बार ट्रिगर होता है।

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

मेरे कार्यान्वयन अब एयरो में परिवर्तन के लिए प्रतिक्रिया और उसके अनुसार जीयूआई आकर्षित करने के लिए सक्षम है। रिमोट डेस्कटॉप पर लॉग इन करते समय खिड़की पारदर्शिता का उपयोग करके तैयार की जाती है जहां भी उपलब्ध हो।

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