按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
#define AFX_WNDMCTLS_REG (0x0010)
#define AFX_WNDOLECONTROL_REG (0x0020)
出现在上述函数中的五个窗口类别名称,分别定义于WINCORE。CPP 中:
const TCHAR _afxWnd'' = AFX_WND;
const TCHAR _afxWndControlBar'' = AFX_WNDCONTROLBAR;
const TCHAR _afxWndMDIFrame'' = AFX_WNDMDIFRAME;
const TCHAR _afxWndFrameOrView'' = AFX_WNDFRAMEORVIEW;
const TCHAR _afxWndOleControl'' = AFX_WNDOLECONTROL;
而等号右手边的那些AFX_ 常数又定义于AFXIMPL。H 中:
#ifndef _UNICODE
#define _UNICODE_SUFFIX
#else
#define _UNICODE_SUFFIX _T(〃u〃)
#endif
#ifndef _DEBUG
#define _DEBUG_SUFFIX
#else
#define _DEBUG_SUFFIX _T(〃d〃)
#endif
#ifdef _AFXDLL
#define _STATIC_SUFFIX
#else
#define _STATIC_SUFFIX _T(〃s〃)
#endif
#define AFX_WNDCLASS(s)
_T(〃Afx〃) _T(s) _T(〃42〃) _STATIC_SUFFIX _UNICODE_SUFFIX _DEBUG_SUFFIX
#define AFX_WND AFX_WNDCLASS(〃Wnd〃)
#define AFX_WNDCONTROLBAR AFX_WNDCLASS(〃ControlBar〃)
#define AFX_WNDMDIFRAME AFX_WNDCLASS(〃MDIFrame〃)
#define AFX_WNDFRAMEORVIEW AFX_WNDCLASS(〃FrameOrView〃)
#define AFX_WNDOLECONTROL AFX_WNDCLASS(〃OleControl〃)
383
…………………………………………………………Page 446……………………………………………………………
第篇 湷觥 FC 程式設計
所以,如果在Windows 95 (non…Unicode )中使用MFC 动态联结版和除错版,五个窗口
类别的名称将是:
〃AfxWnd42d〃
〃AfxControlBar42d〃
〃AfxMDIFrame42d〃
〃AfxFrameOrView42d〃
〃AfxOleControl42d〃
如果在Windows NT (Unicode 环境)中使用MFC 静态联结版和除错版,五个窗口类
别的名称将是:
〃AfxWnd42sud〃
〃AfxControlBar42sud〃
〃AfxMDIFrame42sud〃
〃AfxFrameOrView42sud〃
〃AfxOleControl42sud〃
这五个窗口类别的使用时机为何?稍后再来一探究竟。
让我们再回顾AfxEndDeferRegisterClass 的动作。它调用两个函数完成实际的窗口类别注
册动作,一个是RegisterWithIcon ,一个是AfxRegisterClass :
static BOOL AFXAPI RegisterWithIcon (WNDCLASS* pWndCls;
LPCTSTR lpszClassName; UINT nIDIcon)
{
pWndCls…》lpszClassName = lpszClassName;
HINSTANCE hInst = AfxFindResourceHandle(
MAKEINTRESOURCE(nIDIcon); RT_GROUP_ICON);
if ((pWndCls…》hIcon = ::LoadIcon(hInst; MAKEINTRESOURCE(nIDIcon))) == NULL)
{
// use default icon
pWndCls…》hIcon = ::LoadIcon(NULL; IDI_APPLICATION);
}
return AfxRegisterClass (pWndCls);
}
BOOL AFXAPI AfxRegisterClass (WNDCLASS* lpWndClass)
{
WNDCLASS wndcls;
384
…………………………………………………………Page 447……………………………………………………………
第6章 MFC 程式的生死因果
if (GetClassInfo(lpWndClass…》hInstance;
lpWndClass…》lpszClassName; &wndcls))
{
// class already registered
return TRUE;
}
::RegisterClass(lpWndClass);
。。。
return TRUE;
}
注意,不同类别的PreCreateWindow 成员函数都是在窗口产生之前一刻被调用,准备用
来注册窗口类别。如果我们指定的窗口类别是NULL ,那么就使用系统预设类别。从CWnd
及其各个衍生类别的PreCreateWindow 成员函数可以看出,整个Framework 针对不同功
能的窗口使用了哪些窗口类别:
// in WINCORE。CPP
BOOL CWnd::PreCreateWindow(CREATESTRUCT& cs)
{
{
AfxDeferRegisterClass(AFX_WND_REG);
。。。
cs。lpszClass = _afxWnd; (这表示CWnd 使用的窗口类别是_afxWnd)
}
return TRUE;
}
// in WINFRM。CPP
BOOL CFrameWnd::PreCreateWindow(CREATESTRUCT& cs)
{
if (cs。lpszClass == NULL)
{
AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG);
。。。
cs。lpszClass = _afxWndFrameOrView; (这表示CFrameWnd 使用的窗口
}
类别是_afxWndFrameOrView)
。。。
}
// in WINMDI。CPP
BOOL CMDIFrameWnd::PreCreateWindow(CREATESTRUCT& cs)
385
…………………………………………………………Page 448……………………………………………………………
第篇 湷觥 FC 程式設計
{
if (cs。lpszClass == NULL)
{
AfxDeferRegisterClass(AFX_WNDMDIFRAME_REG);
。。。
cs。lpszClass = _afxWndMDIFrame; (这表示CMDIFrameWnd 使用的窗口
类别是_afxWndMDIFrame)
}
return TRUE;
}
// in WINMDI。CPP
BOOL CMDIChildWnd::PreCreateWindow(CREATESTRUCT& cs)
{
。。。
return CFrameWnd::PreCreateWindow(cs); (这表示CMDIChildWnd 使用的窗口
类别是 类别是 类别是_afxWndFrameOrView)
}