none
toolstripのcomboboxのリサイズについて RRS feed

  • 質問

  • はじめまして。koma31と申します。

    toolstripに配置したcomboboxのリサイズについてです。

    現在、フォームのtoolstrip上にIEのアドレス入力欄のような形でcomboboxを配置しています。

    フォームの大きさを変えた場合に、comboboxの横幅も変えたいので、toolstripのリサイズイベントで以下のような処理をしています。

            private void toolStrip1_Resize(object sender, EventArgs e)
            {
                ComboBox.Width = toolStrip1.Width - 200;
            }

    これで、うまく動作すると期待していたのですが、フォームの最大化ボタンを押してから、フォームの元に戻す(縮小)ボタンを押すと、comboboxが描画されずにこまっています。その他のフォームの大きさ変更では、すべて思ったようにcomboboxの大きさが変更されて描画されます。

    このときの画面上の表示は、combboxがフォームの大きさを超えているかのように、下向きの▼印のようなボタンが表示され、それをクリックすると、フォーム内に収まる形式で描画されます。またcomboboxのwidthはフォームサイズ内に収まる数値になっていることを確認しています。

    最大化ボタンで、comboboxの大きさを元のフォームの横幅を超えた値になったあと、元に戻すとこのような現象が起こるようです。

    どのようにしたら、フォームの最大化ボタン→元に戻すボタンで、いったん元のフォームの横幅を超えたcombboxを正しく表示できるようになるでしょうか?

    プログラム技術は未熟ですが、ネットで調べて、wndprocをオーバライドしたり、いろいろやってみましたが、自力ではどうにもならないところまで来ました。

    皆様のお知恵をお聞かせいただきたくお願いいたします。

    2006年10月12日 0:09

すべての返信

  • たぶん、配置というのが座標を調整しているかControls.Addしているんじゃないかと思うんですが
    ToolStripControlHostを使ってみてはどうでしょうか?
    http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.toolstripcontrolhost.aspx
    不要な小細工が減るはずです。
    2006年10月12日 0:44
  • ご回答ありがとうございます。私の書き方が悪かったのですが、配置という表現が適切でありませんでした。

    ToolStripComboBoxクラスを利用しています。ですから、何も小細工はしないで、ツールバーにコンボボックスを表示する事はできました。ただし、フォームをリサイズしたときに、他のコントロールにあるようなアンカーがないので、toolstripのリサイズイベントでcomboboxの幅を変更するようにプログラムしました。それは前回紹介したような簡単なものです。

    マウスでフォームの枠をクリックしてフォームの大きさを変更するときは、うまくいくのですが、最大化ボタンクリック、元に戻す(縮小)ボタンクリックしたときだけ、コンボボックスが表示されなくなります。

    元に戻す(縮小)ボタンを押したときは、リサイズイベントが発生しないのかと疑ってデバッガで調べてみたのですが、クリックした後リサイズイベントは呼び出されていました。

    http://msdn2.microsoft.com/ja-jp/library/system.windows.forms.toolstripcombobox.aspx

    にある説明には、

      ToolStrip で適切にレンダリングされる ToolStripComboBox を表します。

    とあるのですが、どうやってもフォームの最大化、元に戻すでcomboboxの横幅を変更した場合に限り、正常に表示されずに困っております。

    良い解決方法があればご助言をお願いいたします。

     

    2006年10月12日 4:48
  • 再現しました。

    次のいずれかで回避できるようです。

    ・ToolStrip.CanOverflow = False
    ・ToolStripComboBox.Overflow = Never

    2006年10月12日 5:27
  •  まどか さんからの引用

    次のいずれかで回避できるようです。

    ・ToolStrip.CanOverflow = False
    ・ToolStripComboBox.Overflow = Never

    結局、イベントがサイズ変更「後」であるため、通知を受け取った時点でToolStrip内の処理が終わっている、
    つまり、Overflow状態になっているということだと思います。

    この回避策が仕様上おこないたくないとなれば
    変更後のサイズ決定 → ToolStrip内の処理 の間に処理できればよいと思うので
    WM_SIZINGを拾えばよいのかなと。。。

    2006年10月12日 5:37
  • まどかさん、ありがとうございました。

    ご呈示いただいた方法で期待通りの結果を得ることが出来ました。

    貴重なお時間を割いていただき、ご回答いただきましたことに御礼申し上げます。

    分かってみれば簡単なことでしたが、当方、昨日半日考えて全く解決しませんでした。

    相談させていただいて本当によかったです。

    ありがとうございました。

    2006年10月12日 11:45