以下、続きです。
現在、ユーザー定義メッセージが、
#define WM_THEME_ID (WM_APP + 0x0100) // 0x8000 + 0x0100 = 33024〜(33024+テーマ数-1)
#define WM_LANGUAGE_ID (WM_APP + 0x0200) // 0x8000 + 0x0200 = 33280〜(33280+言語数-1)
となっていますが、「resource.h」に登録されたメニューIDを見ると、この先テーマ数が増えた際、WM_LANGUAGE_IDの範囲と被るより前に、既存のメニューIDと被って思わずバグりそうなので、思い切って、WM_APP+0x200/WM_APP+0x300とかに直した方がよいと思います。
また、以下のID並びは「33127」が飛んでいます。
#define ID_AUTO_DETECTION_05_SEC 33125
#define ID_AUTO_DETECTION_10_SEC 33126
#define ID_AUTO_DETECTION_20_SEC 33128
#define ID_AUTO_DETECTION_30_SEC 33129
#define ID_AUTO_DETECTION_DISABLE 33130
CDiskInfoDlg::CheckRadioAutoDetection()内の処理、
pMenu->CheckMenuRadioItem(ID_AUTO_DETECTION_05_SEC,ID_AUTO_DETECTION_DISABLE,id,MF_BYCOMMAND);
で都合が悪いかもしれません。
似た処理はメニューID値(番号)を連続する値に割り当ててやれば、「ON_COMMAND_RANGE」マクロを使ってメッセージハンドラを共通化できますし、設定項目の追加や変更も容易です。
[.h ファイル]
class CDiskInfoDlg : public CMainDialogFx
{
// 中略
private:
static CONST INT s_intAutoDetectSetting[];
static CONST INT s_intAutoDetectChoice;
// 中略
protected:
afx_msg void OnAutoDetection(UINT nCommandID);
// 中略
};
[.cpp ファイル]
CONST INT CDiskInfoDlg::s_intAutoDetectSetting[]=
{5 /* [0]:ID_AUTO_DETECTION_05_SEC */
,10 /* [1]:ID_AUTO_DETECTION_10_SEC */
,20 /* [2]:ID_AUTO_DETECTION_20_SEC */
,30 /* [3]:ID_AUTO_DETECTION_30_SEC */
,0 /* [4]:ID_AUTO_DETECTION_DISABLE */ };
CONST INT CDiskInfoDlg::s_intAutoDetectChoice = _countof(s_intAutoDetectSetting);
ON_COMMAND_RANGE(ID_AUTO_DETECTION_05_SEC, ID_AUTO_DETECTION_DISABLE, &CDiskInfoDlg::OnAutoDetection)
void CDiskInfoDlg::OnAutoDetection(UINT nCommandID)
{
if(ID_AUTO_DETECTION_05_SEC<=nCommandID && nCommandID<=ID_AUTO_DETECTION_DISABLE)
{
int nIndex;
nIndex=nCommandID-ID_AUTO_DETECTION_05_SEC;
if(0<=nIndex && nIndex<s_intAutoDetectChoice)
CheckRadioWaitTime(nCommandID, s_intAutoDetectSetting[nIndex]);
else
ASSERT(FALSE); /* Short table entry or command rang is not match. */
}
else
{
TRACE(_T("\r\nERROR : Unknown ID=0x%08X, in %s"),nCommandID,_T(__FUNCTION__));
ASSERT(FALSE);
}
}
なお、念のため CDiskInfoDlg のコンストラクタ内にでも、以下のようなASSERTマクロを埋めておけば、
ASSERT( ID_AUTO_DETECTION_10_SEC == ID_AUTO_DETECTION_05_SEC + 1 );
ASSERT( ID_AUTO_DETECTION_20_SEC == ID_AUTO_DETECTION_10_SEC + 1 );
ASSERT( ID_AUTO_DETECTION_30_SEC == ID_AUTO_DETECTION_20_SEC + 1 );
ASSERT( ID_AUTO_DETECTION_DISABLE == ID_AUTO_DETECTION_30_SEC + 1 );
ASSERT((ID_AUTO_DETECTION_DISABLE - ID_AUTO_DETECTION_05_SEC + 1) == _countof(s_intAutoDetectSetting));
[1] IDがちゃんと並び順になっているかどうか
[2] ID範囲の個数とテーブルの要素数が一致しているか
を、Debugビルドの実行時にチェックできます。
※ ASSERTマクロは、Releaseビルド時のコード生成に影響を与えませんが、
関数の戻り値をチェックするのに、関数呼び出しをASSERTマクロで囲むと、
Releaseビルドで、関数の呼出(実行)も行われなくなるので、VERIFY()
マクロを使うか、戻り値を一旦変数に格納して、ASSERTマクロで変数の
値をチェックするようにしてください。
それから、DiskInfoDlgUpdate.cppの 1605行目 ...
cstr = i18n(_T("Menu"), _T("ALERM_HISTORY"));
ですが、
【誤】 ......「ALERM_HISTORY」
【正】 ......「ALARM_HISTORY」
だと思います。
現在「ID_ALARM_HISTORY」メニューは使われていないので実害はありませんが、綴りが違うので、言語ファイル(.lang)からの読み込みに失敗して i18n() から
空文字列("")が返されるとともに、「ID_ALARM_HISTORY」メニューは存在しないので、
menu->ModifyMenu(ID_ALARM_HISTORY, MF_STRING, ID_ALARM_HISTORY, cstr);
の呼び出しが失敗(戻り値がFALSE)になります。
関数の戻り値をチェックするように、ModifyMenuの呼び出しをVERIFY()マクロで囲んでやると、Debug/Releaseビルドとも、当該行でエラーが発生します。
最後に、これはご本人次第になりますが、逐次対応するのは大変だと思うので、致命的な不具合でもない限り、更新のリリースは月1回とか、2ヶ月に1回とかに限定した方がよくないですか?
以上、ご報告とご提案まで。