按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
#0017 wndcls。lpszClassName = _afxWnd;
#0018 bResult = AfxRegisterClass(&wndcls);
#0019 if (bResult)
#0020 pModuleState…》m_fRegisteredClasses |= AFX_WND_REG;
#0021 }
#0022 else if (fClass & AFX_WNDOLECONTROL_REG)
#0023 {
#0024 // OLE Control windows use parent DC for speed
#0025 wndcls。style |= CS_PARENTDC | CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
#0026 wndcls。lpszClassName = _afxWndOleControl;
#0027 bResult = AfxRegisterClass(&wndcls);
#0028 if (bResult)
381
…………………………………………………………Page 444……………………………………………………………
第篇 湷觥 FC 程式設計
#0029 pModuleState…》m_fRegisteredClasses |= AFX_WNDOLECONTROL_REG;
#0030 }
#0031 else if (fClass & AFX_WNDCONTROLBAR_REG)
#0032 {
#0033 // Control bar windows
#0034 wndcls。style = 0; // control bars don't handle double click
#0035 wndcls。lpszClassName = _afxWndControlBar;
#0036 wndcls。hbrBackground = (HBRUSH)(COLOR_BTNFACE + 1);
#0037 bResult = AfxRegisterClass(&wndcls);
#0038 if (bResult)
#0039 pModuleState…》m_fRegisteredClasses |= AFX_WNDCONTROLBAR_REG;
#0040 }
#0041 else if (fClass & AFX_WNDMDIFRAME_REG)
#0042 {
#0043 // MDI Frame window (also used for splitter window)
#0044 wndcls。style = CS_DBLCLKS;
#0045 wndcls。hbrBackground = NULL;
#0046 bResult = RegisterWithIcon(&wndcls; _afxWndMDIFrame;
AFX_IDI_STD_MDIFRAME);
#0047 if (bResult)
#0048 pModuleState…》m_fRegisteredClasses |= AFX_WNDMDIFRAME_REG;
#0049 }
#0050 else if (fClass & AFX_WNDFRAMEORVIEW_REG)
#0051 {
#0052 // SDI Frame or MDI Child windows or views normal colors
#0053 wndcls。style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
#0054 wndcls。hbrBackground = (HBRUSH) (COLOR_WINDOW + 1);
#0055 bResult = RegisterWithIcon(&wndcls; _afxWndFrameOrView;
AFX_IDI_STD_FRAME);
#0056 if (bResult)
#0057 pModuleState…》m_fRegisteredClasses |= AFX_WNDFRAMEORVIEW_REG;
#0058 }
#0059 else if (fClass & AFX_WNDMCTLS_REG)
#0060 {
#0061 InitmonControls();
#0062 bResult = TRUE;
#0063 pModuleState…》m_fRegisteredClasses |= AFX_WNDMCTLS_REG;
#0064 }
#0065
#0066 return bResult;
#0067 }
382
…………………………………………………………Page 445……………………………………………………………
第6章 MFC 程式的生死因果
出现在上述函数中的六个窗口类别卷标代码,分别定义于AFXIMPL。H 中:
#define AFX_WND_REG (0x0001)
#define AFX_WNDCONTROLBAR_REG (0x0002)
#define AFX_WNDMDIFRAME_REG (0x0004)
#define AFX_WNDFRAMEORVIEW_REG (0x0008)
#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)