4

紹介と関連情報:

メイン ウィンドウの背景とその子静的コントロールの複雑な描画を実装しました。

下の写真はそれがどのように見えるかを示しています。

ここに画像の説明を入力

静的コントロールにはSS_NOTIFY、ユーザーがクリックすると特定のことが起こるため、言及することが重要なスタイルがあります。

この時点で、それらをクリックしたときにアクティブ化されるアクションは関係ありません。

メイン ウィンドウと静的コントロールの両方に、GradientFill(...)API を使用して作成されたグラデーションの背景があります。

メインウィンドウのトップバナーは灰色のブラシで作成し、グリッド線は API で作成しましLineTo(...)MoveTo(...)

オレンジ色のスタティック コントロールにマップします。左上のロゴはEMFファイル、右上のロゴはPNGファイル、その他の画像はビットマップです。

オレンジ色の静的コントロールには、スタイルを持つ 4 つの子静的コントロールがありowner drawnますSS_NOTIFY

これは私が考えた唯一の方法であり、要求された方法でコントロールを描画することができました (これを改善できる場合は、提案してください。合理的な提案を受け入れます)。

オレンジ色の静的コントロールを描画するために、WM_CTLCOLORSTATICハンドラーでその背景を描画し、所有者がサブクラス プロシージャで子静的コントロールを描画することにしました。

子静的コントロールから受信した通知も、親ウィンドウに転送する方法がわからなかったため、オレンジ色の静的コントロール サブクラス プロシージャで処理されますが、現時点では関係がないため省略します。

この投稿をコード スニペットで非常に長くする代わりに、デモ プロジェクトへのリンクを提供することにしました。

可能な限り小さくてシンプルなデモ アプリケーションを送信しようとしました。

解説を省略していないので、すべてがソース コードで十分にカバーされ、説明されていると思います。

まだ質問がある場合は、コメントを残してください。できるだけ早く返信します (通常はすぐに、または少なくとも同じ日に)。

デモ プロジェクトへのリンクは次のとおりです: http://www.filedropper.com/geotermistgrafika_1

重要な更新:

/=============================================== =========/

角括弧内のテキストは質問の元の部分でしたが、プロジェクトにメモリ リークがあったため現在は省略されています。上記のリンクは改善されたバージョンにリンクしています。

[メンバー xMRi のコメントに応じて更新:このリンクは問題ないはずです: http://www.filedropper.com/geotermistgrafika ]

/=============================================== =========/

MS Visual Studio C++ と純粋な Win32 API を使用して、Windows XP で作業しています。

注: VS の Express エディションにはリソース エディターがないため、リソース ファイルとリソース ヘッダーは、 http : //www.resedit.net/からResEditを使用して作成されました。

問題:

ウィンドウのサイズを変更すると、静的コントロールがわずかにちらつきます。

問題を解決するための私の努力:

私のコードにはメモリリークがないと信じています-したがって、これが問題であるとは思えませんが、経験が浅いため、私の仮定が何らかの形で確認できれば非常にありがたいです.

を適切に処理したと思います。また、WM_ERASEBKGNDスタイルCS_VREDRAWCS_HREDRAWをウィンドウ クラスから除外しました。したがって、ちらつきが発生することはありません。

私のウィンドウにはスタイルがあることを忘れていたので、メンバーのロジャー・ローランドWS_CLIPCHILDRENによる次のコメントに応えて、今それについて言及しています。

ちらつきを避けるために、両方のハンドラーにダブル バッファリングを実装しました。

質問:

  1. ちらつきをなくすためにデモ プロジェクトのコードを変更するにはどうすればよいですか?

  2. WM_PAINTハンドラーとハンドラーの両方を最適化する方法についてアドバイスが必要なWM_CTLCOLORSTATICので、ペイント コードをより効率的かつ高速にします。

2 番目の質問に対する小さなメモ:

メイン ウィンドウの背景に画像全体を描画してコードを改善し、その静的コントロールの背景に対応する画像の部分の上に透明な静的コントロールを配置することを考えていました。

そうすればNULL_BRUSHWM_CTLCOLORSTATICハンドラーでのみ戻り、すべての作業をWM_PAINT.

私はこの考えで正しい軌道に乗っていますか? これはうまくいきますか?

ありがとうございました。よろしく。

4

1 に答える 1