この境界のちらつきの問題は、Delphi VCL スタイルを使用した結果ではありません。
(VCL スタイルを使用しなくても同じ問題が発生する可能性があります)
ここでの犯人は、Windows のビジュアル スタイルとテーマの重要な部分であるデスクトップ ウィンドウ マネージャーです。
この問題が発生し、他の問題が発生しない理由は、ある時点で既定の Windows テーマ (aero テーマ) を変更したか、選択したテーマの特定の視覚効果プロパティを変更したためです。
また、デスクトップ ウィンドウ マネージャーは Windows サービスとして実行されるため、意図的または意図せずに無効にしている可能性があります。
より正確には、デスクトップ コンポジション機能を有効にすると、問題は解決されます。
この機能は、 Aeroテーマ (デフォルト)
でのみ使用できますが、 BasicまたはClassicでは使用できません。
Control Panel --> System --> Advanced System Settings --> Advanced --> Performance Settings --> Visual Effects
デスクトップ コンポジションが有効になっている場合、以前のバージョンの Windows のように、個々のウィンドウが画面またはプライマリ ディスプレイ デバイスに直接描画されることはなくなりました。代わりに、描画はビデオ メモリ内のオフスクリーン サーフェスにリダイレクトされ、デスクトップ イメージにレンダリングされてディスプレイに表示されます。
ご想像のとおり、この関数の機能は基本的にバッファとして機能することで
あり、このオプションがオフになっているときの境界のちらつきを非常にうまく説明しています。
重要な事実
デスクトップ コンポジション機能は、現在のテーマが Aero テーマであり、Windows Visual Stylesを使用している場合にのみ有効にできます(既定では、すべての Aero テーマで有効になっています)。
Use Visual Styles on Windows
ビジュアル スタイルは、Aero テーマではデフォルトで有効になっています。パフォーマンス設定で機能が有効になっていることを確認することで、有効になっていることを確認できます。クラシック テーマまたは基本テーマが有効な場合、デスクトップ コンポジション機能は使用されず、有効にすることはできません。(Windows 8 以降、クラシック テーマは廃止されました)
Windows 7 では、ベーシック テーマまたはクラシック テーマを使用している場合でも、デスクトップ コンポジション機能がパフォーマンス オプションに表示されることがありますが、だまされないでください。これは内部バグです。
このバグを再現する手順:
- デフォルトの Windows Aero テーマで開始
- 上記のようにパフォーマンス設定に移動します
- リストからデスクトップ構成のチェックを外します
- TComboBoxEx の境界線の上にマウスを移動すると、出入りするときにちらつきます。
しかし、チェックボックスをオフにするとどうなりUse Visual Styles on Windows
ますか? なぜこれでちらつきの問題が解決するのですか?
これにより、デスクトップ ウィンドウ マネージャー (DWM) がすべての Windows コントロールのテーマをまとめて無効にします。これは、新しい Aero レンダリング スタイルを使用するのではなく、古いレンダリング スタイルを使用してコントロールが描画されることを意味します。
次の方法で、グローバルにオフにすることなく、個々のコントロールの視覚スタイルをオフにすることができます。SetWindowTheme(Handle, nil, nil)
これは、視覚スタイルが無効になっているときに TComboBoxEx 境界線のちらつきの問題が解決される理由でもあります。また、Windows 8 以降、Classic テーマは廃止されたため、Visual Styles を無効にすることはできなくなりました。
解決策に関しては、本当に多くの選択肢があるとは思いません。Windows テーマの視覚効果を変更する際にユーザーにどれだけの自由が残されているかを考えると、この種のことは必然的に起こります。少なくとも、既定の Windows テーマではこの問題が発生しないことを確認できます。