Microsoftは設定データなどをレジストリへ保存する事を推奨しているぽいですが、結構嫌がるユーザーさんが多いので私のソフトではiniファイルへ書き出すことが多いわけなのですが、久々にWritePrivateProfileString APIを調べていたら、やれば出来る子という事が判明しました。

APIの名前から機能を「文字列をiniファイルに書き出す」だけだと勝手に思いこんでいたのですが、引数の渡し方によってはキーを削除したり、セクションを削除したりできるようです。
(こういうのは削除専用のAPIを別途作った方が使い手は判りやすいと思うんですが。)

また、ユニコード版(WritePrivateProfileStringW)は、ユニコードのまま文字列を書き出せるという事も判明。
ただし、iniファイルがユニコードファイルである必要があります。
なので、iniファイルが存在していなかったら、BOM(バイトオーダーマーク)だけのファイルを生成した上でWritePrivateProfileStringWを実行すれば良さそうです(ファイルが無い状態でWritePrivateProfileStringWを呼ぶとShiftJisに変換されてしまうようです)。

こんな感じかな。

CString strIniPath = iniファイルのパス
if (!::PathFileExists(strIniPath)) {
	CFile file;
	if (file.Open(strIniPath, CFile::modeWrite | CFile::modeCreate | CFile::shareExclusive)) {
		BYTE bom[2] = {0xff, 0xfe};
		file.Write(bom, 2);
		file.Close();
	}
}
::WritePrivateProfileString(_T("Test"), _T("Test"), strUnicode, strIniPath);

Visual Studio 2008 SP1とMFC(feature pack相当)を使ってアプリを書いていたのですが、

↑こんな感じでメニューの文字が小さくなってしまいました(Dominoのメニューフォントサイズが、設定してあるフォントサイズ)。

一応回避方法があったので載せておきます。

CMainFrame::OnCreateの上の方で

LOGFONT lf;
SystemParametersInfo(SPI_GETICONTITLELOGFONT, sizeof(LOGFONT), &lf, 0);
CMFCMenuBar::SetMenuFont(&lf);
m_fontGUI.CreateFontIndirect(&lf);

を実行すれば良さそうです。

これどっかに連絡すればsp2で治してくれるのかな?
MSのサポートって有料なのでこういう不具合を見つけてもいまいち報告する気にならないのですが。

—–
(コード修正しました)
なにやらSPI_GETNONCLIENTMETRICSでフォントを取得する方法は
開発環境によってはXPでうまく動作しないようなので、
SPI_GETICONTITLELOGFONTを使う方式に変更しました。
参考:http://d.hatena.ne.jp/NyaRuRu/20080303/p1

UITableViewを使って途中でセルをぬめっと追加したくて、
insertRowsAtIndexPaths:withRowAnimation:
を実行してみたのですが、

NSArray* paths = [NSArray arrayWithObject:[NSIndexPath indexPathForRow:1 inSection:0]];
[self.tableView insertRowsAtIndexPaths:paths withRowAnimation:UITableViewRowAnimationTop];

何故かセパレータが消えちゃいましたorz

いろいろいじっているうちに回避方法を発見。
挿入後に上のセルに対してsetNeedsLayoutを呼んでやればセパレータがうまく描画されるみたいです。

UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
[cell setNeedsLayout];

うーん、セルの挿入方法とか間違ってるのかなぁ。

テーブルのセルの中央に来るように計算でUISwitchを配置したところ実機で下側が欠けちゃいました。
e38394e382afe38381e383a3-21

どうやら、frame.origin.y が半端な数値(少数)だと起こるもよう。
欠けちゃった場合はその辺りを確認してみてください。

iPhoneの開発言語であるObjective-CはCの上位互換言語なのでC言語で出来ることは一通り出来ます。クラス(NSObjectの派生クラス)にするとメモリ周りのオーバーヘッドが気になる!もしくはクラスを使うまでも無い!という場合は構造体を使うと良いかと思います。

struct Hogehoge {
	int aaaa;
	int bbbb;
};

ただ、C++と違ってCなので構造体を使うときにもいちいち型を「struct Hogehoge」と指定してやらなきゃいけません。

そんなときにはtypedefを使うと楽になります。

typedef struct {
	int aaaa;
	int bbbb;
} Hogehoge;

これで「Hogehoge」だけで構造体の型を利用できるようになります。

この方法はCの頃は結構当たり前のように使っていたのですが、C++にしばらく入り浸っているうちに忘れてしまっていました。
(というか、structつけずに型を使おうとしてコンパイルエラーが出たときは、なんだか懐かしく感じました(^^;;)
またObjective-Cで思い出したので情報として残しておきます。

記事検索

アーカイブ