我从CEdit派生一个新的CMyEdit,OnChar设一个定时器,然后在OnTimer里面读出编辑框里面的内容。我想把读出的内容str显示到一个ListCtrl控件(控件变量m_ListCtrl)中,请问大家该怎样写呢?我下面程序里写的m_ListCtrl.InsertItem()是错误的:'m_ListCtrl' : undeclared identifier.谢谢大家!// CMyEdit message handlers
void CMyEdit::OnTimer(UINT_PTR nIDEvent)
{
// TODO: Add your message handler code here and/or call default
CString str;
int count = 0;
KillTimer(1);
if(nIDEvent == 1)
{
GetWindowText(str);                             //读出编辑框内容
SetWindowText(_T(""));                          //清空编辑框
MessageBox((LPCTSTR)(str));                     //消息框可以显示          //m_ListCtrl.InsertItem(count++, (LPCTSTR)(str));  错误的
}
CEdit::OnTimer(nIDEvent);
}void CMyEdit::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// TODO: Add your message handler code here and/or call default
SetTimer(1, 1000, NULL);
CEdit::OnChar(nChar, nRepCnt, nFlags);
}

解决方案 »

  1.   

    m_ListCtrl在那里定义的?类型?
      

  2.   

    你的本意是想自己写1个带编辑功能的ListCtrl控件 吧.
    不是每写1个字就显示在listctrl上.而是当用户双击时,你把Cedit控件移动到 该位置.并显示.
    用户输入时输入的字输入在edit控件上,当edit控件失去焦点时,再去出其内容填到listctrl上
      

  3.   

    基本上不用关心LZ是什么目的,根据错误提示就知道是变量m_ListCtrl的问题,这个变量是你在CMyEdit类中定义的变量,请问你如何给这个变量初始化的?
    LZ应该是想将对话框(假如)里的CListCtrl控件来显示那些信息吧?
    你在CMyEdit中定义一个CListCtrl指针(不是对象),将对话框中CListCtrl的地址传给CMyEdit中的m_ListCtrl变量,然后你再m_ListCtrl->InsertItem(count++, (LPCTSTR)(str));就没有问题了
      

  4.   

    m_ListCtrl定义成指针,然后让上层窗口将CListCtrl的地址传进来调用就可以了
    m_ListCtrl->InsertItem(count++, (LPCTSTR)(str)); 
      

  5.   

    未声明变量: 你看你是否包含了头文件,要么就是拼写错误。 (插播一段广告,我发现有些控件变量在VC6中是不给提示的,只要你的代码中有些其它错误,它就会提示控件未声明变量. 而用VS08就没有问题)//m_ListCtrl.InsertItem(count++, (LPCTSTR)(str)); 错误的
    肯定错了啊, 你每次进入OnTimer函数,都出来个 int cout = 0。  cout++有什么意义呢? 还是弄个静态变量吧
      

  6.   

    LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast<LPNMITEMACTIVATE>(pNMHDR);
    CRect rect;
    if (pNMItemActivate->iItem == -1 || pNMItemActivate->iSubItem == -1)
    {
    return;
    }//注意使用这个函数要给listctrl选上FullRowSelect(好像是这个单词)属性,否则得到的item不正确 
    GetSubItemRect(pNMItemActivate->iItem,pNMItemActivate->iSubItem,LVIR_BOUNDS,rect);//取得该列表格的举行范围
    if (m_Edit.m_hWnd == NULL)
    {
     m_Edit.Create(WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_MULTILINE,CRect(0,0,2,2), this, 1); //带边框
    }
    m_Edit.ShowWindow(SW_SHOW);
    m_nCurrentRow = pNMItemActivate->iItem;
    m_nCurrentColumn = pNMItemActivate->iSubItem;//记录下当前位置,因为当edit失去焦点时要把edit的内容填充到listctrl上
    m_Edit.MoveWindow(rect); 
    CString s1; 
    s1 = GetItemText(pNMItemActivate->iItem,pNMItemActivate->iSubItem); //如果listctrl该位置本来就有内容就读出
    m_Edit.SetWindowText(s1);
    m_Edit.SetFocus();
    m_Edit.SetSel(m_Edit.GetWindowTextLength(),m_Edit.GetWindowTextLength()); //设置光标到最后
    *pResult = 0;
    [/code]LRESULT  CMyListCtrl::OnEndEdit(WPARAM wParam,LPARAM lParam)
    {
    //自定义消息,这个消息是Cedit失去焦点时发过来的
    if (wParam == 0x2)
    {
    CString strText;
    m_Edit.GetWindowText(strText);
    SetItemText(m_nCurrentRow,m_nCurrentColumn,strText);//更新listctrl该位置的内容
    m_Edit.SetSel(0, -1);
    m_Edit.Clear();
    m_Edit.ShowWindow(SW_HIDE);
    }
    return 0;
    }void CMyListCtrlEdit::OnEnKillfocus()
    {
    // 你派生的Cedit响应 失去焦点的消息,紧传递自定义消息给listctrl就行了
             //这个编号 0x2你随意定
    ::PostMessage(GetParent()->m_hWnd,WM_ENDEDIT,0x2,0);
    }
    我要分........
      

  7.   


    真的太谢谢了!现在在赶东西,又不熟,所以问了很多很弱的问题。谢谢你的指点,谢谢大家!
    我是这样用的:

    CMFCControlDlg *dlg = (CMFCControlDlg*)AfxGetApp()->GetMainWnd();
    dlg->m_ListCtrl.InsertItem(0, (LPCTSTR)((str)));
      

  8.   

    代码缩进挺好的。 另外第二行str不需要括号