- - PR -
Formのユーザー描画
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2003-01-10 19:41
AllPaintingInWmPaintはどうしたら有効になるのでしょうか?
下記のコードをLoadイベントで記述しても、バックグラウンドカラーで塗りつぶされてしまいます。 this.SetStyle(ControlStyles.AllPaintingInWmPaint, true); this.SetStyle(ControlStyles.UserPaint, true); |
|
投稿日時: 2003-01-10 20:05
何をしたいのか今ひとつ理解できませんが、もしFormに描画したいのであれば、Control#OnPaintメソッドをオーバーライドして使用するだけです。
「ControlStyles.AllPaintingInWmPaint」はちらつきを抑えるために使用し、「ControlStyles.UserPaint」はSystem.Windows.Forms.ControlPaintクラスを使用して「独自のフォーム」を描画する時に指定するもののはずです。 なお、詳細はヘルプを参照して下さい。 |
|
投稿日時: 2003-01-10 21:08
ヘルプには「ControlStyles.AllPaintingInWmPaintを指定すれば、WM_ERASEBKGND を無視する」とあったので、クライアント領域の描画はシステム側では行わず OnPaint でユーザーが記述するものだと解釈したのですが…
独自で描画すると宣言しているのに、システムがバックグラウンドの描画を行うのは無駄な処理だ…と思ったわけです。 また、ControlStyles.AllPaintingInWmPaint は ControlStyles.UserPaint の指定が必須なので、「ちらつき」と「独自のフォーム」は無関係に思います。 ちらつきはダブルバッファリングですし。 [ メッセージ編集済み 編集者: つと 編集日時 2003-01-10 21:10 ] |
|
投稿日時: 2003-01-10 22:31
> また、ControlStyles.AllPaintingInWmPaint は ControlStyles.UserPaint の指定
> が必須なので、「ちらつき」と「独自のフォーム」は無関係に思います。 > ちらつきはダブルバッファリングですし。 必ずしも無関係ではありません。 ControlPaintクラスで独自のフォーム(コントロール)を描画するには、ControlStyles.UserPaintがtrueになっていないとできないからです。 なお、ヘルプでは「ちらつき」と「ダブル バッファリング」は別物として記載されています。 Controlクラスには、OnPaintメソッド以外に背景を描画するOnPaintBackgroundメソッドがありますので、それをオーバーライドして何もしなければ背景は描画されないと思います。詳細はヘルプを参照して下さい。 |
|
投稿日時: 2003-01-10 23:11
>必ずしも無関係ではありません。
>ControlPaintクラスで独自のフォーム(コントロール)を描画するには、>ControlStyles.UserPaintがtrueになっていないとできないからです。 言葉足らずですみません、「ちらつき」が「独自のフォーム」の場合のみ起こる現象ではないので「無関係」としました。 WM_ERASEBKGND で背景消去、WM_PAINT で描画を行うと、ユーザー描画かどうかにかかわらずちらつきはおきます。 いろいろテストしましたが、やはり ControlStyles.AllPaintingInWmPaint を指定しても OnPaintBackground をオーバーライドしない限り背景描画は起こるようです。 また、ControlStyles.AllPaintingInWmPaint を指定しなくても OnPaintBackground をオーバーライドすれば背景描画はキャンセルできます。 OnPaintBackground を WM_ERASEBKGND で発生させるか、WM_PAINTで発生させるかということなのでしょうか… 結果ですが、ControlStyles.Opaque というものがあり(見落としてました)、これがズバリ私の求めていた動作をしてくれました。 |
1