質問: ### C# PictureBox子要素のOnPaintBackgroundについて 現在C#でドロー系ソフトを作成しています。 開発環境:Win10 visualsturio2012 WindowsForm .net3.5 です。 アプリの概要はピクチャボックス内に、図形要素やテキスト要素をもつコントロールを配置していく感じです。追加するコントロール自体はPictureBoxを継承しています。 ↓ ![![アプリ概要](https://teratail.storage.googleapis.com/uploads/contributed_images/4bdc9f654d461b482da8eebcc14cb78a.png)](4d1a3d91d620003cecbd8a0928c6dcd4.png) 現在問題になっているのが、多角形などの要素には透明な背景部分の処理の必要があるため、 以下のサイトを参考にして、OnPaintBackGroundをオーバーライドした関数を使用しています。 ![イメージ説明](https://teratail.storage.googleapis.com/uploads/contributed_images/56471b489bcba9aa37396a616ec8a19d.png) ### 問題としていること 「ピクチャボックスをクリックする」と 追加したコントロール要素すべてで「OnPaintBackground」が呼び出されてしてしまうことです。 実際には200~300程の点数を追加するため、一度のクリックしただけでかなりの数のビットマップを作成することになり、処理が非常に重くなっています。 ### 試したこと 1.クリック時にフラグ立てる。OnPaintBackgroundをオーバーライドして、何もしない ``` protected override void OnPaintBackground(PaintEventArgs pevent) { // ??ピクチャボックスクリックなら何もしない if(flag) return; base.OnPaintBackground(pevent); // 以下背面を描画する処理が続く... } ``` 自分の中ではこれで解決したと思っていたのですが...(泣) 少なくともこの関数が呼び出された以上はbase.OnPaintBackground(pevent)を呼び出さないと、描画が正しくできません。 しかし、baseの方を呼び出してしまうと、結局背後のコントロールを描画する処理が必要になって処理が重くなってしまいます。 もう、どうしたらいいのか..._| ̄|○ ### 聞きたいこと わたしは仕事で殆どc言語しか使ったことがないので、ドローソフトのようなイベントを多用するアプリをつくるのは初めてです。 クリックされても、OnPaintBackgroundを呼び出さないとか、そのような処理はできるのでしょうか...?
回答: 表示更新処理に一部Invalidateを用いていたことが原因でした。 この関数を呼ぶと、自分自身だけでなく、 自分の子要素のコントロール全てで再描画処理が走るようです。 あとImageプロパティを変更すると、内部的にはInvalidateと同様の処理が実行されるようです。 ↓参考サイト https://dobon.net/vb/dotnet/control/refreshupdateinvalidate.html 各当部分を修正するとそれなりに動くようになりました。 ありがとうございました。