GetSaveFileNameでファイル名に全角日本語を使いたい

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
LargeSlope
記事: 2
登録日時: 1年前

GetSaveFileNameでファイル名に全角日本語を使いたい

#1

投稿記事 by LargeSlope » 1年前

Win32APIの話になるのですが、
以下のソースコードを実行しようとしたときに「名前を付けて保存」ダイアログが出てきます。
しかし、ファイル名を入力するときに「全角/半角」キーを押してもIMEの切り替えができなく、全部半角で入力されてしまいます。
[全角/半角]切替ができないというだけで、例えばメモ帳にファイル名を書いてそれをコピペならできます。
また、アプリ側からデフォルトのファイル名に全角の使用はできます。
他のアプリ(メモ帳とか)だとファイル名に全角を使えるのでPCの問題じゃないと思われます。

GetSaveFileName()でファイル名を全角入力もできるようにするためには何か特別なフラグが必要なのでしょうか?
または、Visual Studioのプロジェクト設定の問題でしょうか?
多分どこか抜けてるだけだと思いますけど…
別な解決案としてMFCやC#などでdllを作成するというのもありますけど、これの為にdllは作りたくないです
他のサイトを調べてもそれらしき情報が見当たらなかったので、詳しい方解決策をご教授お願いします。

コード:

	OPENFILENAME     OpenFile = { OPENFILENAME_SIZE_VERSION_400 };
	TCHAR            szPath[MAX_PATH] = { 0 };
	TCHAR            szFile[MAX_PATH] = _T("イメージ.png");	// デフォルトのファイル名

	GetCurrentDirectory(MAX_PATH, szPath);

	OpenFile.hwndOwner = GetMainWindowHandle();
	OpenFile.lpstrInitialDir = szPath;
	OpenFile.lpstrFile = szFile;
	OpenFile.nMaxFile = MAX_PATH;
	OpenFile.lpstrFilter = "PNGファイル(*.png)\0*.png\0";
	OpenFile.lpstrTitle = "名前を付けて保存";
	OpenFile.nFilterIndex = 1;
	OpenFile.Flags = OFN_EXPLORER | OFN_CREATEPROMPT | OFN_OVERWRITEPROMPT;

	// ここで「名前を付けて保存」ダイアログを表示します
	if (GetSaveFileName(&OpenFile)) {

		/* 色々 */

		// 保存
		SaveDrawScreenToPNG(0, 0, nWidth, nHeight, szFile);	// 画像を保存
		SetDrawScreen(DX_SCREEN_BACK);				// 出力先を戻す
		MessageBox(NULL, _T("完了"), _T("Dx Image Conbiner"), MB_ICONINFORMATION);
	}
実行結果:
名前を付けて保存.png
環境
OS: Windows 11 Pro (21H2)
開発環境: VisualStudio2022
アプリ: 32ビット(x86)
文字セット: マルチバイト
使用ライブラリ: DXライブラリ(Ver 3.22c)

アバター
あたっしゅ
記事: 664
登録日時: 13年前
住所: 東京23区
連絡を取る:

Re: GetSaveFileNameでファイル名に全角日本語を使いたい

#2

投稿記事 by あたっしゅ » 1年前

東上☆海美☆「
『DxLib 全角入力』で検索した所

SetUseIMEFlag( TRUE ); // https://dxlib.xsrv.jp/cgi/patiobbs/pati ... ew&no=4644
全角入力が必要な部分
SetUseIMEFlag( FALSE ); // https://dxlib.xsrv.jp/cgi/patiobbs/pati ... ew&no=4644

とすれば、全角入力が出来るようです。

コード:

//
// https://dixq.net/forum/viewtopic.php?f=3&t=21516&sid=625860ae6cf66b0bebeecf612ba58d5f
// 画像の更新が入らない - ミクプラ(ja)
//
// for Visual Studio 2022
//
#include "DxLib.h"


int Key[256]; // キーが押されているフレーム数を格納する


int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int) {
    ChangeWindowMode(TRUE), DxLib_Init(), SetDrawScreen(DX_SCREEN_BACK); //ウィンドウモード変更と初期化と裏画面設定

    // SetMultiThreadFlag(false); // https://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=past&no=2966

    int x = 300;

    // while(裏画面を表画面に反映, メッセージ処理, 画面クリア)
    while (ScreenFlip() == 0 && ProcessMessage() == 0 && ClearDrawScreen() == 0) {
        char Key[256]; // 現在のキーの入力状態を格納する

        GetHitKeyStateAll(Key); // 全てのキーの入力状態を得る

        if (Key[KEY_INPUT_RIGHT] >= 1) { // 右キーが押されていたら
            x++;                       // 右へ移動
        }
        if (Key[KEY_INPUT_LEFT] >= 1) { // 左キーが押されていたら
            x--;                       // 左へ移動
        }
        if (Key[KEY_INPUT_SPACE] >= 1) { // SPACE キーが押されていたら
            SetUseIMEFlag( TRUE ); // https://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=4644

            const int        nWidth  = 640;
            const int        nHeight = 480;
            OPENFILENAME     OpenFile = { OPENFILENAME_SIZE_VERSION_400 };
            TCHAR            szPath[MAX_PATH] = { 0 };
            TCHAR            szFile[MAX_PATH] = _T("イメージ.png");	// デフォルトのファイル名

            GetCurrentDirectory(MAX_PATH, szPath);

            OpenFile.hwndOwner = GetMainWindowHandle();
            OpenFile.lpstrInitialDir = szPath;
            OpenFile.lpstrFile = szFile;
            OpenFile.nMaxFile = MAX_PATH;
            OpenFile.lpstrFilter = "PNGファイル(*.png)\0*.png\0";
            OpenFile.lpstrTitle = "名前を付けて保存";
            OpenFile.nFilterIndex = 1;
            OpenFile.Flags = OFN_EXPLORER | OFN_CREATEPROMPT | OFN_OVERWRITEPROMPT;

            // ここで「名前を付けて保存」ダイアログを表示します
            if (GetSaveFileName(&OpenFile)) {

                /* 色々 */

                // 保存
                SaveDrawScreenToPNG(0, 0, nWidth, nHeight, szFile);	// 画像を保存
                SetDrawScreen(DX_SCREEN_BACK);				// 出力先を戻す
                MessageBox(NULL, _T("完了"), _T("Dx Image Conbiner"), MB_ICONINFORMATION);
            }

            SetUseIMEFlag( FALSE ); // https://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=4644
        }
        if (x == 0 || x == 600) {
            x = 300;
        }

        DrawFormatString( x, 0, GetColor(255,255,255), "%d", x ); // 東上☆海美☆が追加
    }

    DxLib_End(); // DXライブラリ終了処理
    return 0;
}


// end.
環境
OS: Windows 11 Pro Insider Preview
開発環境: VisualStudio2022
アプリ: 64ビット(x64)
文字セット: マルチバイト
使用ライブラリ: DXライブラリ(Ver 3.23)
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

LargeSlope
記事: 2
登録日時: 1年前

Re: GetSaveFileNameでファイル名に全角日本語を使いたい

#3

投稿記事 by LargeSlope » 1年前

ありがとうございます!!
DxLib_Init()の後ろにSetUseIMEFlag(TRUE);を書いたら解決しました
DXライブラリの設定だったんですね
勉強になりました

返信

“C言語何でも質問掲示板” へ戻る