Last Updated 2005/06/09
Visual C++ MFC ウィンドウ
ウィンドウクラス名変更
2005/06/09

MFC のアプリケーションウィザードで作成したアプリケーションのウィンドウクラス名は "Afx:〜" という名前になってしまう.

そのクラス名を変更するには,MainFrame の PreCreateWindow() で行う.


■ MFC3.0 まで
BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
    WNDCLASS c_wndclass;
    static char NEAR c_szName[] = "NewClassName";
    GetClassInfo(AfxGetInstanceHandle(), "AfxFrameOrView", &c_wndclass);
    c_wndclass.lpszMenuName = NULL;
    c_wndclass.lpszClassName = c_szName;
    c_wndclass.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    RegisterClass(&c_wndclass);
    cs.lpszClass = c_szName;

    return CFrameWnd::PreCreateWindow(cs);
}


■ MFC4.0

デバッグ版とリリース版で処理が異なる.

BOOL CMainFrame::PreCreateWindow(CREATESTRUCT& cs)
{
    WNDCLASS c_wndclass;
    static char NEAR c_szName[] = "MyFrameClass";
#ifdef _DEBUG
    GetClassInfo(AfxGetInstanceHandle(), "AfxFrameOrView40d", &c_wndclass);
#else
    GetClassInfo(AfxGetInstanceHandle(), "AfxFrameOrView40", &c_wndclass);
#endif
    c_wndclass.lpszMenuName = NULL;
    c_wndclass.lpszClassName = c_szName;
    c_wndclass.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
    RegisterClass(&c_wndclass);
    cs.lpszClass = c_szName;
    return CFrameWnd::PreCreateWindow(cs);
}


MFC の DLL を動的リンクしている場合は上記でよい.
しかし,静的リンクの場合は「ドキュメントの作成に失敗しました」となってしまう.
その場合は以下のようにする.
(以下は全ての場合に対応)

BOOL CMainFrame::PreCreateWindow( CREATESTRUCT& cs )
{
    WNDCLASS c_wndclass ;
    static char NEAR c_szName[] = "MyFrameClass" ;
#ifdef _AFXDLL    // MFC 動的リンク
    #ifdef _DEBUG    // Debug
        #define FRAME_CLASS_NAME    "AfxFrameOrView40d"
    #else    // Release
        #define FRAME_CLASS_NAME    "AfxFrameOrView40"
    #endif
#else    // MFC 静的リンク
    #ifdef _DEBUG    // Debug
        #define FRAME_CLASS_NAME    "AfxFrameOrView40sd"
    #else // Release
        #define FRAME_CLASS_NAME    "AfxFrameOrView40s"
    #endif
#endif
    GetClassInfo( AfxGetInstanceHandle(), FRAME_CLASS_NAME, &c_wndclass ) ;
    c_wndclass.lpszMenuName = NULL ;
    c_wndclass.lpszClassName = c_szName ;
    c_wndclass.hIcon = AfxGetApp()->LoadIcon( IDR_MAINFRAME ) ;
    RegisterClass( &c_wndclass ) ;
    cs.lpszClass = c_szName ;
    return CFrameWnd::PreCreateWindow( cs ) ;
}


参照
前後のTips
ウィンドウクラス名変更

DSS ProgrammingTipsCGI Ver1.02