我在一个对话框里加了一个tab控件,在控件上放了一个list ctronal用m_nlistLSDHDJ->GetSafeHwnd()时,总返回NULL是什么原因?

解决方案 »

  1.   

    说明你调用时该控件还没创建出来(DoModal前),或者已经被销毁了(DoModal后)
      

  2.   

    应该不会, 我是等所有窗口都显示出来了以后才去调用的,(我用了一个button 按下去就调用一次)
      

  3.   

    你放在界面上的控件和m_nlistLSDHDJ关联了么?
      

  4.   

    这个debug进去看看,估计是那个变量为空的问题。。
      

  5.   


    我没有放控件CListCtrl*  m_nlistLSDHDJ;
    /************************************************************************************/
    // @FUNCTION NAME: void CLCDDlg::Init_list_ctrl(void) 
    // @               initialization the list control 
    // @RETURN: 
    //
    //
    //
    /************************************************************************************/void CLCDDlg::Init_list_ctrl(void) 
    {

    try 
    {
    #if 0 
    CRect rect_nlist(10,150,700,350);
    this->GetClientRect(&rect_nlist);
    rect_nlist.top=10;
    rect_nlist.left+=700;
    rect_nlist.right-=10;
    rect_nlist.bottom=500;

    #else
    // full width 
    CRect rect_nlist(10,150,500,350);
    this->GetClientRect(&rect_nlist);
    rect_nlist.top=10;
    rect_nlist.left+=500;
    rect_nlist.right-=10;
    rect_nlist.bottom=500;
    #endif





    this->m_nlistLSDHDJ=new CListCtrl;
    m_nlistLSDHDJ->Create(WS_CHILD|WS_VISIBLE|LVS_REPORT|WS_BORDER,rect_nlist, this,ID_listctr);
    this->m_nlistLSDHDJ->ModifyStyle(LVS_EDITLABELS, 0L); //禁止标题编辑
    m_nlistLSDHDJ->ModifyStyle(0L, LVS_REPORT); //设为Report类型
    m_nlistLSDHDJ->ModifyStyle(0L, LVS_SHOWSELALWAYS); //始终高亮度被选中的表项
    m_nlistLSDHDJ->ModifyStyle(0L, LVS_NOSORTHEADER);
    m_nlistLSDHDJ->ModifyStyle( LVS_OWNERDRAWFIXED,0L);
    m_nlistLSDHDJ->SetExtendedStyle( LVS_EX_FULLROWSELECT | //允许整行选中
    LVS_EX_GRIDLINES | //画出网格线
    LVS_EX_FLATSB //扁平风格的滚动条
    );
    CString str;
    int i=0;
    //insert column 
    m_nlistLSDHDJ->InsertColumn( i, "时间" );
    m_nlistLSDHDJ->InsertColumn( 1, "LINE NUMBER");
    m_nlistLSDHDJ->InsertColumn( 2,  "命令类型" );
    m_nlistLSDHDJ->InsertColumn( 3, "对应的CIS" );
    m_nlistLSDHDJ->InsertColumn( 4, "hgg hg" );

    // 2、插入1行
    // m_nlistLSDHDJ->InsertItem(0,"");


    // 3、调整列宽
    RECT rect2;
    m_nlistLSDHDJ->GetWindowRect(&rect2);
    int wid = rect2.right - rect2.left;

    for( i=0; i<5; i++ )
    {
    m_nlistLSDHDJ->SetItemText(0,i,"");
    m_nlistLSDHDJ->SetColumnWidth( i, wid/5 );
    }

    m_nlistLSDHDJ->Invalidate(false);


    // m_tree.SetItemText(hItem,"root");
    }
    catch(...)
    {


    }}
      

  6.   

    this->m_nlistLSDHDJ=new CListCtrl; 
    如果m_nlistLSDHDJ已经和你放在Dlg上的控件关联,就不用再new了... - -#
      

  7.   

    不需要new,直接create就可以了.
      

  8.   

    这样不可以呀, 去掉new后连list 都没有了. 到低是什么原因呢? 我直接create在对话框是好的,放在子对话框上就不行了?
      

  9.   

    m_nlistLSDHDJ->GetSafeHwnd()  中的m_nlistLSDHDJ 在初始化的时候是有值的, 但跳到下面的函数就没有了, class CMyTabPage1 : public CDialog
    {
    // Construction
    public:
    CMyTabPage1(CWnd* pParent = NULL);   // standard constructor
    void CMyTabPage1::update_list_control(int length, UCHAR *get_data_buffer,LPTSTR *get_item  ); 
    void Init_list_ctrl(void);private:}
    /************************************************************************************/
    // @FUNCTION NAME: void CLCDDlg::update_list_ctrl(char *insert_content, LPTSTR  insert_cmd_ID ) 
    // @               update the content  of control list 
    // @RETURN: 
    //
    //
    //
    /************************************************************************************/void CMyTabPage1::load_list_ctrl(char *insert_content, LPTSTR  insert_cmd_ID ) 
    {

    char line_number[20]; 
    CString         str; 
    CTime t=0;
    /*get local time */
    t=t.GetCurrentTime();
    str=t.Format("%H:%M:%S");try{
    /**********************typing characters into the list control****************************/
    if(m_nlistLSDHDJ->GetSafeHwnd())
    {

    int nCount  = m_nlistLSDHDJ->GetItemCount();

    int nItem   = m_nlistLSDHDJ->InsertItem(nCount, str);//insert time 

    int total_col    = m_nlistLSDHDJ->GetCountPerPage(); itoa(nCount,line_number,10);


    m_nlistLSDHDJ->SetItemText(nItem, 1,  line_number);
    m_nlistLSDHDJ->SetItemText(nItem, 2,  insert_content );
    m_nlistLSDHDJ->SetItemText(nItem, 3,  insert_cmd_ID); if(nItem+total_col<=nCount)/*refresh the last page after the screen is full */
    {
    m_nlistLSDHDJ->EnsureVisible((nItem+total_col),TRUE);  
    }
    else 
    {
    m_nlistLSDHDJ->EnsureVisible(nItem-1, TRUE);
    }
    }

    }
    catch(...)
    { }}
      

  10.   

    你的 CListCtrl*  m_nlistLSDHDJ; 是哪个对话框类的成员变量啊?
    CLCDDlg 还是 CMyTabPage1 的啊?
    我认为你在这两个对话框中都有一个 ListCtrl,变量名都是m_nlistLSDHDJ。
    但是在CLCDDlg中的被初始化了,而CMyTabPage1里的没有!
      

  11.   

    我搜过了只有MyTabPage1.cpp一个
    Searching for 'm_nlistLSDHDJ'...
    D:\Lcd-2\LCDDlg.cpp(57):    /// m_nlistLSDHDJ = NULL;
    D:\Lcd-2\MyTabPage1.cpp(137): if(m_nlistLSDHDJ->GetSafeHwnd())
    D:\Lcd-2\MyTabPage1.cpp(142): int nCount  = m_nlistLSDHDJ->GetItemCount();
    D:\Lcd-2\MyTabPage1.cpp(144): int nItem   = m_nlistLSDHDJ->InsertItem(nCount, str);//insert time 
    D:\Lcd-2\MyTabPage1.cpp(146): int total_col    = m_nlistLSDHDJ->GetCountPerPage();
    D:\Lcd-2\MyTabPage1.cpp(151): m_nlistLSDHDJ->SetItemText(nItem, 1,  line_number);
    D:\Lcd-2\MyTabPage1.cpp(152): m_nlistLSDHDJ->SetItemText(nItem, 2,  insert_content );
    D:\Lcd-2\MyTabPage1.cpp(153): m_nlistLSDHDJ->SetItemText(nItem, 3,  insert_cmd_ID);
    D:\Lcd-2\MyTabPage1.cpp(157): m_nlistLSDHDJ->EnsureVisible((nItem+total_col),TRUE);  
    D:\Lcd-2\MyTabPage1.cpp(161): m_nlistLSDHDJ->EnsureVisible(nItem-1, TRUE);
    D:\Lcd-2\MyTabPage1.cpp(213):     this-> m_nlistLSDHDJ=new CListCtrl;
    D:\Lcd-2\MyTabPage1.cpp(214): m_nlistLSDHDJ->Create(WS_CHILD|WS_VISIBLE|LVS_REPORT|WS_BORDER,rect_nlist, this,ID_listctr);
    D:\Lcd-2\MyTabPage1.cpp(215): this->m_nlistLSDHDJ->ModifyStyle(LVS_EDITLABELS, 0L); //禁止标题编辑
    D:\Lcd-2\MyTabPage1.cpp(216): m_nlistLSDHDJ->ModifyStyle(0L, LVS_REPORT); //设为Report类型
    D:\Lcd-2\MyTabPage1.cpp(217): m_nlistLSDHDJ->ModifyStyle(0L, LVS_SHOWSELALWAYS); //始终高亮度被选中的表项
    D:\Lcd-2\MyTabPage1.cpp(218): m_nlistLSDHDJ->ModifyStyle(0L, LVS_NOSORTHEADER);
    D:\Lcd-2\MyTabPage1.cpp(219): m_nlistLSDHDJ->ModifyStyle( LVS_OWNERDRAWFIXED,0L);
    D:\Lcd-2\MyTabPage1.cpp(220): m_nlistLSDHDJ->SetExtendedStyle( LVS_EX_FULLROWSELECT | //允许整行选中
    D:\Lcd-2\MyTabPage1.cpp(227): m_nlistLSDHDJ->InsertColumn( i, "时间" );
    D:\Lcd-2\MyTabPage1.cpp(228): m_nlistLSDHDJ->InsertColumn( 1, "LINE NUMBER");
    D:\Lcd-2\MyTabPage1.cpp(229): m_nlistLSDHDJ->InsertColumn( 2,  "命令类型" );
    D:\Lcd-2\MyTabPage1.cpp(230): m_nlistLSDHDJ->InsertColumn( 3, "对应的CIS" );
    D:\Lcd-2\MyTabPage1.cpp(231): m_nlistLSDHDJ->InsertColumn( 4, "hgg hg" );
    D:\Lcd-2\MyTabPage1.cpp(234): // m_nlistLSDHDJ->InsertItem(0,"");
    D:\Lcd-2\MyTabPage1.cpp(239): m_nlistLSDHDJ->GetWindowRect(&rect2);
    D:\Lcd-2\MyTabPage1.cpp(244): m_nlistLSDHDJ->SetItemText(0,i,"");
    D:\Lcd-2\MyTabPage1.cpp(245): m_nlistLSDHDJ->SetColumnWidth( i, wid/5 );
    D:\Lcd-2\MyTabPage1.cpp(248): m_nlistLSDHDJ->Invalidate(false);
    D:\Lcd-2\MyTabPage1.h(57):  CListCtrl*  m_nlistLSDHDJ;
    29 occurrence(s) have been found.
      

  12.   

    D:\Lcd-2\MyTabPage1.cpp(137): if(m_nlistLSDHDJ->GetSafeHwnd()) D:\Lcd-2\MyTabPage1.cpp(213):     this-> m_nlistLSDHDJ=new CListCtrl; 
    D:\Lcd-2\MyTabPage1.cpp(214): m_nlistLSDHDJ->Create(WS_CHILD ¦WS_VISIBLE ¦LVS_REPORT ¦WS_BORDER,rect_nlist, this,ID_listctr); 你调用m_nlistLSDHDJ->GetSafeHwnd()时这个控件还没有被创建呢...当然为NULL!
      

  13.   

    从代码上看:
    void CLCDDlg::Init_list_ctrl(void) 
    void CMyTabPage1::load_list_ctrl(char *insert_content, LPTSTR  insert_cmd_ID ) 
    显然这两个函数是不同类的成员函数,那么,m_nlistLSDHDJ到底是哪个类的成员变量?上面这两个类(CLCDDlg、CMyTabPage1)是什么关系?
      

  14.   

    另外,从你的查找结果来看,
    D:\Lcd-2\MyTabPage1.h(57): CListCtrl*  m_nlistLSDHDJ;
    怎么又会在
    D:\Lcd-2\LCDDlg.cpp(57):    /// m_nlistLSDHDJ = NULL; 
    m_nlistLSDHDJ是不是外部变量啊。然后每个cpp文件再#include "MyTabPage1.h"
    如果这样,那么你应该在声明的时候加上extern,否则,你看看不同文件中的m_nlistLSDHDJ的地址,就知道不是同一个变量了。