紹介と関連情報:
メイン ウィンドウの背景とその子静的コントロールの複雑な描画を実装しました。
下の写真はそれがどのように見えるかを示しています。
静的コントロールには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_VREDRAW
とCS_HREDRAW
をウィンドウ クラスから除外しました。したがって、ちらつきが発生することはありません。
私のウィンドウにはスタイルがあることを忘れていたので、メンバーのロジャー・ローランドWS_CLIPCHILDREN
による次のコメントに応えて、今それについて言及しています。
ちらつきを避けるために、両方のハンドラーにダブル バッファリングを実装しました。
質問:
ちらつきをなくすためにデモ プロジェクトのコードを変更するにはどうすればよいですか?
WM_PAINT
ハンドラーとハンドラーの両方を最適化する方法についてアドバイスが必要なWM_CTLCOLORSTATIC
ので、ペイント コードをより効率的かつ高速にします。
2 番目の質問に対する小さなメモ:
メイン ウィンドウの背景に画像全体を描画してコードを改善し、その静的コントロールの背景に対応する画像の部分の上に透明な静的コントロールを配置することを考えていました。
そうすればNULL_BRUSH
、WM_CTLCOLORSTATIC
ハンドラーでのみ戻り、すべての作業をWM_PAINT
.
私はこの考えで正しい軌道に乗っていますか? これはうまくいきますか?
ありがとうございました。よろしく。