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 ) ;
}
参照