2011-08-11 5 views
1

私のUserControlsの1つが不思議なPaintイベントの発動を停止した問題を追跡しました。BorderStyle = Noneのとき、私のWinForms UserControlがペイントイベントを停止するのはなぜですか?

BorderStyleが誤って[なし]に設定されていたことが判明しました。 FixedSingleに戻すと、Paintイベントが再開しました。

これは私の外に驚いた - これはどうして起こっているのか?

編集 ユーザーコントロールは、サードパーティ製のコントロール(ASE ChartDirector)に基づいて、我々はそれで別の問題を抱えていましたさ。 BackColorが透明に設定されていると、ペイントイベントが連続的に表示されます。!その場合の回避策は、BackColorをControlLightLightに設定することでした。 (see this question for more details)

また、BorderStyleの問題の手がかりになりますか?

+0

これは変です。私はBorderStyleを使用します。ほとんどの私のユーザーコントロールとそれらのペイントイベントはまだ起動しません。 –

+2

この問題を再現するポストコード。 –

+0

@ハンス - 私は試してみるが、それは難しいかもしれない - 私の編集をご覧ください。 –

答えて

0

非常に良いブログpostは、その理由を非常に詳しく議論しています。

更新:この記事はWPF用ですが、WPFとWindowsフォームの両方でHWND、WParam、LParamに触れています。

ここで私は、ペイントイベントが処理されない可能性がある理由を以下に示します(下のテキストは記事に表示されているとおりです)。

オペレーティングシステムは、マウスの動きに非常に迅速に応答する必要があります。 Windowsは、マウスハードウェアからの信号を処理するために、 カーネルで実行されている専用Raw入力スレッド(RIT)を使用します。 RIT は、HWND階層をすばやくスキャンし、マウスが であるウィンドウを確認します。システムが応答する必要があるため、 が呼び出されるアプリケーションコードはありません。通常のウィンドウの場合、RITはマウスの位置 をウィンドウの矩形(または領域が設定されている場合)と照合します。しかし、 レイヤードウィンドウの場合、RITはビットマップ内でウィンドウの内容を指定し、 ロケーション(有効不透明度設定、 カラーキー設定、ピクセルアルファチャンネル)。ピクセルが 100%透過である場合、RITはウィンドウをスキップして見続けます。 ウィンドウが見つかると、 がウィンドウを所有しているスレッドにマウス移動フラグが設定されます。これにより、次回GetMessage()を呼び出すときにスレッドがWM_MOUSEMOVEメッセージ を受信し、他の優先度の高いメッセージ が存在しなくなります。

これは特にマウスのハードウェア信号からのメッセージですが、他のイベントでも同様のことが起こる可能性があります。ここで

は私が何をするのかで、Formクラス内

は、次のコードを持って処理されるメッセージを監視するために実行されます。

protected override void WndProc(ref Message m) 
    { 
     Trace.WriteLine(m.Msg + ":" + m); 
     base.WndProc(ref m); 
    } 

私は検索しましたが、詳細は知りませんでした。

+0

オペレータがタグ付けしたWinForms – LarsTech

+1

Windowsでは、「レイヤードウィンドウ」と呼ばれる機能を使用して、HWNDレベルで透過性をサポートしています。 –

+2

実際に、リンク先の段落をポイントして、「ここ!あなたのUserControlがボーダレスなときに再描画しないのはなぜですか?レイヤーはトップレベルウィンドウでのみサポートされています。フォーム。 –

関連する問題