none
Panelを継承したクラスの上にButtonを乗せるとデザイナでグリッドが表示されない RRS feed

  • 質問

  • いつもお世話になっております。
    今回、浮き出た感じのPanelを作ろうと思って、
    System.Windows.Forms.Panelを継承したカスタムクラスを作りました(MyPanel : 継承クラス)。

    public
     partial
     class
     MyPanel : System.Windows.Forms.Panel
    {
     public
     MyPanel()
     {
     InitializeComponent();
     }
    
     protected
     override
     void
     OnPaint(PaintEventArgs e)
     {
     base
    .OnPaint(e);
     Graphics g = this
    .CreateGraphics();
     ControlPaint.DrawBorder3D(g, this
    .ClientRectangle, Border3DStyle.Raised, Border3DSide.All);
     }
    }
    

    これをデザイン画面で見たとき、ボタンをおいたときだけ、
    位置決めのグリッドが表示されないという問題がおきています。
    こんな感じです
    http://ahb.me/16xT
    一応ビルドされたものは問題ないのですが、デザインがやりにくいなあと思っています。
    何か情報のある方はいらっしゃいますでしょうか。

    追記:
    VS2008 Proでやっています。
    • 編集済み mars12 2010年12月9日 4:51 コードが崩れまくったので
    2010年12月9日 4:14

回答

  • 描画対象とする Graphics は、CreateGraphics したものではなく e.Graphics を利用してください。
    私のところではそれで直りました。

    原因の説明はできないのですが、OnPaint の中で CreateGraphics して描画すること自体が変なので、おかしな結果になっても不思議じゃないと思います。
    また、今回の現象とは無関係ですが、CreateGraphics で作成したものは Dispose する必要もあります。
    それと、私でしたら、Border3DStyle というプロパティを追加して利用者がスタイルを指定できるようにするかもです(その場合は既存の BorderStyle と連携させる必要もありますけど)。

    • 回答としてマーク mars12 2010年12月9日 5:59
    2010年12月9日 5:34
  • MyPanel に DesignerAttribute をつけて、DrawGrid プロパティを true にすればよいかな? と思ったのですが、ちょっと違うようですね。

    ボタンを置くと~という話から、クラシック API の描画とクリッピングの関係で、MyPanel がグリッドの上から灰色を描画しちゃってるんじゃないかな?と予想されるので ControlPaint.DrawBorder() をなくしてみると、グリッドが表示されるのでは? と思いました。

    ps. よくみると描画先がおかしいですね。CreateGraphics() を呼ばないで、e.Graphics に描画してください。

    • 回答としてマーク mars12 2010年12月9日 5:59
    2010年12月9日 5:36

すべての返信

  • 描画対象とする Graphics は、CreateGraphics したものではなく e.Graphics を利用してください。
    私のところではそれで直りました。

    原因の説明はできないのですが、OnPaint の中で CreateGraphics して描画すること自体が変なので、おかしな結果になっても不思議じゃないと思います。
    また、今回の現象とは無関係ですが、CreateGraphics で作成したものは Dispose する必要もあります。
    それと、私でしたら、Border3DStyle というプロパティを追加して利用者がスタイルを指定できるようにするかもです(その場合は既存の BorderStyle と連携させる必要もありますけど)。

    • 回答としてマーク mars12 2010年12月9日 5:59
    2010年12月9日 5:34
  • MyPanel に DesignerAttribute をつけて、DrawGrid プロパティを true にすればよいかな? と思ったのですが、ちょっと違うようですね。

    ボタンを置くと~という話から、クラシック API の描画とクリッピングの関係で、MyPanel がグリッドの上から灰色を描画しちゃってるんじゃないかな?と予想されるので ControlPaint.DrawBorder() をなくしてみると、グリッドが表示されるのでは? と思いました。

    ps. よくみると描画先がおかしいですね。CreateGraphics() を呼ばないで、e.Graphics に描画してください。

    • 回答としてマーク mars12 2010年12月9日 5:59
    2010年12月9日 5:36
  • みなさまありがとうございました。
    e.Graphicsにしたら直りました。
    参考にしたコードがOnPaintの中じゃないところのコードで、
    全然違いに気がついていませんでした orz
    2010年12月9日 6:03