一个基于Dialog迷你型应用程序,我加入一按钮和一个listctrl(ID:IDC_LIST_DATA),在MyDlg类中我加入了CListCtrl* plistdata;
在MyDlg的OnPaint() 中:
CListCtrl* plistdata=new CListCtrl;
plistdata->Create(WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT|LVS_NOSORTHEADER|LVS_EDITLABELS, 
   CRect(390,260,900,560),this,IDC_LIST_DATA);
。。//建列语句
以上一切正常运行并成功建立了想要的ListCtrl控件
但我在按钮的BN_CLICKED事件响应函数中加了2行:
plistdata->InsertItem(&lvItem);
plistdata->SetItemText(0,0,"hh");
运行出现非法操作,望各位大虾指导(lvItem 是我定义好的LV_ITEM变量以在构造函数中初始化)

解决方案 »

  1.   

    先执行:
    plistdata->InsertColumn(0,"条目1");
    plistdata->InsertColumn(1,"条目2"); 
    // 等...
    // 然后就可以添加了
    plistdata->InsertItem(&lvItem);
    plistdata->SetItemText(0,0,"hh");
      

  2.   

    楼上的朋友,我在create后面建列语句就有plistdata->InsertColumn(0,"条目1");
    plistdata->InsertColumn(1,"条目2"); 奇怪的是把plistdata->InsertItem(&lvItem);
    plistdata->SetItemText(0,0,"hh");紧跟在后面可以,放在按钮触发函数中就有问题,难倒我了
      

  3.   

    在MyDlg的OnPaint() 中:
    CListCtrl* plistdata=new CListCtrl;
    plistdata->Create(WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT|LVS_NOSORTHEADER|LVS_EDITLABELS, 
       CRect(390,260,900,560),this,IDC_LIST_DATA);
    把CListCtrl* plistdata=new CListCtrl;这一句去掉CListCtrl* 改为plistdata=new CListCtrl;
      

  4.   

    你在OnPaint()里又创建了一个局部变量plistdata,而在按钮触发函数中使用的却是全局变量plistdata,而全局变量并没有create:)
      

  5.   

    最好到OnInitDialog()中创建
    BOOL CMyDlg::OnInitDialog()
    {
        plistdata=new CListCtrl;
    plistdata->Create(WS_CHILD|WS_VISIBLE|WS_BORDER|LVS_REPORT|LVS_NOSORTHEADER|LVS_EDITLABELS, 
       CRect(390,260,900,560),this,IDC_LIST_DATA);
       return TRUE;
    }
      

  6.   

    在OnPaint()里面new一个,而且也不delete,这.... ,让我怎么说你呢?
    因为一般情况下,OnPaint()函数会被系统多次调用,这样每一次调用都new一个新的列表控件,就算不考虑其他内存泄漏之类的问题,你添加的item也不会进入同一个列表控件里面。给你的CMyDlg类增加一个成员变量
    CListCtrl m_wndListCtrl ;
    在CMyDlg的OnCreate函数里面
    m_wndListCtrl.Create(...); 
    在按钮触发函数中添加item.