2012-03-27 8 views
5

私はGDI +を使用しているため、私は自分の小さなウィンドウレスGUIシステムを作成したいと思います。巨大なコード(C++)があるのでここに投稿することはできませんが、蛇腹は私が従う主なステップです。引き裂き効果なしで効率的にダブルバッファウィンドウをレンダリングするには?

  1. アプリケーションウィンドウと同じ大きさのビットマップを作成します。
  2. すべてのマウスとキーボードのイベントについてカスタムコントロールの状態を更新する(たとえば、マウスが現在特定のコントロールなどに保持されている場合など)
  3. WM_PAINTイベントでは、背景をオフスクリーンビットマップにペイントし、最後に、Graphics :: DrawImage(..)コールを介してオフスクリーンイメージ全体をフロントバッファにコピーします。
  4. WM_SIZE/WM_SIZINGの場合は、前のオフスクリーンビットマップを削除し、別のウィンドウサイズを新しいウィンドウサイズで作成します。

コントロールの繰り返し描画を防止するためのチェックもあります。つまり、コントロールの状態が変更されたときにのみ再描画が必要なときにのみ描画されます。

システムは正常に動作していますが、1つの例外があります。ウィンドウのサイズ変更中に何らかの種類の引き裂き効果が表示されます。今私が涙の効果を意味するものを説明しようとします...

私は境界をドラッグすると、ちらつきの隙間があります。私のDrawImage()スワップ操作が半分になると、別のイメージ描画が開始されます。

ここで、バックバッファのサイズ変更がウィンドウのサイズ変更と同じくらい速いとは限りませんが、他のアプリケーションでは、間に脚がありますがウィンドウのサイズとクライアント領域のサイズは、ウィンドウのサイズが大きくなり、エッジの近くでは何もちらつきがありません(通常、境界に沿って細い均一なストリップとして表示される白い背景です)。 また、ウィンドウのサイズ変更で動くダイナミックコントロールは、サイジング中にジャーキーになります。

最初は、フルスクリーンの一定サイズのオフスクリーンサーフェイスを使用するとアーチファクトを最小限に抑えることができたと思っていましたが、試してみると満足できる結果が得られませんでした。私はまた、サイジング中にSleep()を呼び出そうとしました。その結果、別のフリップが始まる前にフリップが完全に行われますが、それでも私にとってはうまくいきません。

私はVista上のGDIがハードウェアアクセラレーションではないと聞いていますが、それは問題かもしれませんか?

また、複雑なQt GUIウィンドウのサイズを非常に速く無視できるほど小さなアーティファクトが現れる場合でも、QtなどのフレームワークがウィンドウレスGUIをスムーズにレンダリングするのは難しいです。私が知る限り、QtはGUIレンダリングにopenglを使うことができますが、それは第二の選択肢です。

私はdirectxを使用すると、リアルタイムのサイズ変更がさらに困難になります。一方、openglは問題なくサイズ変更するのがいいと思われますが、GDI +の2D描画機能はすべて失われます。

あなたのいずれかがこのようなことをしたことがある場合は、前に私を案内してください。また、私はカスタムユーザーインターフェイスの設計を考慮する必要があるポインタがある場合は、私にリンクを提供します。

ありがとうございます!

私はいつもWindows Media Player 11のようなインターフェースをデザインしたいと思っていましたが、誰かがC++プログラマーのための真っ直ぐな解決策があると教えてくれますか?(私はいくつかの既存のフレームワークを使うのではなく、サブクラス化、オーナー描画、カスタム描画は何もあなたにそのようなレベルの制御を与えるようには見えないので、私は一般的なコントロールで半透明コントロールを描画する方法を知らないので、この質問には特別な注意が必要です。再度、感謝します。

+0

これはよく知られている問題です:http://stackoverflow.com/questions/9786218/drawing-in-window-while-resizing-leaves-unpainted-border –

+0

私はこの痛みを自分自身で経験しました。フルアルファサポートと可変クリックスルー。私はスムーズなリサイズ作業をすることはできませんでした(プロキシイベントのような他の小さな問題をすべて解決するには時間がかかりました)。私はあなたがまともな解決策を見つけるかどうかを知ることに興味があります。 – Basic

+0

しかし、スムーズなサイズ変更を行うqtなどの他のフレームワークはどうですか?私が正しく覚えていれば、gtkはウィンドウレスなネイティブのカスタム描画コントロールも使用しています。私は解決策が存在すると信じていますが、その件についてはオンラインのリソースが少ないことに驚いています。まともなカスタムGUIを持っていてもそれほど価値はないという意見はほとんどありません。 – smit

答えて

5

WM_ERASEBKGNDメッセージの原因になりますか?あなたはGUIからの高速応答が必要な場合、私はGDI +に対する助言、またGDI+ double buffering in C++

は、この質問を参照してください。

+0

ええ、私はそれを世話しました。 – smit

関連する問題