スキップしてメイン コンテンツへ

 none
MFCのリストコントロールへのフォント設定 RRS feed

  • 質問

  • お世話になっております。

    VisualStudioC++2005でMFCプログラムを作成しています。

    画面にListCOntrolを配置して下記のコードで文字列をセットしています。

    日本語OS(Win7,win10)では表示できるのですが、英語OS(Win7,WIn10)だと空文字になります。

    menu[i][18].GetBUffer()を_T("文字列")とすると表示するので。どこが問題なんでしょうか?

    初歩的で大変申し訳ないですが、御教授のほど、よろしくお願いします。

    ちなみに同じプログラムの同じ画面上にあるツリーコントロールは、同じロジックで日本語を表示します。

    開発環境

    開発PC WIndows7日本語OS

    開発ツール VisualStudio C++2005

    開発タイプ MFCアプリケーション

    サンプルコード

     LVCOLUMN mlc;
     RECT mlr;
     static LVITEM mi;
     int i;
     CFont m_Font,*o_Font;
     LOGFONT myLF;
     
     //m_tree[4]同じ画面にあるツリーコントロール
     o_Font=m_tree[4].GetFont();o_Font->GetLogFont(&myLF);
     //fav_clist リストコントロールの変数です
     fav_clist.SetFonto_Font);
     
     mlc.mask=LVCF_TEXT|LVCF_WIDTH|LVCF_FMT;
     mlc.pszText=_T("Program");
     mlc.fmt=LVCFMT_CENTER;
     fav_clist.InsertColumn(0,&mlc);
     fav_clist.DeleteAllItems();
     for(i=0;i<row_no;i++)
     {
      mi.mask=LVIF_TEXT|LVIF_IMAGE;
      mi.iItem=i;
      mi.iSubItem=0;
      
      //menu[i][13]はリストコントロールに表示する文字列でCString型
      mi.pszText=menu[i][13].GetBuffer();
     }

    2019年9月11日 6:41

回答

  • bikkeさん、こんにちは。フォーラムオペレーターのHarukaです。
    ご返信いただきありがとうございます。

    データ変換を表示するためにブレークポイントを追加したことがありますか。
    右クリックして一時停止する必要があるコード行にブレークポイントを追加すると、この時点まで実行されるとプログラムが一時停止し、値を表示しやすくなります。

    ブレークポイントを使用し、mi.pszTextが正しい値を取得することを確認しましたか。
    私の知る限り、コード内のいくつかの値のソースが表示されていないため、表示しているコードにエラーが存在しない可能性があると思います。
    今できることは、ステップバイステップでエラーの可能性を排除し、最終的にそれを見つけることです。

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


    MSDN/ TechNet Community Support Haruka

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

    • 回答としてマーク bikke 2019年9月27日 2:20
    2019年9月19日 8:26
    モデレータ

すべての返信

  • 英語版のOSでもちゃんと実行したいのであれば、プロジェクトのプロパティから、文字セットをUNICODEにしてビルドするべきでしょう。

    あるいは、使用者のOSの制御が取れる(相手が従業員であるなど)特殊事情があるのであれば、Windowsの設定である、 Language, and Regionのコントロールパネルのあたりから、Language for non-Unicode programsをJapaneseに設定して廻る手もありますが。

    jzkey

    2019年9月11日 11:02
  • jzkeyさん

    早速の返信ありがとうございます。

    御指摘いただいた、・プロジェクトのUNICODE指定 ・Regin設定は両方とも対応すみなんです。

    もうちょっと頑張って検討してみます。ありがとうございました

    2019年9月12日 0:40
  • bikkeさん、こんにちは。フォーラムオペレーターのHarukaです。
    MSDNフォーラムにご投稿くださいましてありがとうございます。

    コードをテストしたところ、ループステートメントでfav_clist.InsertItem(&mi)を呼び出して構造情報をCListCtrlコントロールに渡さなかったため、データが表示されないことがわかりました。 
    同時に、英語OSが異常に表示されると言いましたが、menu[i][13]およびmi.pszTextの値を確認するブレークポイントを設定して、データ変換エラーが発生した場所を特定できます。 
    日本語および英語のOSでデータを表示する必要がある場合は、プロパティページでマルチバイトに変更できます。 これにより、多くのリスクが軽減されます。

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


    MSDN/ TechNet Community Support Haruka

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

    2019年9月17日 8:23
    モデレータ
  • Harukaさん

    返信ありがとうございます。

    コードを見直したところ、fav_clist.InserItem(&mi)を記述してありました。

    先の投稿の際の記入漏れでした。すいません。

    他に何か思い当たるところないでしょうか?

    2019年9月18日 6:37
  • InserItem()の戻り値は確認しましたか? menu[i][18].GetBUffer()が期待する文字列を保持していることは確認しましたか?
    • 回答の候補に設定 佐祐理 2019年10月4日 2:16
    2019年9月18日 7:32
  • bikkeさん、こんにちは。フォーラムオペレーターのHarukaです。
    ご返信いただきありがとうございます。

    データ変換を表示するためにブレークポイントを追加したことがありますか。
    右クリックして一時停止する必要があるコード行にブレークポイントを追加すると、この時点まで実行されるとプログラムが一時停止し、値を表示しやすくなります。

    ブレークポイントを使用し、mi.pszTextが正しい値を取得することを確認しましたか。
    私の知る限り、コード内のいくつかの値のソースが表示されていないため、表示しているコードにエラーが存在しない可能性があると思います。
    今できることは、ステップバイステップでエラーの可能性を排除し、最終的にそれを見つけることです。

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


    MSDN/ TechNet Community Support Haruka

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

    • 回答としてマーク bikke 2019年9月27日 2:20
    2019年9月19日 8:26
    モデレータ
  • Harukaさん

    返信遅れてすいません。

    了解です。テスト環境を作って、ステップバイステップで問題点の確認を実施します。

    とりあえず回答として、終了したいと思います

    2019年9月27日 2:20
  • その後、確認したところ、原因判明し対策も出来たので、報告します。

    原因は、表示文字列変数のmenu[i][13]に文字列がセットされていませんでした。

    この文字列は、サーバーからchar型で受信し、CString型にセットしていたのですが、

    日本語以外OSの場合、セット出来ていなかった・・・・というわけでした。

    既存コードを手短に修正しようとして、はまってしまったという、ありがちな落とし穴でした。

    皆様がたには、ご迷惑をおかけしました。

    今後とも宜しくお願いします。

    以上

    2019年10月4日 0:59