none
[MFC] Windows8のタイトルバーは必ず真ん中寄せになってしまうのですが、左寄せや右寄せも可能でしょうか RRS feed

  • 質問

  • MFCで以下のようにしてみるとWindows7の場合はタイトルバーの文字列を右寄せにできます。
    Windows8でも右詰めや左詰めができそうなものですが、効果がありません。

    # Windows8では左寄せにできないのでしょうか?

    void Tview::OnInitialUpdate()
    {
        CScrollView::OnInitialUpdate();

        CWnd *w = GetParentFrame();
    //  w->ModifyStyleEx(0, WS_EX_LEFT, 0);
        w->ModifyStyleEx(0, WS_EX_RIGHT, 0);
        w->SetWindowText("TEXT ON TITLEBAR");
    }



    • 編集済み nazox 2014年5月19日 8:42
    2014年5月19日 8:39

回答

  • 非クライアント領域(タイトルバーなど)は OS 任せです。
    スタイルを変えるといった程度の実装では変更できません。

    基本的に OS が制御し、そのバージョンの Windows の中で一貫性のある表示が好まれると思います。
    たとえば、あなたの作成したアプリケーションが左寄せにできたからといって、ほかのアプリケーションは中央寄せのままです。
    その中で左寄せのアプリケーションがあると、ユーザーの違和感は大きいでしょう。
    また、将来の Windows でまたデザインが変わった際、あなたの作成したアプリケーションがさらに浮いて見えるようになるリスクもあります。
    故に、この手のカスタマイズは避けた方がよいと思います。

    さて、どうしてもそういったことがやりたいのであれば、非クライアント領域を完全に自分で描くなどの大変な作業が必要になってくるかと予想されますし、また前述のように OS のバージョンによっては非常に汚くなるなどのリスクもあります。
    本当にそこまでコストをかけて実現したいのか、今一度考え直してみてください。

    // 今操作されているスタイルは、あくまでクライアント領域に対して効果があるもののはずです。
    2014年5月19日 13:22
    モデレータ

すべての返信

  • 非クライアント領域(タイトルバーなど)は OS 任せです。
    スタイルを変えるといった程度の実装では変更できません。

    基本的に OS が制御し、そのバージョンの Windows の中で一貫性のある表示が好まれると思います。
    たとえば、あなたの作成したアプリケーションが左寄せにできたからといって、ほかのアプリケーションは中央寄せのままです。
    その中で左寄せのアプリケーションがあると、ユーザーの違和感は大きいでしょう。
    また、将来の Windows でまたデザインが変わった際、あなたの作成したアプリケーションがさらに浮いて見えるようになるリスクもあります。
    故に、この手のカスタマイズは避けた方がよいと思います。

    さて、どうしてもそういったことがやりたいのであれば、非クライアント領域を完全に自分で描くなどの大変な作業が必要になってくるかと予想されますし、また前述のように OS のバージョンによっては非常に汚くなるなどのリスクもあります。
    本当にそこまでコストをかけて実現したいのか、今一度考え直してみてください。

    // 今操作されているスタイルは、あくまでクライアント領域に対して効果があるもののはずです。
    2014年5月19日 13:22
    モデレータ
  • さて、どうしてもそういったことがやりたいのであれば、非クライアント領域を完全に自分で描くなどの大変な作業が必要になってくるかと予想されますし、また前述のように OS のバージョンによっては非常に汚くなるなどのリスクもあります。
    本当にそこまでコストをかけて実現したいのか、今一度考え直してみてください。

    補足で、リスクは描画だけにとどまりません。

    Office 2007からリボンが導入されました。リボンはタイトルバーにも表示が加わるため非クライアント領域を自前で描画していると思われます。ところでWindows Vista(7でしたっけ?)でアプリケーションを最大化したままタイトルバーをドラッグして別ディスプレーに移動する操作が追加されました。Office 2007はこの機能を自前で実装していないため移動できません。(2010から移動に対応しました。)

    このようにタイトルバーに関わる操作はOSが自由に機能追加する可能性があり、もし自前で実装する場合、その全てを追従しないと非常に操作しづらいものになります。

    # ところでVisual Studioもタイトルバーは自前で描画していて、OSに依らずタイトルは左寄せですねぇ…。

    • 回答の候補に設定 星 睦美 2014年5月23日 6:42
    2014年5月19日 21:59
  • 現行MFCにおいて、ノンクライアント(NC)領域の描画設定は、
    ビジュアルマネージャで制御することが可能です。
    CMFCVisualManagerについて調べてみてください。
    このクラスを継承することによって、NCをある程度カスタマイズ可能です。
    残念ながら、詳しく説明できるほど詳しくありませんし、
    簡便な仕組みでもありません。
    • 回答の候補に設定 星 睦美 2014年5月23日 6:42
    2014年5月20日 1:30
  • ご返信ありがとうございます。

    左寄せのほうが好きなのは確かです:-)   ** スタートメニューなくてもいいから左寄せ希望 **

    どうもテスト用に設定してみた WS_EX_RIGHTはヘブライ語だかアラビア語だか用のようですから、これをつかって左寄せにしようというのはおそらく邪道なのでしょう。WS_EX_CENTERというのもないわけですし。

    実際やろうとしていたのはトップレベルではなくMDIの子ウインドウをトの時にタイリングしたときの子ウインドウのタイトルバーです。ウインドウサイズによって位置が動かない左寄せの方が視点がぶれないし、あまり目立たないステータスバーよりも上側にあるのが望ましいし、、、、とかいう理由でタイトルバーを子のステータスバーのようにつかっているわけですが、確かに本来の使い方ではありませんね。


    Windows8は開発環境ではなく動作確認用ですので8での動作をみていないのですが、Visual StudioはいまはWPFのようですし、また別のポリシーでもあるんですかねえ?


    • 編集済み nazox 2014年5月20日 1:32
    2014年5月20日 1:31
  • CMFCVisualManagerは初めて知りました。

    確かに簡便な仕組みというわけでもなさそうですし、そのものずばりでもなさそうですけど

    http://msdn.microsoft.com/ja-jp/library/cc137831.aspx

    をみると、デフォルトのビジュアルマネージャをかえるだけでもXPスタイルとかOffice2003スタイルとかもできているようですし、もしかしたら変更できるのかもしれません。

    上記URIはVs2013ですしWindows8上での実行結果なのでしょうか? 動作環境は不明ですが、あまり突飛な見た目にならないようでしたら、これもありかもしれません。試してみる価値ありそうです。

    また連想したのがマニフェストファイルによる見た目の変更ですが、さすがにこれはCOMCTRLのバージョン指定ぐらいしかできなさそうなのでマニフェストでは無理ですよね。



    • 編集済み nazox 2014年5月20日 3:32
    2014年5月20日 3:31
  • 今更ですが、ちょうど VS2013 Upd2 を確認していて気になったので少し返信を・・・。

    上記URIはVs2013ですしWindows8上での実行結果なのでしょうか? 動作環境は不明ですが、あまり突飛な見た目にならないようでしたら、これもありかもしれません。試してみる価値ありそうです。

    リンク先のイメージは XP に見えますが、確認してみても「XP 上のイメージ」のようで Win7 や Win8 上では微妙に NC 領域の描画は違いました。

    Office 2007 スタイルで中央寄せタイトルに変わるのは XP だけで、この辺りが違うのは XP と Vista 以降 OS のテーマ処理が違うせいかな?と個人的に推測してますがどうなのでしょうかね・・・。

    MDI 子ウィンドウなら扱いが違いそうな気もするのでタイトルバーも以前と同様の描画になっている可能性もあるような気がしますが、残念ながらこちらでは MDI アプリらしいものを Win8 上で確認できてないので、一度確認してみた方が良いのではないでしょうか?

    ※昔作成した CMFCVisualManager を使っている MDI アプリは、困った事に作りが悪くて動作させるのが無茶でした・・・。

    後、

    また連想したのがマニフェストファイルによる見た目の変更ですが、さすがにこれはCOMCTRLのバージョン指定ぐらいしかできなさそうなのでマニフェストでは無理ですよね。

    連想したのはわかりますがマニフェスト項目で OS テーマ を限定させるのは無かったと思うし無理だと思いますよ・・・。

    • 回答の候補に設定 星 睦美 2014年5月23日 6:42
    2014年5月21日 3:23
  • ビジュアルマネージャによる調整は脇道にそれてしまうような気もしますので今回は使わないことにしました。

    いろいろ試してみましたが、最初に頂いたアドバイスにもあるようになるべく素直につかうようにします。

    MDI子ウインドウのタイトルバーを使うのも素直であるとは依然思うのですが、今回は別の対処方法を考えてみます。

    皆様アドバイスありがとうございました。

    2014年5月27日 7:24