我的程序是单文档,多视图,每个视图都需要ListCtrl显示,同时工具栏里面有按钮可以切换ListCtrl的现实方式,如切换成大图标显示,小图标显示,列表和详细信息。为了使同一个按钮可以切换所有的视图,我定义了一个父类,CMyListView,派生自CView,然后在里面定义了一个公共变量,CListCtrl m_ListCtrl,在父类中增加了切换按钮的响应函数,添加代码:
m_ListCtrl.ModifyStyle(LVS_TYPEMASK, LVS_REPORT);//列表显示
m_ListCtrl.ModifyStyle(LVS_TYPEMASK, LVS_ICON);//图表显示
等等。
然后定义了几个子类,均派生子CMyListView,在每个子类的OnCreate函数中,创建ListCtrl,
CRect rect;
GetClientRect(&rect);
m_ListCtrl.Create (WS_CHILD | WS_VISIBLE | LVS_REPORT, rect, this, 1);
然后再OnInitialUpdate函数中初始化ListCtrl,
CRect rect;
GetClientRect(&rect);
//m_ListCtrl.Create (WS_CHILD | WS_VISIBLE | LVS_REPORT , rect, this, 1);
m_ListCtrl.SetExtendedStyle(  LVS_EX_HEADERDRAGDROP | LVS_EX_FULLROWSELECT );
int nColInterval = rect.Width()/5;
m_ListCtrl.InsertColumn(0, _T("名称及规格"), LVCFMT_LEFT, nColInterval*2);
m_ListCtrl.InsertColumn(1, _T("单位"), LVCFMT_LEFT, nColInterval);
m_ListCtrl.InsertColumn(2, _T("库存"), LVCFMT_LEFT, nColInterval);
m_ListCtrl.InsertColumn(3, _T("存储位置"), LVCFMT_LEFT, rect.Width()-4*nColInterval);
这样,工具栏里面的切换按钮就可以控制所有的子类的显示类型切换。
目前的问题是:
1。再OnCreate函数中使用GetClientRect函数,得不到rect(其值为零),我只能在OOnInitiaUpdate函数中使用GetClientRect寒暑,才能得到rect,从而创建LListCtrl成功。
2。由于是多视图,我只有一个试图使用了切分窗口,现在只有在被切分的视图中加入的View,才能再OnIniteUpdate函数中使用GetClientRect函数得到rect,而与切分视图同级的View不论在OnCreate还是在OnInitiaUpdate函数中使用GetClientRect函数都得不到rect得值。
例如,我的程序中有两个View,CSplitterView和CTestView,均派生自CMyListView,在CSplitterView中切分视图,加入了两个新View,CMyView1和CMyView2,也派生自CMyListView,这几个View都是用父类的m_ListCtrl来创建ListCtrl。
这样,在CMyView1和CMyView2中,在OnInitiaUpdate函数中我可以得到rect得值,但是在OnCreate函数中得不到,然而在CTestView中,不论在OnCreate还是在OnInitiaUpdate中,都得不到rect的值,根本无法创建ListCtrl。
我也重载了OnSize函数,但是他对于初始化ListCtrl没有任何作用。
我曾经使用CListView类,既让CMyListView派生自CListView,从而可以使用
CListCtrl& m_wndList = GetListCtrl ();
CRect rect;
m_wndList.GetClientRect(&rect);
来得到ListCtrl,但是这样的话,我就没有办法在父类中定义一个变量,可供所有的子类使用,如果在父类中定义CListCtrl& m_wndList;的话,就回提示需要初始化变量,初始化成m_wndList = GetListCtrl ();也提示有问题。
请问我应该怎么做才可以呢?
谢谢了!
我的目的就是让工具栏里面的按钮可以控制所有的View的显示切换。

解决方案 »

  1.   

    ListView本身就是SysListView32窗口,不需要在里面再创建SysListView32窗口(CListCtrl)。
    你的问题可以用模板解决,去看看ATL吧。
      

  2.   

    对不起,我写得太复杂了,那么简单点来说,就是:
    像windows文件管理器,上面有一个查看的按钮,其下拉菜单包括缩略图,平铺,列表,详细信息等,通过他们我们可以实现显示样式的变化,我现在也想实现这样的功能。
    但是我又很多View,每个View显示不同的东西,但都要可以接受同一个按钮的控制来切换显示样式,请问我应该怎么做呢?既我的按钮的消息响应函数应该加在哪里,才能让所有的View都可以相应。
    谢谢!
      

  3.   

    MainFrame里面,实现的函数也一样。祝你新年快乐:)