デル株式会社

CWinApp 雑記

Last Updated: Dec.19,2006
使用しているコンパイラは、Microsoft Visual C++ 6.0 です。これ以外のバージョンでは記述と食い違うことがあるかも知れません。

1. 初期化データの保存場所の変更

アプリケーションで初期化データを保存する「場所」をレジストリではなく、EXE ファイルの置かれるフォルダ内に ini ファイルとして保存するように変更します。なお、私自身は殊更にレジストリへの保存を否定する考えは持っていません。

CWinApp の派生クラスの InitInstance() に以下のコードを追加します。

BOOL CMyApp::InitInstance()
{
    free((void*)m_pszProfileName);
    TCHAR szPath[MAX_PATH + 1];
    ::GetModuleFileName(NULL, szPath, MAX_PATH);
    lstrcpy(_tcsrchr(szPath, _T('.')), _T(".ini"));
    m_pszProfileName = _tcsdup(szPath);

    ...
    ...
}

次に、その下にある以下のコードを削除します。

    // 設定が保存される下のレジストリ キーを変更します。
    // TODO: この文字列を、会社名または所属など適切なものに
    // 変更してください。
    SetRegistryKey(_T("Local AppWizard-Generated Applications"));

2. 全ビューへの更新通知

たとえば、エディタの表示フォントを変更するなど、全てのビューに更新通知を行いたい場合に使います。どこからでも呼び出せるのでとても便利です。

// ** 宣言 **
void UpdateAllViews(CView* pSender, LPARAM lHint = 0L, CObject* pHint = NULL);

// ** 定義 **
void CMyApp::UpdateAllViews(CView* pSender, LPARAM lHint, CObject* pHint)
{
    CDocTemplate* pDocTemplate;
    POSITION posDocTemplate = m_pDocManager->GetFirstDocTemplatePosition();
    while (posDocTemplate != NULL)
    {
        pDocTemplate = m_pDocManager->GetNextDocTemplate(posDocTemplate);
        ASSERT_VALID(pDocTemplate);
        ASSERT(pDocTemplate->IsKindOf(RUNTIME_CLASS(CDocTemplate)));
        POSITION posDoc = pDocTemplate->GetFirstDocPosition();
        while (posDoc != NULL)
        {
            CDocument* pDoc = pDocTemplate->GetNextDoc(posDoc);
            ASSERT_VALID(pDoc);
            ASSERT(pDoc->IsKindOf(RUNTIME_CLASS(CDocument)));
            pDoc->UpdateAllViews(pSender, lHint, pHint);
        }
    }
}

Back Copyright (c) 2006 AOK. All Rights Reserved.