【C++/Win32】2pxの白線を消すためにメニューバーも自作する

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

訳あってメニューバーを実装しています。エディタ部分は大体できたんで、複数のドキュメントを編集可能にしようとしてタブをしました。 

そうするとなんと言うか見た目がめちゃくちゃ気になりました。最初は後で修正しようと思っていたんですが、これが毎日見ていると日に日になんとかなれへんのかってことになり、どうにかいい感じにしようとしています。

 最初できたバージョン1はこれ。昔ながらの白×グレーです。若干目が痛いのですが、この見た目の嫌な点はメニューバーとツールバーの間にある2pxのグレー線です。

ちなみにこの線、メモ帳にも存在します。

そんでもって、メモ帳のウィンドウスタイルはこちら。残念ながらウィンドウスタイルを弄ってもこの線は消せませんでした。

多分使う分には何も気にならないのですが、作るとなると何故かめっちゃ気になってこの線を消そうとしました。はい。消せませんでした。どー頑張っても消せないんですよね。ウィンドウのスタイルを設定すると今度はちょっと濃いグレー線になったりしました…。どうもメニューバーにもれなくついてくるようです。


諦めるかメニューバーを自作するかどうかでしばらく悩んでいました。ほんとなら諦めるのが正しい選択なんでしょうけど、もーいいや自作しようって感じで今作っています。


で、これがバージョン2です。メニューバーとツールバーの間にあった2pxのグレー線は消えました。今は、メニューの上にマウスカーソルがのったら色変えたり、クリックしたらポップアップメニューを表示などを実装しています。

現時点では表示されるメニュー内容はおかしいですが。

さすがに実装は大変ですね。今までコントロール側で制御してくれてた処理をいちいち実装しないといけないですからね…。


メニューが開いている間に違うメニューの上にマウスカーソルを持っていったら、別メニューを開きながら表示したり、左右のキーを押したら同じように表示メニューを切り替えたりなどなど。


そんで、次に気になってるのが表示されるメニューの背景色です。こいつも色変更したいんですよね。ってことで多分自作しちゃうんじゃないかと思います。はい。ただ、自作しなくても↓こんな感じで2pxを白で塗ってもいいかもしれませんね。

case WM_NCPAINT:
case WM_NCACTIVATE:
    {
        LRESULT result = DefWindowProc(hWnd, message, wParam, lParam);

        POINT point = { 0 };
        POINT screenPoint = { 0 };
        RECT windowRect = { 0 };

        HDC hDC = GetWindowDC(hWnd);

        ::ClientToScreen(hWnd, &screenPoint);
        ::GetWindowRect(hWnd, &windowRect);

        point.x = windowRect.right - windowRect.left;
        point.y = screenPoint.y - windowRect.top;

        HBRUSH br = CreateSolidBrush(RGB(255, 255, 255));
        RECT rect = { 0,point.y - 2,windowRect.right,point.y + 2 };

        FillRect(hDC, &rect, br);
        DeleteObject(br);
        ReleaseDC(hWnd, hDC);

       return message == WM_NCPAINT ? 0 : result;
    }

コメント

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