友情提示:如果本网页打开太慢或显示不完整,请尝试鼠标右键“刷新”本网页!阅读过程发现任何错误请告诉我们,谢谢!! 报告错误
一世书城 返回本书目录 我的书架 我的书签 TXT全本下载 进入书吧 加入书签

深入浅出MFC第2版(PDF格式)-第98章

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 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) 

返回目录 上一页 下一页 回到顶部 0 1
未阅读完?加入书签已便下次继续阅读!
温馨提示: 温看小说的同时发表评论,说出自己的看法和其它小伙伴们分享也不错哦!发表书评还可以获得积分和经验奖励,认真写原创书评 被采纳为精评可以获得大量金币、积分和经验奖励哦!