質問

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を質問に含める必要があります!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top