- PR -

Formのユーザー描画

1
投稿者投稿内容
つと
会議室デビュー日: 2003/01/10
投稿数: 10
投稿日時: 2003-01-10 19:41
AllPaintingInWmPaintはどうしたら有効になるのでしょうか?
下記のコードをLoadイベントで記述しても、バックグラウンドカラーで塗りつぶされてしまいます。

this.SetStyle(ControlStyles.AllPaintingInWmPaint, true);
this.SetStyle(ControlStyles.UserPaint, true);

二天
ベテラン
会議室デビュー日: 2001/09/26
投稿数: 60
投稿日時: 2003-01-10 20:05
何をしたいのか今ひとつ理解できませんが、もしFormに描画したいのであれば、Control#OnPaintメソッドをオーバーライドして使用するだけです。

「ControlStyles.AllPaintingInWmPaint」はちらつきを抑えるために使用し、「ControlStyles.UserPaint」はSystem.Windows.Forms.ControlPaintクラスを使用して「独自のフォーム」を描画する時に指定するもののはずです。
なお、詳細はヘルプを参照して下さい。
つと
会議室デビュー日: 2003/01/10
投稿数: 10
投稿日時: 2003-01-10 21:08
ヘルプには「ControlStyles.AllPaintingInWmPaintを指定すれば、WM_ERASEBKGND を無視する」とあったので、クライアント領域の描画はシステム側では行わず OnPaint でユーザーが記述するものだと解釈したのですが…
独自で描画すると宣言しているのに、システムがバックグラウンドの描画を行うのは無駄な処理だ…と思ったわけです。
また、ControlStyles.AllPaintingInWmPaint は ControlStyles.UserPaint の指定が必須なので、「ちらつき」と「独自のフォーム」は無関係に思います。
ちらつきはダブルバッファリングですし。

[ メッセージ編集済み 編集者: つと 編集日時 2003-01-10 21:10 ]
二天
ベテラン
会議室デビュー日: 2001/09/26
投稿数: 60
投稿日時: 2003-01-10 22:31
> また、ControlStyles.AllPaintingInWmPaint は ControlStyles.UserPaint の指定
> が必須なので、「ちらつき」と「独自のフォーム」は無関係に思います。
> ちらつきはダブルバッファリングですし。

必ずしも無関係ではありません。
ControlPaintクラスで独自のフォーム(コントロール)を描画するには、ControlStyles.UserPaintがtrueになっていないとできないからです。

なお、ヘルプでは「ちらつき」と「ダブル バッファリング」は別物として記載されています。

Controlクラスには、OnPaintメソッド以外に背景を描画するOnPaintBackgroundメソッドがありますので、それをオーバーライドして何もしなければ背景は描画されないと思います。詳細はヘルプを参照して下さい。
つと
会議室デビュー日: 2003/01/10
投稿数: 10
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)