<<技术内幕>>十九章开始讲切分窗口的问题,老弟我有两个问题想请教1、在EX19A的例子中,出现CLogScrollView类和CStringView类。我不知道它们的头文件和实现文件是怎样创建的?
  CLogScrollView类的.cpp表明该类是派生于CView类,而在CLassWizard中却看不到CLogScrollView类,为什么?
  CStringView类派生于CLogScrollView,而它在CLassWizard中能看见?
  
2、在讲解EX19B时,作者说“我们对EX19A进行了扩充,在其中定义了第二个视图类,并且允许对窗口进行静态切分,以便在其中显示两个视图”。难道EX19A的CLogScrollView类和CStringView类中的CLogScrollView类不是视图类吗?为什么?
一团浆糊、一团浆糊!大伙儿救救我吧!

解决方案 »

  1.   

    <<技术内幕>>没看过,对于问题1我提一点建议:
    所有类都应该在CLassWizard看见,如果没出现的话,教你个方法。
    先关闭项目,然后到工程目录下,删除一个管理类的临时文件就OK了,文件后缀忘了,VC创建工程后会生成4个临时文件,自己找找吧!反正不是CPP,C,H后缀的文件。删除后,在打开项目,会弹出一个对话框,应该是问你有关本工程类的情况,选全部加入就行了。在CLassWizard中就可以找到全部的类了!
      

  2.   

    第一个问题的答案很简单:那两个文件是作者自己写的,没有借助wizard,所以也就没有让wizard能认识的注释(象{{//afx_xxx之类)。不是wizard的孩子,当然不认了。
      

  3.   

    yinx:
      里面有{{//afx_xxx之类的。而且CStringVeiw类能看见,该怎么办?欢迎大家讨论!
      

  4.   

    不信你自己编一个文件:
    class A
    {
    public:
    int i;
    };
    然后存成一个cpp文件。
    在用project->add to project->files加入某一个工程,你会在classview中看到有A这个类,但是class wizard里却没有
    至于你说的第二个问题,我在我的书中没找到你以用的那句话,我看的是第五版
    CStringView类的文件是appwizard生成的,所以 .....
      

  5.   

    yinx兄:
      CLogScrollVierw中有象{{//afx_xxx之类的东西!
      CStringView类的文件是appwizard怎样生成的呢?
      
      

  6.   

    YINX兄:
      你若有兴趣,给我你EMAIL。我把源码发给你!
      

  7.   

    发给我试试:
    [email protected]
      

  8.   

    我的源代码有CLogScrollView和CStringView呀
    你删除.clw,重新添加CLogScrollView试试,应该是这样问题呀
      

  9.   

    doublesword:
      不错!你若在workspace中能看见这两个类。但你用classwizard只能看不见
    CStringView,却看不见CLogScrollView.
      

  10.   

    doublesword:
      不错!你若在workspace中能看见这两个类。但你用classwizard只能看见
    CStringView,却看不见CLogScrollView.
      
      

  11.   

    哈哈!这个问题算是给我逮着了。yinx说的有道理。须要补充的是:CLogScrollView类不是在这个项目中用wizard生成的。那么究竟的怎么一回事呢?下面我来讲述一下:
    你可以这样做(1)新建一个项目,然后在这个项目中Insert new class(添加新类)CLogScrollView类,它的基类为CView类,完成这个基类的定义与实现。上面这些对你来说应很容易做到。(2)下面做的很简单了,在你需要的项目中(比如你上面的这个例子程序)Add File To Folder(添加文件到项目中)将你要的CLogScrollView类的源文件添加到项目中,即后缀为.cpp和.h的文件。CStringView类为你用wizard添加的类,其基类为CLogScrollView类。
    (3)完成上述操作后,你就会看到你的问题中的现象了!
      

  12.   

    不信你自己编一个文件:
    class A
    {
    public:
    int i;
    };
    然后存成一个cpp文件。
    在用project->add to project->files加入某一个工程,你会在classview中看到有A这个类,但是class wizard里却没有
    至于你说的第二个问题,我在我的书中没找到你以用的那句话,我看的是第五版
    CStringView类的文件是appwizard生成的,所以 .....
      

  13.   

    有朋友告诉我这样解决:
    1、把*.clw,*.ncb,*.aps删掉,重新打开工程,可以看到CLogScrollView类,Visual Studio的问题
    2、CLogScrollView和CStringView,你把它叫做视图类也好,视图的派生类也好,文字而已
    不错,这样做了以后,我的CLogScrollView类在classwizard里能看见了。问cnwww:
     好的,我听你的。我先把classwizard生成的和工程文件名一样的视类文件给删掉。然后添加CLogScrollView类。按上面的解说1,我也能在classwizard中看见该类了。
     但是CStringView是CLogScrollView类的派生类,我在classwizard中添加新类时,在base class栏却揪不出CLogScrollView类,我怎么生成CStringView呢?
    再问大伙:
     .ncb,.aps,.opt分别是什么样的后缀名呢?
    欢迎各位赐教!
      

  14.   

    CStringView是在用appwizard时指定的view类名称,把appwizard指定的默认类名改了,书上那张图上有
      

  15.   

    谢谢各位,题头的问题终于解决了!
    下面的这个,麻劳各位帮帮忙。很快就结贴的!
    .ncb,.aps,.opt分别是什么样的后缀名呢?
      

  16.   

    我们来模拟那个CLogScrollView的.cpp文件,因它是由CView派生来的,我们依葫芦画瓢,把该.cpp文件的虚函数OnDraw也删除。然后,添加protected:
    virtual void OnDraw(CDC* pDC) = 0;      // pass on pure virtual。
    可怜,complie又出问题了。
    error C2259: 'CStringView' : cannot instantiate abstract class due to following members:
            e:\luof\myvc\444\stringview.h(13) : see declaration of 'CStringView'
    为什么?
      

  17.   

    对不起,上面写的有错!
    我们来模拟那个CLogScrollView的.cpp文件,因它是由CView派生来的,我们依葫芦画瓢,把该.cpp文件的虚函数OnDraw也删除。然后,在其头文件添加protected:
    virtual void OnDraw(CDC* pDC) = 0;      // pass on pure virtual。
    可怜,complie又出问题了。
    error C2259: 'CSLogScrollView' : cannot instantiate abstract class due to following members:
            e:\luof\myvc\444\LogScrollView.h(13) : see declaration of 'CLogScrollViewView'
    为什么?
      

  18.   

    一个抽象类是不能生成实例的!cannot instantiate abstract class
      

  19.   

    大家难道都不知道吗?.ncb,.aps,.opt分别是什么样的后缀名呢?你们说说,这CLogScrollView类它是怎么生成的呢?我把它的头文件列出来,大家帮我看看:// LogScrollView.h : interface of the LogScrollView class
    //
    /////////////////////////////////////////////////////////////////////////////
    #ifndef _LOG_TWIPS_SCROLL_VIEW 
    #define _LOG_TWIPS_SCROLL_VIEW #define CX_BORDER   1
    #define CY_BORDER   1class CLogScrollView : public CView
    {
    DECLARE_DYNAMIC(CLogScrollView)// Constructors
    protected:
    CLogScrollView();public:
    void SetLogScrollSizes(SIZE sizeTotal); // in logical units// Attributes
    public:
    CPoint GetScrollPosition() const;       // upper corner of scrolling
    CSize GetTotalSize() const;             // logical size // for device units
    CPoint GetDeviceScrollPosition() const;// Operations
    public:
    void ScrollToPosition(POINT pt);    // set upper left position
    void FillOutsideRect(CDC* pDC, CBrush* pBrush);
    void ResizeParentToFit(BOOL bShrinkOnly = TRUE);// Implementation
    protected:
    CSize m_totalLog;           // total size in logical units (no rounding)
    CSize m_totalDev;           // total size in device units
    CSize m_pageDev;            // per page scroll size in device units
    CSize m_lineDev;            // per line scroll size in device units BOOL m_bCenter;             // Center output if larger than total size
    BOOL m_bInsideUpdate;       // internal state for OnSize callback
    void CenterOnPoint(CPoint ptCenter);
    void ScrollToDevicePosition(POINT ptDev); // explicit scrolling no checkingprotected:
    virtual void OnDraw(CDC* pDC) = 0;      // pass on pure virtual void UpdateBars();          // adjust scrollbars etc
    BOOL GetTrueClientSize(CSize& size, CSize& sizeSb);
    // size with no bars
    void GetScrollBarSizes(CSize& sizeSb);
    void GetScrollBarState(CSize sizeClient, CSize& needSb,
    CSize& sizeRange, CPoint& ptMove, BOOL bInsideClient);public:
    virtual ~CLogScrollView();
    #ifdef _DEBUG
    virtual void Dump(CDumpContext&) const;
    #endif //_DEBUG
    virtual void CalcWindowRect(LPRECT lpClientRect,
    UINT nAdjustType = adjustBorder);
    virtual void OnPrepareDC(CDC* pDC, CPrintInfo* pInfo = NULL); // scrolling implementation support for OLE
    virtual BOOL OnScroll(UINT nScrollCode, UINT nPos, BOOL bDoScroll = TRUE);
    virtual BOOL OnScrollBy(CSize sizeScroll, BOOL bDoScroll = TRUE); //{{AFX_MSG(CLogScrollView)
    afx_msg void OnSize(UINT nType, int cx, int cy);
    afx_msg void OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
    afx_msg void OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar);
    //}}AFX_MSG
    DECLARE_MESSAGE_MAP()
    };
    #endif _LOG_TWIPS_SCROLL_VIEW 再问,既然SLogScrollView是CView的派生类,它的OnDraw函数的处理我实在是不明白。请赐教!
      

  20.   

    to xiaozhou66:
    File Extension Description APS Supports ResourceView 
    BSC Browser information file 
    CLW Supports ClassWizard 
    DEP Dependency file 
    DSP Project file* 
    DSW Workspace file* 
    MAK External makefile 
    NCB Supports ClassView 
    OPT Holds workspace configuration 
    PLG Builds log file 
    * Do not delete or edit in a text editor.
      

  21.   

    经过这番折腾,我的问题快结束了。最近提到的问题,关键在DECLARE_DYNCREATE()和IMPLEMENT_DYNCREATE()没删掉,因为CLogScrollView是个抽象类。问YINX:
      CStringView是在用appwizard时指定的view类名称,把appwizard指定的默认类名改了.在哪里改呀?
     马上就结,我要吃饭去了。
      

  22.   

    original message:
    >>问YINX:
    >>CStringView是在用appwizard时指定的view类名称,把appwizard指定的默>>认类名改了.在哪里改呀?
    在application wizard生成框架的最后一步中的class name...
      

  23.   

    回复xiaozhou66(云淡风轻):
    但是CStringView是CLogScrollView类的派生类,我在classwizard中添加新类时,在base class栏却揪不出CLogScrollView类,我怎么生成CStringView呢?
    xiaozhou66,生成CStringView类的方法如下:
    从菜单中选择Insert new class,在弹出的new class对话框中class type一栏中选择Generic Class,在name一栏中输入CStringView,在Derived From下的一栏中输入CLogScrollView就可以了。
    还有不明白的可以再讨论。
      

  24.   

    真对不起大伙,分本来早再7.13日就加上了。可怜我今天到CSDN上一看,却发现没有结。真是对不住了!谢谢大家!结!!!