《深入浅出MFC第2版(PDF格式)》第130章


WINFRM。CPP 
// CFrameWnd second phase creation 
BOOL CFrameWnd::PreCreateWindow(CREATESTRUCT& cs) 
{ 
if (cs。lpszClass == NULL) 
{ 
AfxDeferRegisterClass(AFX_WNDFRAMEORVIEW_REG); 
cs。lpszClass = _afxWndFrameOrView; // COLOR_WINDOW background 
} 
。。。 
} 
其中AfxDeferRegisterClass 是一个定义于AFXIMPL。H 中的宏。 
380 
…………………………………………………………Page 443……………………………………………………………
第6章 MFC 程式的生死因果 
AFXIMPL。H 
#define AfxDeferRegisterClass (fClass)
((afxRegisteredClasses & fClass) ? TRUE : AfxEndDeferRegisterClass (fClass)) 
这个宏表示,如果变量afxRegisteredClasses 的值显示系统已经注册了fClass 这种视 
窗类别,MFC 就啥也不做;否则就调用AfxEndDeferRegisterClass(fClass),准备注册之。 
afxRegisteredClasses 定义于AFXWIN。H ,是一个旗标变量,用来记录已经注册了哪些视 
窗类别: 
// in AFXWIN。H 
#define afxRegisteredClasses AfxGetModuleState()…》m_fRegisteredClasses 
WINCORE。CPP : 
#0001 BOOL AFXAPI AfxEndDeferRegisterClass (short fClass) 
#0002 { 
#0003 BOOL bResult = FALSE; 
#0004 
#0005 // mon initialization 
#0006 WNDCLASS wndcls; 
#0007 memset(&wndcls; 0; sizeof(WNDCLASS)); // start with NULL defaults 
#0008 wndcls。lpfnWndProc = DefWindowProc; 
#0009 wndcls。hInstance = AfxGetInstanceHandle(); 
#0010 wndcls。hCursor = afxData。hcurArrow; 
#0011 
#0012 AFX_MODULE_STATE* pModuleState = AfxGetModuleState(); 
#0013 if (fClass & AFX_WND_REG) 
#0014 { 
#0015 // Child windows no brush; no icon; safest default class styles 
#0016 wndcls。style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW; 
#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) 
出现在上述函数中的五
小说推荐
返回首页返回目录