【C++】独自メニューバーの作り方

この記事は約2分で読めます。

メニューバーを Rebar コントロールに入れたいのと標準のメニューバーだとメニューバーの下に2pxの線が出てしまうのでメニューバーも独自に実装しています。ちょっと調べたところでは、MFC を使うか ATL/WTL の CCommandBarCtrl を使えば、実現できそうなのですが、使えるようにするまで時間がかかるのと、自分の思い通りにできない可能性もあるため、今回も作っちゃいました。

そんでもって今の作ってるやつです。

メニューバーが二つ表示されていますが、上が標準で下がRebarコントロールに載せた独自メニューバーです。標準だと下に2pxの線が表示されています。これが嫌なんですよね。 作り方ですが、全部を自作するのはしんどいのでツールバーを代用して作成しています。テキストだけのボタンを表示してそれっぽく見せています。肝心の実装ですが、これが結構大変です。 

  • 当然メニューをクリックしたらポップアップメニューを表示する
  • ポップアップメニューを表示しながら別メニューをマウスで選択したら開きながら切り替える
  • ポップアップメニューを表示してたらキーボードの左右でもメニュー選択する。このとき開いたメニューで一番最初に有効なメニューを選択する
  • ESCキーでポップアップメニューを閉じる

などなど。ちょっと調べただけでも色々ありました。これだけでも大変ですが、なんとかできてきました。

ツールバーで代用しているのでクリックすると少し、メニューの表示位置がズレます。あまり気になりませんが、これはオーナードローしたら解消できるんじゃないかなぁって考えています。

Rebarコントロールの影響を受けているのではなく、ツールバーを使って実装しているからですね。残像を無くすこともできそうです。

一番気になるのはメニューを選択したら表示されるポップアップメニューですね。最終的にはダークモードに対応させたいので、ポップアップメニューも自作しようと考えています。

ポップアップメニューの実装も大変でしょうね。ディスプレイの下の方で表示した場合、表示領域が足らなければ表示位置を計算してちゃんと表示するようにとか実装しないといけないですからね。 

今やっちゃうかは悩ましいところです。ここで気付いたんですが、Rebar に載せるとメニューの切り替えで残像出ませんかね?標準の場合は出ないので Rebar の影響を受けていそうです。Rebarを使っていると思われるエディタも同様の挙動をしていました。これも私はあまり気になりませんね。

コメント

タイトルとURLをコピーしました