我写程序的时候遇到一个问题:
    一个CListCtrl控件,我为这个控件生成了一个类CMyList,然后我定义了一个对象;
    CMyList myList;
    调试的时候我发现:
    myList的m_hWnd = 0x00000000;
    我不知道这是为什么
    
    我觉得myList这个对象应该是已经和那个控件相关联了,但是从调试的结果看的话,好象实际上是没有关联的,这是为什么,希望您能帮帮我,我已经调了2天了,用尽了办法。

解决方案 »

  1.   

    DDX_Control(pDX, xxx, xxx);有没有关联?
    对话框的OnInitDialog()里面有没有执行
    CDialog::OnInitDialog();来初始化子窗口
      

  2.   

    http://www.ddj.com/dept/windows/184416461
      

  3.   

    这个类的头文件和源文件都很小,帮忙看下,没有DDX_Control(pDX, xxx, xxx);
    也没有OnInitDialog(),而且这个类不能响应WM_INITDIALOG消息,它的消息响应里面根本就没有这个消息class CSrvList : public CListCtrl
    {
    // Construction
    public:
    CSrvList();// Attributes
    public:// Operations
    public:// Overrides
    // ClassWizard generated virtual function overrides
    //{{AFX_VIRTUAL(CSrvList)
    //}}AFX_VIRTUAL
    public:
    void ShowDirectory();
    virtual ~CSrvList(); // Generated message map functions
    protected:
    //{{AFX_MSG(CSrvList)
    // NOTE - the ClassWizard will add and remove member functions here.
    //}}AFX_MSG DECLARE_MESSAGE_MAP()
    };///////////////////////////////////////////////////////////////////////////////{{AFX_INSERT_LOCATION}}
    // Microsoft Visual C++ will insert additional declarations immediately before the previous line.#endif // !defined(AFX_SRVLIST_H__073866E6_5853_43F3_B6C1_EE2EA941213E__INCLUDED_)下面是源文件:
    // SrvList.cpp : implementation file
    //#include "stdafx.h"
    #include "SmartFtp.h"
    #include "SrvList.h"#ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif/////////////////////////////////////////////////////////////////////////////
    // CSrvListCSrvList::CSrvList()
    {
    }CSrvList::~CSrvList()
    {
    }
    BEGIN_MESSAGE_MAP(CSrvList, CListCtrl)
    //{{AFX_MSG_MAP(CSrvList)
    // NOTE - the ClassWizard will add and remove mapping macros here.
    //}}AFX_MSG_MAP
    END_MESSAGE_MAP()/////////////////////////////////////////////////////////////////////////////
    // CSrvList message handlers
      

  4.   

    to:hurryboylqs(中山三郎) 
    我在CSrvList类里自己定义了一个ShowDirectory()
    然后我在CMainFrame里调用这个函数,即:m_srvList.ShowDirectory()
    我就是在这里设的断点,然后发现句柄为空
      

  5.   

    类里是不是应该有  DoDataExchange(DDX* pDX) 啊然后在里面关联DDX_Control(pDX, xxx, xxx);
      

  6.   

    to:prettyll_DT() 
    已经包含了
      

  7.   

    to:saylerboxer(精怪) 
    这个类是有DoDataExchange(DDX* pDX)
    但是我现在我定义是为一个CListCtrl控件定义的这个类,这个控件上没有其他子控件了,
    DoDataExchange函数好象对这个类没有太大的用处吧
      

  8.   

    这说明,你没有为你的这个对象指定相应的资源。你要把资源中相应的窗口赋给它的m_hWnd,如你的控件的在对话框中的资源ID是IDC_LIST,那么你可以为你的类增加一个构造函数
    CMyList::CMyList(HWND hWnd)
    {
         m_hWnd = hWnd;
    }
    在调用时:
    HWND hWnd = ::GetDlgItem(m_hWnd,IDC_LIST);   //注意,这是在控件的对话框容器中调用的
    CMyList(hWnd);   //这样构造就可以了
    试一下吧
      

  9.   

    CMainFrame里调用这个函数,即:m_srvList.ShowDirectory()??
    你的ListCtrl是动态创建的,还是拖个控件到其中一个对话框?
    如果只是定义了一个对象,那你要动态创建,m_srvList.Create(....)
    如果不是,那你要确保子窗口已建立,再调用
      

  10.   

    to:wzh0591(企鹅)
    十分感谢你您的建议!让我清楚了许多! 谢谢!
    CMyList我按照你的方法做了,但是还有一个小问题。
    我先把我的程序的脉络说一下:
    我写的是FTP客户端,在CMainFrame里我产生了一个连接线程,然后获得服务器的文件,这个时候我要通知我CListCtrl显示服务器的文件,但是我的容纳CListCtrl的容器还没有和我在资源管理器中画的DialogBar相关联,您的方法已经帮我解决了CListList和CListCtrl控件相关联了。
    也就是说:
       CMainFrame----①---->CSrvView()-----②---->CListCtrl
    您帮我解决了②,现在我只有①没解决了。
    怎么才能在CMainFrame里获得容器的hWnd?
    调用HWND hWnd = ::GetDlgItem(m_hWnd,IDC_DIALOGBAR1)获得的hWnd为0,也就是没法获得
    只要得到了容器的hWnd,我就可以按照你的方法,赋给CSrvView,这样①就解决了
    拜托您再帮帮我,今天早上我7:30起床调到现在,没进展,刚才得到您的提示我才明白所以
      

  11.   

    to:seu07201213(【东南】〖汪洋中的一片叶子〗) 
    谢谢您的回复
    我的资源全是在资源管理器里拖的控件,也就是静态创建的
    我想知道,如果是静态创建的话,怎么将CSrvView对象和我的控件关联起来
      

  12.   

    你是摆放在DialogBar的吧?]
    DialogBar在哪里创建的,CMainFrame里?CxxView里?在CxxView里的话,
    CMainFrame中先GetActiveView()得到视图指针,然后通过视图指针得到DialogBar指针,最后即可访问CListCtrl
      

  13.   

    然后我在CMainFrame里调用这个函数,即:m_srvList.ShowDirectory()
    我就是在这里设的断点,然后发现句柄为空
    ---------------------------------------------------------------
    这就是你的断点设错了啊,你是在CMainFrame里的哪个成员函数里调用ShowDirectory()???m_srvList的对象构造好了没?也就是用Create生成了没?还是在资源编辑器编辑的?我试过了,没你说的那种问题!只要你的对象已经构造好,它的m_hWmd成员是自动获得一个跟该窗口关联的句柄值的呀!当该窗口销毁时句柄也会自动失效句柄值变为0。
      

  14.   

    to:seu07201213(【东南】〖汪洋中的一片叶子〗) 
    我将我程序的主VIEW窗口使用CSplitter切成了4份
    我的DialogBar在左上的小窗口里,也就是(0,0)窗口
    我是这么获取DialogBar的m_hWnd的,但是获取失败了 HWND hViewWnd = ((CSmartFtpView*)m_split.GetPane(0,0))->m_hWnd;
    HWND hWnd = ::GetDlgItem(hViewWnd,IDD_SRV);
    CSrvView srvView(hWnd);
    srvView.ShowDirectory();
    其中m_split为一个CSplitterWnd对象,
        IDD_SRV就是我的DialogBar的ID,hViewWnd是获取的正确值,但是hWnd还是0x00000000
    我不懂为什么我还是获取不到DialogBar的hWnd
    您能帮我想想看吗,拜托了
      

  15.   

    to:hurryboylqs(中山三郎)
    我是在响应一个框架上的Button的时候调用的m_srvList.ShowDirectory()
    这个时候m_srvList应该是已经构造好了的
    我的CListCtrl控件是在资源编辑器里直接拖的控件,也就是静态创建的
    然后为它生成了一个CListCtrl类的派生类CSrvList类我现在是通过CMainFrame----①---->CSrvView()-----②---->CListCtrl
    从框架中间接使用CListCtrl的,现在②已经可以了,也就是我可以从CSrvView中使用CListCtrl
    但是,①还是不行,也就是我没法从框架中使用CSrvView。
    我的CSrvView的对象没有跟我的容器DialogBar相关联。
      

  16.   

    请按照http://support.microsoft.com/default.aspx?scid=kb;EN-US;q185672的方式生成
    DialogBar
    然后获取DialogBar句柄:
    CMainFrame *pMF =(CMainFrame *) AfxGetMainWnd();
    HWND hWnd = pMF->m_myDlgBar.m_hWnd;
      

  17.   

    to:seu07201213(【东南】〖汪洋中的一片叶子〗)
    谢谢您帮我找的这份资料  我仔细看了  有点不适合我的程序
    因为我的主View窗口被拆分了,我无法在CMainFrame::OnCreate函数中通过资料里的创建方式来创建我的DialogBar,会报错。
      

  18.   

    到现在,你都还没说你的DialogBar到底在哪创建的?
    说不清楚的话,发到我邮箱里,帮你看看:[email protected]
      

  19.   

    to:seu07201213(【东南】〖汪洋中的一片叶子〗) 
    已经发到您油箱里了
      

  20.   

    能不能把代码给我发一下啊,谢了。
    [email protected]
      

  21.   

    我已经从seu07201213(【东南】〖汪洋中的一片叶子〗)那里得到了很好的解决方案,感谢大家的帮助,十分感谢!