为了使ListCtrl能停靠,就继承了停靠控件的类:CMyDockingControlBar:CBCGPDockingControlBar
加入了一个CListCtrl。等我加载完数据后,连续三次选中同一行时,会出现异常。但是,单击新的一行是没有问题的。不知道是不是我的初始化的问题。希望高人指点。我用的版本是9.4下面是这个类的主要结构:#include "stdafx.h"
#include "Test.h"
#include "MyListDockingCtrlBar.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////CMyListDockingCtrlBar::CMyListDockingCtrlBar(){}
CMyListDockingCtrlBar::~CMyListDockingCtrlBar(){}BEGIN_MESSAGE_MAP(CMyListDockingCtrlBar, CBCGPDockingControlBar)
//{{AFX_MSG_MAP(CMyListDockingCtrlBar)
ON_WM_CREATE()
ON_WM_SIZE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()/************************************************************************/
/* 窗体响应                                                            */
/************************************************************************/int CMyListDockingCtrlBar::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
if (CBCGPDockingControlBar::OnCreate(lpCreateStruct) == -1)
return -1; //创建列表
CRect rect;
rect.SetRectEmpty();
const DWORD dw_style=WS_CHILD|WS_VISIBLE;
m_ListCtrl.Create("",dw_style,rect,this,ID_VIEW_OVERVIEWCTRLBAR);

//添加列
InitListCtrl(); //追加默认记录
AppendDefaultRow(); return 0;
}void CMyListDockingCtrlBar::OnSize(UINT nType, int cx, int cy) 
{
CBCGPDockingControlBar::OnSize(nType, cx, cy);
if (::IsWindow(m_ListCtrl.GetSafeHwnd()))
{
m_ListCtrl.SetWindowPos(NULL,0,0,cx,cy,SWP_NOACTIVATE | SWP_NOZORDER);
}
}/************************************************************************/
/*  数据操作                                                            */
/************************************************************************/void CMyListDockingCtrlBar::InitListCtrl()
{
DWORD dwStyle;
dwStyle = m_ListCtrl.GetStyle();  //取得样式
dwStyle |=    LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT ;   //添加样式
m_ListCtrl.SetExtendedStyle(dwStyle);     //重新设置 m_ListCtrl.InsertColumn(0,"ID",LVCFMT_CENTER,100); 
m_ListCtrl.InsertColumn(1,"名称",LVCFMT_CENTER,100); 
    m_ListCtrl.InsertColumn(2,"大小",LVCFMT_CENTER,100); 
}void CMyListDockingCtrlBar::AppendDefaultRow()
{
 if (m_ListCtrl.InsertItem(0,"")==-1)
 {
 return;
 }
 m_ListCtrl.SetItemText(0,0,"1");
 m_ListCtrl.SetItemText(0,1,"文件A");
 m_ListCtrl.SetItemText(0,2,"2M");  
}
CMyListDockingContrlBar由CMainFrame调用。
有使用过的朋友,请指教下

解决方案 »

  1.   

    写错了 const DWORD dw_style=WS_CHILD|WS_VISIBLE; //这个不会异常
    const DWORD dw_style=WS_CHILD|WS_VISIBLE|LVS_REPORT;//是报告风格下的,才会异常
      

  2.   

    LVS_REPORT 是普通风格,不要使用 SetExtendedStyle 来设置。如果 CListCtrl 原来是 LVS_ICON 风格的,可以使用 ModifyStyle(LVS_ICON, LVS_REPORT) 切换为 LVS_REPORT 风格。LVS_EX_GRIDLINES 和 LVS_EX_FULLROWSELECT 是扩展风格,可以使用 GetExtendedStyle 和 SetExtendedStyle 来获取与设置。
      

  3.   


    哎,找到问题了,犯了低级错误。
    多了一个'|'运算符,也不用取之前的风格。抵消了部分创建风格,所以出现了除零的异常。
    修改
        dwStyle |=    LVS_EX_GRIDLINES | LVS_EX_FULLROWSELECT ;   //添加样式
        m_ListCtrl.SetExtendedStyle(dwStyle);     //重新设置