2011-01-05 16 views
0

私のアプリケーション(CMDIChildWndクラスのオブジェクト)でいくつかのwndsを特定する必要があります。 これを行うには、私は点滅の感じを与えるように、代わりに特定の色を持つwndの境界を描画するためにタイマーを使用しています。これはWinXPマシンでは完璧に動作しますが、Win7マシンでは悲惨な結果となります。強調表示された枠線のペイントにはかなりの遅延があります。
ただし、に最適化すると、最適なパフォーマンスが得られます。すべての設定がスムーズに機能します。Windows 7での描画の遅延OS

私はCCLinetDC::Rectangle()境界線を描画する方法を使用しています。 Win7にこのAPIに関する既知の問題はありますか?どうすればWin7でも同様に動作させることができますか?

+0

に切り替えされているもの "最高のパフォーマンスを最適化?"これはコンパイラオプションかOSの設定ですか? –

+0

OS設定のDavidです。 Control Pannelから_Adjust Visual Effects_設定の下で正確に設定します。 – Hemant

答えて

1

NC領域塗装を無効にしてみることができます。以下のような

何か:

#include <dwmapi.h> 
... 

HRESULT hr = E_FAIL; 
if (IsVistaOrAbove()) 
{ 
    DWMNCRENDERINGPOLICY ncrp = DWMNCRP_DISABLED; 
    hr = ::DwmSetWindowAttribute(m_hWnd, DWMWA_NCRENDERING_POLICY, &ncrp, sizeof(ncrp)); 
    ASSERT(SUCCEEDED(hr)); 
} 

しかし、それはまた、窓にエアロを無効にします。

したがって、境界にないクライアント領域に点滅を表示する方が簡単です。

XPの互換性のため

UPDATED、あなたはこのようにDWM APIを使用する必要があります。

typedef HRESULT (WINAPI *pfnDwmIsCompositionEnabled)(BOOL *pfEnabled); 
static pfnDwmIsCompositionEnabled s_DwmIsCompositionEnabled; 
typedef HRESULT (WINAPI *pfnDwmSetWindowAttribute)(HWND hwnd, DWORD dwAttribute, LPCVOID pvAttribute, DWORD cbAttribute); 
static pfnDwmSetWindowAttribute s_DwmSetWindowAttribute; 
typedef HRESULT (WINAPI *pfnDwmGetWindowAttribute)(HWND hwnd, DWORD dwAttribute, LPCVOID pvAttribute, DWORD cbAttribute); 
static pfnDwmGetWindowAttribute s_DwmGetWindowAttribute; 


HMODULE hSysDll = LoadLibrary(_T("dwmapi.dll")); 
if(hSysDll) // Loaded dwmapi.dll success, must Vista or above 
{ 
    s_DwmIsCompositionEnabled = (pfnDwmIsCompositionEnabled)GetProcAddress(hSysDll, "DwmIsCompositionEnabled"); 
    s_DwmSetWindowAttribute = (pfnDwmSetWindowAttribute)GetProcAddress(hSysDll, "DwmSetWindowAttribute"); 
    s_DwmGetWindowAttribute = (pfnDwmGetWindowAttribute)GetProcAddress(hSysDll, "DwmGetWindowAttribute"); 
} 
... 
... 
bool IsAeroEnabled() 
{ 
    BOOL bAero = FALSE; 
    if(s_DwmIsCompositionEnabled) 
     s_DwmIsCompositionEnabled(&bAero); 
    return bAero != FALSE; 
} 
... 
... 
HRESULT ProxyDwmSetWindowAttribute(HWND hwnd, DWORD dwAttribute, LPCVOID pvAttribute, DWORD cbAttribute) 
{ 
    if (s_DwmSetWindowAttribute) 
    { 
     return s_DwmSetWindowAttribute(hwnd, dwAttribute, pvAttribute, cbAttribute); 
    } 
    return E_FAIL; 
} 
+0

1つの質問 - これは、NCレンダリングポリシーをグローバルに(つまり他のすべてのアプリケーションのために)設定するか、ハンドル固有のウィンドウに対してのみ設定しますか?イベント(ウィンドウの特定)が終了した後、元の設定をリセットしますか? – Hemant

+0

また、矩形はクライアント領域にのみ描かれ、NC領域には描画されません。私はこのために 'CCLinetDC'を使用していますが、確かにクライアント領域だけを描画します。 – Hemant

+0

@Hemantああ。私の言葉は誤解を招いています。とにかく、それはDWM関連の問題かもしれません。 DWM構成が無効になっているときに問題が解決されたかどうかを確認することで確認できます。デスクトップテーマを非エアロに変更します。 – 9dan

関連する問題