WindowsフォームのUserControlオーバーライドが呼び出されない
-
02-07-2019 - |
質問
WPFアプリに埋め込むために、UserControlから派生したWindowsフォームコントロールを作成しています。通常、このリンクに記載されている手順に従いました。
public ref class CTiledImgViewControl : public UserControl
{
...
virtual void OnPaint( PaintEventArgs^ e ) override;
...
};
そして私のCPPファイル:
void CTiledImgViewControl::OnPaint( PaintEventArgs^ e )
{
UserControl::OnPaint(e);
// do something interesting...
}
すべてがコンパイルおよび実行されますが、OnPaintメソッドは呼び出されません。
探すべきもののアイデアはありますか?私はC ++で多くのことをしましたが、WinFormsとWPFにはかなり新しいので、明らかなことになるでしょう...
解決
SetStyle
メソッドを使用して構築するときに適切なスタイルを設定しない限り、 OnPaint
は通常 UserControl
で呼び出されません。 OnPaint
が呼び出されるようにするには、 UserPaint
スタイルをtrueに設定する必要があります。
SetStyle(ControlStyles::UserPaint, true);
更新
最近、この問題に自分で遭遇し、答えを探しに行きました。ペイント中にいくつかの計算を実行したかったので(ペイントメッセージの独自の処理を活用するため)、常に OnPaint
の呼び出しを取得していませんでした。
Reflectorを掘り下げた後、対応する WM_PAINT
メッセージのクリッピング四角形が空でない場合にのみ OnPaint
が呼び出されることを発見しました。 UserControl
インスタンスには、クライアント領域全体を埋める子コントロールが含まれていたため、すべてがクリップされました。これは、クリッピング四角形が空であったため、 OnPaint
が呼び出されなかったことを意味します。
この問題を回避するには、 WndProc
をオーバーライドし、 WM_PAINT
のハンドラーを直接追加しました。これは、目的を達成する別の方法が見つからなかったためです。
他のヒント
誰かが興味を持っている場合に備えて、問題を解決しました。これは、WinFormsコントロールがViewBoxに埋め込まれていたためです。グリッドに変更し、すぐにペイントイベントを取得し始めました。 WPFについて質問するときは、常にXAMLを質問に含める必要があります!