1

数年前、私たちは CaptionX ( CaptionX Home Page )と呼ばれる ActiveX コンポーネントを開発しました。これにより、開発者はカスタムのクリック可能なグラフィック ボタンをウィンドウのタイトル バーに配置できます。Aero グラスがオンになっている場合、Vista と Windows 7 を除くすべての Windows で正常に動作します。カスタム アイコンを含むタイトル バーは、ウィンドウの境界線に透明効果を適用せずに、Windows の基本テーマを使用したかのように描画されます。

人々は最新バージョンの OS で CaptionX を使用したいと考えていますが、それを機能させることはできません。インターネットで検索すると、DWMWA_NCRENDERING_POLICY 属性を指定した DwmSetWindowAttribute API 呼び出しを使用してウィンドウ タイトルでカスタム描画を使用する場合、Aero Glass を有効にする必要があることがわかりますが、機能させるには至っていません。

ウィンドウの非クライアント サーフェスを描画するコードは次のようになります (申し訳ありませんが、古い VB6 です :):

Friend Function WindowProc(ByVal lPrevWndProc As Long, ByVal hwnd As Long, ByVal iMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

   Select Case iMsg

   Case WM_NCPAINT
      DoNCPaint lPrevWndProc, wParam
      WindowProc = 0
      Exit Function

   Case WM_...
      ' Other message handlers

   End Select

   WindowProc = CallWindowProc(lPrevWndProc, hwnd, iMsg, wParam, lParam)
End Function

次の呼び出しを追加しました

DwmSetWindowAttribute m_hwnd, DWMWA_NCRENDERING_POLICY, DWMNCRP_ENABLED, 4

コードの多くの場所に適用されますが、効果はありません。DwmSetWindowAttribute を使用してウィンドウでデフォルトで使用されている場合、Aero Glass 効果を無効にすることはできますが、有効にすることはできません。

私たちは何を間違っていますか?コードにさらに API 呼び出しを追加する必要がありますか? その場合、どこに追加しますか?

4

2 に答える 2

0

呼び出しに誤りがある可能性があります。プレーンな DWMNCRP_ENABLED 値を API に渡すのではなく、DWMNCRENDERINGPOLICY 構造体の参照を渡す必要があります。

于 2012-02-04T16:01:30.133 に答える
0

この古いアプローチは、ウィンドウ フレームの描画を担当する新しいデスクトップ ウィンドウ マネージャー (DWM) が原因で、Vista 以降の最新バージョンの Windows では機能しません。また、web.archive.org で見つかった、問題の性質を説明している興味深いブログの 1 つを次に示します。

Aero Basic ウィンドウ フレームに関するよくある質問

該当する抜粋は次のとおりです。

ガラス フレームはまったく異なるプロセスによってレンダリングおよび管理されるため、アプリケーションはガラス フレーム内に描画できないため、DWM には従来の懸念はありません。アプリケーションがそれを行おうとすると、Windows はそれを検出してグラス フレームを完全に削除し (したがって、基本フレームに戻します)、アプリケーションが描画したいものを描画できるようにします。

Windows Vista、7 などでウィンドウのタイトル バーを変更するには、新しいDWM APIを使用する必要があります。

于 2016-03-17T08:19:57.813 に答える