none
C++/WinRTでタイトルバーに文字列を表示する方法を教えてください RRS feed

  • 質問

  • いつもお世話になります。質問ばかりで恐縮です。

    C++/WinRTで、通常タイトルバーにはプロジェクト名が表示されますが、これを任意の文字列に変更したいのですが、その方法がわかりません。

    下記サイトを参考にしていろいろやってみているのですが、うまくいきません。

    1.参考にしたWebサイト

    (1)https://learn.microsoft.com/ja-JP/windows/windows-app-sdk/api/winrt/microsoft.ui.windowing.appwindowtitlebar.iscustomizationsupported?view=windows-app-sdk-1.1

    (2) https://learn.microsoft.com/en-us/windows/apps/develop/title-bar?tabs=wasdk

    2.当方でやってみたこと

    1項のサイトに記載されているWindows App SDKをインストールすると、インストール前までは正常にビルドされていたプログラムがビルドエラーになります。

    (1)ビルドエラーの内容は次の通りです。

    1>D:\WinRT\Windows11\densiunRT\densiunRT\MainPage.xaml(38,56): XamlCompiler error WMC0055: Cannot assign text value '200,40,0,0' into property 'Margin' of type 'Thickness'

    (2)ビルドエラーとなる部分のXAMLプログラムは次の通りです。

     <canvas:CanvasControl x:Name="canvas1"  HorizontalAlignment="Left" VerticalAlignment="top"

    Height="420" Width="510" Margin="200,40,0,0"  ClearColor="White" Loaded="canvas1_Loaded" Draw="canvas1_Draw" />

    Windows App SDK」をインストールしなければ、このコードで正常にビルドされます。

    3.当方の環境は、Windows 11Visual Studio Community 2022です。

    以上、よろしくお願いします。


    • 編集済み fghck856 2022年9月24日 17:23 XAMLコードの表示を修正
    2022年9月24日 17:19

回答

  • ApplicationView.Title プロパティ

    上記ページ内の、「ApplicationView.Title プロパティ」というタイトルの上にC#やVBやらといった言語を切り替えるドロップダウンがあるので、それでC++/WinRTに切り替えてみてください。

    Titleプロパティの定義が、取得用と設定用の2つのメソッドで構成されていることが分かります。

    • 回答としてマーク fghck856 2022年9月28日 16:53
    2022年9月25日 23:06
  • そういうことをやりたいならタイトルバー自体のカスタマイズが必要なようですね。

    [UWP] How to change the text of the Application Title bar?

    • 回答としてマーク fghck856 2022年9月28日 16:54
    2022年9月26日 5:53
  • includeが不足してます。

    GetCurrentView()のところで右クリックして「定義をここに表示」か「定義へ移動」して、その定義がどのnamespaceに所属しているか調べます。

    WINRT_EXPORT namespace winrt::Windows::ApplicationModel::Core

    になってるはずなので、XAMLのジェネレータで自動的に作られるヘッダのファイルパスに変換すると

    #include "winrt/Windows.ApplicationModel.Core.h"

    になるので、pch.h か App.h のようなヘッダファイルに追加すればいいです。

    あと、TitleBarはメンバフィールドではなくメンバ関数なので()つけてやらないとエラーです。

    auto currentView = winrt::Windows::ApplicationModel::Core::CoreApplication::GetCurrentView();
    auto coreTitleBar = currentView.TitleBar();

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク fghck856 2022年9月28日 16:54
    2022年9月27日 9:48
  • fghck856さん、こんにちは。フォーラムオペレーターのSakiです。
    ご協力いただきましてありがとうございます。

    「このリンク」について、説明不足で申し訳ございません。
    ハイパーリンクが設定されましたので、リンクをクリックしてウェブサイトへジャンプするはずです。

    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Saki ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。

    • 回答としてマーク fghck856 2022年9月29日 4:24
    2022年9月29日 1:16
    モデレータ

すべての返信

  • Windows App SDKでもUWPアプリは作れるらしいですが、生のUWPからはいくらか設計が変わるんじゃないでしょうか。

    生のUWPの場合、以下のような方法をとるようです。

    https://stackoverflow.com/questions/43414593/how-to-change-the-app-title-in-a-uwp-app

    (静的に)アプリの名前を変更する方法と、動的にタイトルテキストを直接設定する方法の両方が提示されています(コードはC#ですが、読み替えは難しくないと思います)。

    2022年9月24日 22:31
  • 返信ありがとうございます。また、私の返事が大変遅くなり、申し訳ありません。

    ご教示いただいたサイトの方法で、プログラムしてみますので、しばらく時間をください。

    2022年9月25日 13:49
  • Windows App SDKをアンインストールし、ご教示いただいたサイトを参考に、次の2つのコードで試してみました。

    コード1.

        auto appTitle = ApplicationView::GetForCurrentView().Title();
        appTitle = L"Title Test";

    コード2.

        auto appView = Windows::UI::ViewManagement::ApplicationView::GetForCurrentView();
        appView.Title() = L"Your title...";

    いずれも、ビルドは正常終了しますが、タイトルバーの文字が変わりません。


    • 編集済み fghck856 2022年9月25日 14:38 見やすくしました
    2022年9月25日 14:37
  • ApplicationView.Title プロパティ

    上記ページ内の、「ApplicationView.Title プロパティ」というタイトルの上にC#やVBやらといった言語を切り替えるドロップダウンがあるので、それでC++/WinRTに切り替えてみてください。

    Titleプロパティの定義が、取得用と設定用の2つのメソッドで構成されていることが分かります。

    • 回答としてマーク fghck856 2022年9月28日 16:53
    2022年9月25日 23:06
  • ご教示ありがとうございます。下記1項のようにプログラムして、タイトルバーに2項のように表示されました。

    1.コード

        ApplicationView::GetForCurrentView().Title(L"タイトルテスト");

    2.タイトルバーの表示

      タイトルテスト - densiunRT

    コードで指定した文字列に続いて、ハイフン・プロジェクト名がタイトルバーに表示されました。

    できれば、コードで指定した文字列だけを表示したいのですが、これは無理な注文でしょうか。

    2022年9月26日 5:30
  • そういうことをやりたいならタイトルバー自体のカスタマイズが必要なようですね。

    [UWP] How to change the text of the Application Title bar?

    • 回答としてマーク fghck856 2022年9月28日 16:54
    2022年9月26日 5:53
  • ご教示ありがとうございます。

    ご提示いただいたサイトが英文で、英文の量も多く、解読に時間がかかりそうです。

    また、コードの量も多く、XAMLまでいじらないといけないので、新たにテスト用プロジェクトを作成してやってみたいと思います。

    なので、しばらく、いや相当な時間をください。当方がこれをやってみて、何らかの結果が出たら、また報告したいと思います。

    それまでお待ち願います。

    2022年9月26日 6:30
  • ご提示のページを参考に、まずApp.cppに下記のように2行追加してみました。

    void App::OnLaunched(LaunchActivatedEventArgs const& e)

    {

                  ・・・

    // Hide default title bar.

    auto  coreTitleBar  =  CoreApplication::GetCurrentView().TitleBar;

    coreTitleBar.ExtendViewIntoTitleBar(true);  // = true;

    これをビルドすると、次のようなエラーとなります。

    1>D:\WinRT\Windows11\TestProgram\TitleTestRT\TitleTestRT\App.cpp(100,42): error C3779: 'winrt::Windows::ApplicationModel::Core::CoreApplication::GetCurrentView': 'auto' を返す関数を、定義より前に使用することはできません

    1>D:\WinRT\Windows11\TestProgram\TitleTestRT\TitleTestRT\Generated Files\winrt\impl\Windows.ApplicationModel.Core.2.h(32): message : 'winrt::Windows::ApplicationModel::Core::CoreApplication::GetCurrentView' の宣言を確認してください

    1>D:\WinRT\Windows11\TestProgram\TitleTestRT\TitleTestRT\App.cpp(101,17): error C3536: 'coreTitleBar': 初期化前に使用することはできません

    私のプログラムが悪いのでしょうが、このエラーをなくする方法がわかりません。

    2022年9月26日 18:31
  • includeが不足してます。

    GetCurrentView()のところで右クリックして「定義をここに表示」か「定義へ移動」して、その定義がどのnamespaceに所属しているか調べます。

    WINRT_EXPORT namespace winrt::Windows::ApplicationModel::Core

    になってるはずなので、XAMLのジェネレータで自動的に作られるヘッダのファイルパスに変換すると

    #include "winrt/Windows.ApplicationModel.Core.h"

    になるので、pch.h か App.h のようなヘッダファイルに追加すればいいです。

    あと、TitleBarはメンバフィールドではなくメンバ関数なので()つけてやらないとエラーです。

    auto currentView = winrt::Windows::ApplicationModel::Core::CoreApplication::GetCurrentView();
    auto coreTitleBar = currentView.TitleBar();

    個別に明示されていない限りgekkaがフォーラムに投稿したコードにはフォーラム使用条件に基づき「MICROSOFT LIMITED PUBLIC LICENSE」が適用されます。(かなり自由に使ってOK!)

    • 回答としてマーク fghck856 2022年9月28日 16:54
    2022年9月27日 9:48
  • gekka 様

    いつもお世話になります。ご指摘の通り#includeを追加し、プログラムを修正しまして、エラーはなくなりました。

    ありがとうございました。また不明点等出てきましたら、お願いします。

    2022年9月27日 10:35
  • お世話になります。

    現状、下記1項のようにプログラムして、XAMLで指定した文字列「Custom Title Bar」がタイトルバーに表示されるようになりました。

    しかしながら、下記2項のように、少々問題があります。この問題点についてアドバイスいただけるとありがたいです。

    当方、XAMLについては全くの初心者ですので、申し訳ありませんがよろしくお願いします。

    1.現在のプログラム

    (1)App.cpp

    void App::OnLaunched(LaunchActivatedEventArgs const& e)

    {

                  ・・・

                  // Hide default title bar.

              auto currentView =

    winrt::Windows::ApplicationModel::Core::CoreApplication::GetCurrentView();

              auto coreTitleBar = currentView.TitleBar();

              coreTitleBar.ExtendViewIntoTitleBar(true);

    }

    (2)MainPage.xaml

                  これは、Hongliang様より提示いただいたサイトと全く同じです。

        <Grid x:Name="AppTitleBar" Background="Transparent">

            <!-- Width of the padding columns is set in LayoutMetricsChanged handler. -->

            <!-- Using padding columns instead of Margin ensures that the background

             paints the area under the caption control buttons (for transparent buttons). -->

            <TextBlock Text="Custom Title Bar"

                       x:Name="TextAppTitle"

                   Style="{StaticResource CaptionTextBlockStyle}"

                   Margin="12,8,0,0"/>

        </Grid>

    (3)MainPage.cpp

    namespace winrt::TitleTestRT::implementation

    {

        MainPage::MainPage()

        {

            InitializeComponent();

            //--------------------------------------------------ここから追加

            Package package = Package::Current();

            auto appName = package.DisplayName();

            TextAppTitle().Text() = L"{appName}- RandomTextWhichMayChangeRunTime";

            Window::Current().SetTitleBar(AppTitleBar());

            //--------------------------------------------------ここまで追加

        }

    }

    2.問題点

    1項のプログラムで動作させると、タイトルバーの背景色が、タイトルバー以外の部分と同じく白色になってしまいます。

    できれば、タイトルバーの背景色は、標準と同じく薄いグレーにしたいです。

    3.当方でやってみたこと

    下記サイトを参考に、いろいろやってみましたが、XAMLの知識不足のせいもあってか、なかなかうまくいきません。

    (1)https://atmarkit.itmedia.co.jp/fdotnet/dotnettips/973sltbbg/sltbbg.html

    (2)https://www.web-dev-qa-db-ja.com/ja/xaml/%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%83%96%E3%83%AD%E3%83%83%E3%82%AF%E3%81%AE%E8%83%8C%E6%99%AF%E8%89%B2%E3%81%B8%E3%81%AE%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9/1072605158/

    タイトルバーの背景色を設定する方法について、アドバイスをいただきたく、よろしくお願いします。

    2022年9月27日 22:57
  • fghck856さん、こんにちは。フォーラムオペレーターのSakiです。
    MSDNフォーラムにてご投稿くださいましてありがとうございます。

    皆様から寄せられた投稿でお役に立てて何よりです。
    参考になった投稿には【回答としてマーク】をお願い致します。

    設定いただくことで、
    他のユーザーもお役に立つ回答を見つけやすくなります。

    また、タイトルバーの背景色を設定する方法については、
    このリンクのサンプル(cppwinrt)をご参照ください。

    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Saki ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。


    2022年9月28日 2:59
    モデレータ
  • Saki-MSFT 様

    ご回答ありがとうございます。また返信が遅くなり申し訳ありません。ご指摘の「回答としてマーク」をつけさせていただきました。

    ただ、「このリンクのサンプル(cppwinrt)をご参照ください。」とのことですが、「このリンク」がどこにあるのか、よくわかりません。

    よろしくお願いし売ます。

    2022年9月28日 17:13
  • fghck856さん、こんにちは。フォーラムオペレーターのSakiです。
    ご協力いただきましてありがとうございます。

    「このリンク」について、説明不足で申し訳ございません。
    ハイパーリンクが設定されましたので、リンクをクリックしてウェブサイトへジャンプするはずです。

    どうぞよろしくお願いいたします。

    MSDN/ TechNet Community Support Saki ~参考になった投稿には「回答としてマーク」をご設定ください。なかった場合は「回答としてマークされていない」も設定できます。同じ問題で後から参照した方が、情報を見つけやすくなりますので、 ご協力くださいますようお願いいたします。また、MSDNサポートに賛辞や苦情がある場合は、MSDNFSF@microsoft.comまでお気軽にお問い合わせください。

    • 回答としてマーク fghck856 2022年9月29日 4:24
    2022年9月29日 1:16
    モデレータ
  • Saki-MSFT 様

    ご回答ありがとうございます。リンクされているページは長い英文の説明で、まだよく読んでいないのですが、どうやらタイトルバーのカスタマイズのサンプルが用意されているようですね。

    おいおい調べていきたいと思います。わからない点等ありましたらまた連絡したいと思います。

    2022年9月29日 4:24
  • Saki-MSFT様より提示されたサンプルを参考にして、下記のようにプログラムすることで、思い通りのタイトルバーが表示できました。

    1.App.cpp

       前回の私の投稿の内容で、変更ありません。

    2.MainPage.xaml

       サンプルの中の「CustomTitleBar.xaml」を参考にして下記のようにプログラムしました。

        <Grid x:Name="TitleBar" VerticalAlignment="Top" Height="30" >
            <Rectangle Fill="#FFF0F0F0" />
            <TextBlock Grid.Column="0" Text="タイトルテスト3" Margin="10,5,0,0"/>
        </Grid>
    

    3.MainPage.cpp

       前回の私の投稿の内容で、「ここから追加」から「ここまで追加」の部分は削除しました。この部分は不要なようです。

    サンプルコードの解読と、試行錯誤に少し時間がかかりましたが、思ったようにタイトルバーをカスタマイズできました。

    みなさん、本当にありがとうございました。

    2022年9月30日 20:31
  • タイトルバーの文字を設定する、もっと簡単な方法が見つかりました。

    1.ソリューションエクスプローラに「Package.appxmanifest」というのが表示されるので、これをダブルクリックします。

    2.表示された画面で「アプリケーション」タグの一番上に「表示名」という項目があって、デフォルトではここにプロジェクト名が設定されています。

    3.このプロジェクト名を、タイトルバーに表示したい文字列に変えるだけです。

    コードは一切変更せずに、これだけでタイトルバーの文字が設定できます。タイトルバーの色を変えるとか、タイトルバーの文字をプログラムから動的に変更するとかでなければ、これで十分です。

    サンプルプログラム「TitleBar」で初期画面のタイトルバーに表示される文字「TitleBar C++/WinRT Sample」はどうやって表示させているのか調べていたら、偶然上記の方法が見つかりました。


    • 編集済み fghck856 2022年10月1日 18:00 スペル修正
    2022年10月1日 13:53