int CEditableList::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CListCtrl::OnCreate(lpCreateStruct) == -1)
return -1; //简历列表框上面的编辑框
m_listedit.Create(ES_AUTOHSCROLL|WS_CHILD|ES_LEFT|ES_WANTRETURN|WS_BORDER,CRect(10, 10, 100, 100), this , 2);
m_listedit.ShowWindow(SW_HIDE);
return 0;
}以上CEditableList是我写的继承于CListControl的类,为啥我运行的时候没有调用这个函数,不是说窗体建立的时候就会运行一次的吗?我把编辑控件建立在LISTCONTROL之上,是不是说LISTCONTROL就是它的父窗口,我之所以这么写,就是想THIS指的是编辑控件的父窗口LISTCONTROL。现在问题是为什么没有执行呢??

解决方案 »

  1.   

    你的CEditableList对象还没有创建窗口,自然收不到
      

  2.   


    CEditableList类所对应的控件窗口,也就是 List Ctrl 建立了吗?
      

  3.   

    LZ的控件对象是动态创建的还是通过DDX绑定的?动态创建即 CEditableList m_EditableList;
    m_EditableList.Create(...);
    这样才会触发 OnCreateDDX 的话只能在 PreSubclassWindow 这个虚函数里处理
      

  4.   

    自己创建的控件才会有WM_CREATE消息,对话框模板上的控件是对话框内部创建的,创建的时候还没有与你定义的控件类对象绑定,所以收不到WM_CREATE消息,也就不会执行OnCreate。你可以重载PreSubclassWindow函数来执行初始化操作。
      

  5.   

    是的,我是在主对话框的头文件里这样建立的:CEditableList m_listMessage;
    我不明白的是既然我没有create,那类里面的函数为什么都能用。我的listcontrol控件是从资源里拽出来创建的,这难道不算数吗?他的子类CEditableList现在各个函数我也在使用中,怎么说没create呢?子类和CLISTCONTROL类之间到底什么关系,我都糊涂了
      

  6.   

    补充:为什么VIEW类就可以直接运行OnCreate?
      

  7.   

    这说明你的控件是在对话框模板创建好之后通过DDX机制子类化上去的,子类化都是在窗口已经创建好之后才能进行,你的类当然不会收到WM_CREATE消息。有两种解决办法:
    1、不要把这个控件放在对话框模板上,把类定义成对话框类的成员变量,在OnInitDialog中用代码来Create你的控件,这时就能收到OnCreate调用。
    2、把OnCreate中的创建编辑框的代码转移到对话框的OnInitDialog中执行。