MFC CScrollBarを垂直でCreateすると古い見た目で表示される

uncle_Kei 40 評価のポイント
2025-03-14T07:42:42.74+00:00

MFCのCScrollBarクラスを水平(=WS_HSCROLL)でCreate()すると、Windows11で標準形状と思われるスクロールバーが表示されます。これは期待通りです。

ところが、垂直(=WS_VSCROLL)でCreate()すると、かなりオールドファッションなスクロールバーが表示されてしまいます。縦横の形状が異なるのでは使えません。

ためしに、CWnd::ShowScrollBar()でやってみると、水平垂直ともオールドファッションでした。これも困ります。

一方、CreateWindowEx( L"SCROLLBAR"…)では水平垂直ともWindows11の標準形状で作成できます。

質問としては、
(1) CScrollBarを垂直でCreateし、かつWindows11形状とする方法はありますか?。

(2) CWnd::ShowScrollBar()でWindows11形状で表示する方法はありますか?。

◇Windows11で標準形状とは、マウスがホバーするとバーが少し太くなるタイプのことを指します。

以上、この件について情報をお持ちの方、どうぞよろしくお願いします。

開発者テクノロジ | C++
0 件のコメント コメントはありません
{count} 件の投票

承認済みの回答
  1. gekka 12,291 評価のポイント MVP ボランティア モデレーター
    2025-03-14T10:06:19.2233333+00:00

    WS_HSCROLLやWS_VSCROLLは対象となるウィンドウにスクロールバーを追加するように指定するスタイルです。
    たとえばEditコントロールにスクロールバーを追加させるなどです。(スクロールバーのコントロールが追加されるのではなく描画として)

    しかしスクロールバーにスクロールバーが追加されることは想定されていないので、古いスタイルのスクロールバーが追加で表示されているのでしょう。
    スクロールバー以外でShowScrollBar(SB_BOTH)をするのならばWindows11スタイルのスクロールバーが表示されるはずです。

    CSCrollBarのCreateに指定したら、スクロールバーに対してスクロールバーを追加で描画してしてくださいと指定していることになります。

    ただしくは、CScrollBarを作成する時に指定するのはWS_HSCROLLやWS_VSCROLLではなく、SBS_HORZまたはSBS_VERTです。

    RECT rectH{ 0,0,200,100 };
    RECT rectV{ 0,0,200,100 };
    
    rectH.right -= GetSystemMetrics(SM_CXVSCROLL);
    rectV.bottom -= GetSystemMetrics(SM_CYHSCROLL);
    
    CScrollBar* pScrolBarH = new CScrollBar();
    if (pScrolBarH->Create(WS_VISIBLE | WS_CHILD | SBS_HORZ | SBS_BOTTOMALIGN , rectH, this, 1))
    {
    	pScrolBarH->SetScrollRange(0, 100, TRUE);
    	pScrolBarH->SetScrollPos(50, TRUE);
    }
    
    CScrollBar* pScrolBarV = new CScrollBar();
    if (pScrolBarV->Create(WS_VISIBLE | WS_CHILD | SBS_VERT | SBS_RIGHTALIGN , rectV, this, 2))
    {
    	pScrolBarV->SetScrollRange(0, 100, TRUE);
    	pScrolBarV->SetScrollPos(50, TRUE);
    }
    
    //これは間違い(これをやると新しいスタイルの水平スクロールバーの横に、追加の古いスタイルの垂直スクロールバーが表示されることになる)
    //CScrollBar* pScrolBarV = new CScrollBar();
    //if (pScrolBarV->Create(WS_VISIBLE | WS_CHILD | WS_VSCROLL, rectV, this, 2))
    //{
    //	pScrolBarV->SetScrollRange(0, 100, TRUE);
    //	pScrolBarV->SetScrollPos(50, TRUE);
    //}
    
    1 人がこの回答が役に立ったと思いました。

0 件の追加の回答

並べ替え方法: 最も役に立つ

お客様の回答

回答は、質問作成者が [承諾された回答] としてマークできます。これは、ユーザーが回答が作成者の問題を解決したことを知るのに役立ちます。