3

CComboBoxをオーバーライドするサブクラスを含む大規模な MFC アプリケーションを継承しましたOnPaint。現在、(線と四角形を使用して) すべての描画を手作業で行い、明らかに Windows 98 スタイルに見えるコンボ ボックスをレンダリングします。ただし、それ以外の点ではうまく機能し、私たちが依存している多くの便利なカスタム機能を提供します。コントロール全体を書き直すことはおそらく選択肢ではありません。

可能な場合は Aero スタイルで描画できるように最新化したいと思いOnPaintます (最新のテーマが利用できない場合は古いコードに戻ります)。ボタンなど、他のいくつかのカスタム コントロールを使用してこれを行いましたが、この目的には最適です。マウスホバー時の穏やかなハイライトなど、正しく動作しない小さな動作があることは知っていますが、それはこのアプリでは大した問題ではありません.

CVisualStylesXP私はckass にアクセスできるのでOpenThemeData、のようGetThemeColorな呼び出しを行うためのインフラストラクチャを既に持っていDrawThemeBackgroundます ( LoadLibraryVista を最小システムとして強制しません)。残念ながら、テーマに適した境界線とドロップダウン ボタンを備えた見栄えの良いコンボ ボックスを取得するための適切な呼び出しシーケンスがわかりません。

ここで何をすべきか知っている人はいますか?

4

3 に答える 3

0

同じ状況かどうかはわかりませんが、この問題に直面したとき (サブクラス化された CButton の場合)、解決するには、コントロール宣言をポインターに変更し、コントロールを動的に作成するだけで済みました。

サブクラス化されたコントロールが CComboBoxExt と呼ばれるとします。
あなたが持っていた場所

CComboBoxExt m_cComboBoxExt;

あなたは今持っているでしょう

CComboBoxExt* m_pcComboBoxExt; 

そして、コントロールが配置されているウィンドウの OnInitDialog で、次を使用して作成します

m_pcComboBoxExt = new CComboBoxExt();  
m_pcComboBoxExt->Create(...)

DestroyWindow()これは現在ポインターであるため、終了時にポインターを呼び出して削除することを忘れないでください。

これで私の特定の問題が解決しました。コントロールが同じ方法で宣言されている場合は、試してみることを検討してください。

于 2012-04-14T10:10:45.690 に答える
0

XP テーマとさまざまなシステム メトリックの詳細に飛び込まずに、このプロジェクトを見てみるのが最善だと思います: http://www.codeproject.com/Articles/2584/AdvComboBox-Version-2-1

CAdvComboBox クラスの OnPaint を確認してください。xp テーマ関連の問題を含む、コントロールの再描画の完全な実装があります。

于 2012-03-24T09:50:31.063 に答える
0

正直なところ、彼らが最初に OnPaint をオーバーライドしようとした理由がわかりません。正当な理由はありますか?少なくとも 99% の時間は、ComboBox 内の項目の描画をオーバーライドしたいだけだと思います。そのために、派生コンボ ボックスで DrawItem、MeasureItem、および CompareItem をオーバーライドして、必要な機能を取得できます。その場合、OS は各 OS 固有の非ユーザー コンテンツを正しく描画します。

于 2012-03-15T17:54:43.800 に答える