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

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

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




            NULL; 

            〃MainMenu〃); 



  如果你希望窗口有垂直滚动条,就得在第三个参数上再加增WS_ VSCROLL 风格。 



  除了上述标准的窗口风格,另有所谓的扩充风格,可以在Create  的第七个参数 



  dwExStyle 指定之。扩充风格唯有以::CreateWindowEx        (而非::CreateWindow)函数才能 



  完成。事实上稍后你就会发现,CFrameWnd::Create 最终调用的正是::CreateWindowEx。 



  Windows 3。1 提供五种窗口扩充风格: 



                                                                                 377 


…………………………………………………………Page 440……………………………………………………………

                  第篇    湷觥 FC  程式設計 



                     WS_EX_DLGMODALFRAME 

                     WS_EX_NOPARENTNOTIFY 

                     WS_EX_TOPMOST 

                     WS_EX_ACCEPTFILES 

                     WS_EX_TRANSPARENT 



                   Windows 95 有更多选择,包括WS_EX_WINDOWEDGE 和WS_EX_CLIENTEDGE,让 



                   窗口更具3D 立体感。Framework  已经自动为我们指定了这两个扩充风格。 



                   Create  的第四个参数rect 指定窗口的位置与大小。默认值rectDefault 是CFrameWnd 



                   的一个static 成员变量,告诉Windows  以预设方式指定窗口位置与大小,就好象在 



                   SDK 程序中以CW_ USEDEFAULT 指定给CreateWindow 函数一样。如果你很有主见, 



                   希望窗口在特定位置有特定大小,可以这么做: 



                     Create(NULL; 

                             〃Hello MFC〃; 

                             WS_OVERLAPPEDWINDOW; 

                                                        起始位置           ,寬      ,高    ) 

                             CRect(40; 60; 240; 460);  //       (40;60)    200    400 

                             NULL; 

                             〃MainMenu〃); 



                   第五个参数pParentWnd  指定父窗口。对于一个top…level 窗口而言,此值应为NULL , 



                   表示没有父窗口(其实是有的,父窗口就是desktop 窗口)。 



                   第六个参数lpszMenuName 指定菜单。本例使用一份在RC  中准备好的菜单 



                   ! § MainMenu! ¨  。第八个参数pContext  是一个指向CCreateContext 结构的指针,framework 



                   利用它,在具备Document/View 架构的程序中初始化外框窗口(第8章的「CDocTemplate 



                    管理CDocument / CView / CFrameWnd 」一节中将谈到此一主题)。本例不具备 



                    Document/View 架构,所以不必指定pContext  参数,默认值为NULL 。 



                    前面提过,CFrameWnd::Create 在产生窗口之前,会先引发窗口类别的注册动作。让我 



                    再扮一次MFC  向导,带你寻幽访胜。你会看到MFC 为我们注册的窗口类别名称,及 



                    注册动作。 



378 


…………………………………………………………Page 441……………………………………………………………

                                                             第6章    MFC 程式的生死因果 



 WINFRM。CPP 



BOOL CFrameWnd::Create(LPCTSTR lpszClassName; 

                           LPCTSTR lpszWindowName; 

                           DWORD dwStyle; 

                           const RECT& rect; 

                           CWnd* pParentWnd; 

                           LPCTSTR lpszMenuName; 

                           DWORD dwExStyle; 

                           CCreateContext* pContext) 

{ 

    HMENU hMenu = NULL; 

    if (lpszMenuName != NULL) 

    { 

        // load in a menu that will get destroyed when window gets destroyed 

        HINSTANCE hInst = AfxFindResourceHandle(lpszMenuName; RT_MENU); 

        hMenu = ::LoadMenu(hInst; lpszMenuName); 

    } 



    m_strTitle = lpszWindowName;    // save title for later 



    CreateEx(dwExStyle; lpszClassName; lpszWindowName; dwStyle; 

          rect。left; rect。top; rect。right rect。left; rect。bottom rect。top; 

          pParentWnd…》GetSafeHwnd(); hMenu; (LPVOID)pContext); 



    return TRUE; 

} 



函数中调用CreateEx。注意,CWnd 有成员函数CreateEx,但其衍生类别CFrameWnd 并 



无,所以这里虽然调用的是CFrameWnd::CreateEx,其实乃是从父类别继承下来的 



        :: 

CWnd   CreateEx。 



 WINCORE。CPP 



BOOL CWnd::CreateEx(DWORD dwExStyle; LPCTSTR lpszClassName; 

                        LPCTSTR lpszWindowName; DWORD dwStyle; 

                        int x; int y; int nWidth; int nHeight; 

                        HWND hWndParent; HMENU nIDorHMenu; LPVOID lpParam) 

{ 

    // allow modification of several mon create parameters 

    CREATESTRUCT cs; 

    cs。dwExStyle = dwExStyle; 

    cs。lpszClass = lpszClassName; 



                                                                                                379 


…………………………………………………………Page 442……………………………………………………………

                    第篇    湷觥 FC  程式設計 



                        cs。lpszName = lpszWindowName; 

                        cs。style = dwStyle; 

                        cs。x = x; 

                        cs。y = y; 

                        cs。cx = nWidth; 

                        cs。cy = nHeight; 

                        cs。hwndParent = hWndParent; 

                        cs。hMenu = nIDorHMenu; 

                        cs。hInstance = AfxGetInstanceHandle(); 

                        cs。lpCreateParams = lpParam; 



                        PreCreateWindow(cs); 

                        AfxHookWindowCreate(this);  // 此动作将在第9章探讨。 

                        HWND hWnd = ::CreateWindowEx(cs。dwExStyle; cs。lpszClass; 

                                        cs。lpszName; cs。style; cs。x; cs。y; cs。cx; cs。cy; 

                                        cs。hwndParent; cs。hMenu; cs。hInstance; cs。lpCreateParams); 

                        。。。 

                    } 



                    函数中调用的PreCreateWindow 是虚拟函数,CWnd 和CFrameWnd 之中都有定义。由 



                    于this 指针所指对象的缘故,这里应该调用的是CFrameWnd::PreCreateWindow                       (还记 



                    得第2章我说过虚拟函数常见的那种行为模式吗?) 



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