MFC:前回の設定を記憶する

mfc-save.png

ソフトウェアの設定を記憶する方法は2つある

  1. .iniファイルに記憶する。
  2. レジストリを使う

どちらがよいのかは比較を参照に。
売り出すような巨大なプログラムでないのなら、iniファイルの方が安全かな。

INIファイルの形式

[セクション名]
キー名=値
[次のセクション名]
キー名=値;セミコロン以下がコメント
キー名=文字列でもダブルクオーテーションで囲ったりしないこと
    キー名=値;インデントしても構わないようだ

となっている。

INIファイルを書きだす。

WritePrivateProfileString関数を使う。

BOOL WritePrivateProfileString(セクション名,キー名, 追加するべき文字列,.ini ファイル名);

// INIファイルに情報を保存する
    WritePrivateProfileString(L"settings", L"databasepath", databasefilepath,L"inputform.ini");

C:\WINDOWS以下に.inputform.iniファイルが書き出される。

[settings]
databasepath=C:/miffy/database.mb

みたいのができるだろう。

読み取る

DWORD GetPrivateProfileString(セクション名,キー名,既定の文字列,情報が格納されるバッファ,情報バッファのサイズ,.ini ファイルの名前);
BOOL GetPrivateProfileStruct(セクション名のアドレス,キーの名前のアドレス,取得した値を受け取るバッファのアドレス,取得した値を受け取るバッファのサイズ,初期化ファイルの名前のアドレス)
);
// INIファイルから情報を取り込む
    GetPrivateProfileString(SECTION,DBPATH,L"db1.mdb",
    (LPWSTR)(LPCTSTR)databasefilepath,MAX_PATH,(LPCWSTR)(LPCTSTR)INIFLE);

セクション名を得る

char test[200];
    GetPrivateProfileSectionNames(test,200,"../data/setting.ini");

あ、float型の設定値はどうしよう?

GetPrivateProfileString→atofだ。
'\0'で区切った形で複数のセクション名を得ることができる。
どこがおしまいなのかは、\0が2つ続くことによってわかる。

INIファイルの保存ディレクトリを指定する

MFCでは何も指定しないとINIファイルはWindowsディレクトリ下に作成される。これって、迷惑な話しよね。
なので、保存ディレクトリを指定したい。
コンソールアプリではいきなりGetPrivateProfileStringを使ってok.main.cppファイルのある場所からの相対パスで大丈夫。

GetPrivateProfileIntは255より大きい数字はダメ

不便だねー

ちなみに、、skyrimの場合は

[General]
iNumHWThreads=8
[BackgroundLoad]
bBackgroundLoadLipFiles=1
bLoadBackgroundFaceGen=1
fDefault1stPersonFOV=XX.0000
uLockedObjectMapLOD=8
[MapMenu]
sMapCloudNIF=Meshes\Sky\SkyrimWorldMapCloudBank.nif
  • キー名の最初に型識別子がついている
  • 名前の付け方はキャメルケース

iniファイルの場所

GetPrivateProfileString(セクション名,キー名,既定の文字列,情報が格納されるバッファ,情報バッファのサイズ,”mysetting.ini);//これだと
//c:\WINDOWS\Profile\%USER%\Application Data\ みたいな変な場所からiniファイルを探しにいってしまう
GetPrivateProfileString(セクション名,キー名,既定の文字列,情報が格納されるバッファ,情報バッファのサイズ,”./mysetting.ini);//こうすれば実行ファイルと同じ階層になる

ini user-data

サポートサイト Wikidot.com iniuser-data