CListCtrl mit CEdit abgeleiteter Klasse editieren



  • Hallo zusammen,
    Wie die Überschrift schon sagt möchte ich mit einem Steuerelement das von CEdit abgeleitet ist den Eintrag in einer von CListCtrl abgeleiteten Klasse editieren.

    Das Editfeld erstellt eigenständig beim Initialisieren 5 Editfelder die es darüber legt.
    Wenn ich dieses Editfeld in einem Dialog instanziere funktioniert dies ohne Störungen. Wenn ich allerdings Versuche eine Instanz über das Label des CListCtrl zu legen bekomme ich den Fehler "unknown software exception 0x80000003" beim Aufrufen von Create(), obwohl ich Create() nicht überschrieben habe funktioniert es nicht.
    Beim kompletten Durchsteppen im Debugger ist mir aufgefallen das beim Aufrufen von ::CreateWindowEx() dieser Fehler auftritt.

    Ich habe dann versuchsweise ein normales CEdit verwendet und da hat es geklappt.
    Außerdem ist mir aufgefallen, daß das Window-Handle (hWnd) NULL ist, kann das vielleicht daran liegen?

    CIPListEdit* CIPListCtrl::EditItem(int nItem, int nSubItem)
    {
    
    	CRect		rect;
    	int		offset		=	0;
    	DWORD		dwStyle		=	0;
    	CIPListEdit	*lpIPListEdit	=	new CIPListEdit;
    
    	if(!EnsureVisible(nItem, TRUE))
    	{ 
    		return NULL;	
    	}
    
    	GetSubItemRect(nItem, nSubItem, LVIR_BOUNDS, rect);
    	// Now scroll if we need to expose the column
    	CRect rcClient;
    	GetClientRect(rcClient);
    	if( offset + rect.left < 0 || offset + rect.left > rcClient.right )
    	{
    		CSize size(offset + rect.left,0);		
    		Scroll(size);
    		rect.left -= size.cx;
    	}
    	rect.left += offset;	
    	rect.right = rect.left + GetColumnWidth(nSubItem);
    	if(rect.right > rcClient.right) 
    	   rect.right = rcClient.right;
    
    	dwStyle |= WS_BORDER | WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL;
    
    #define IDC_EDITCTRL 0x1234
    	lpIPListEdit->Create(dwStyle, rect, this, IDC_EDITCTRL);	
    	lpIPListEdit->SetItem(nItem, nSubItem);
    	lpIPListEdit->SetWindowText(GetItemText(nItem, nSubItem));
    
    	return lpIPListEdit;
    }
    

    Wenn jemand ne Idee hat, was es sein könnte 🙂 bitte posten


  • Mod

    Reagiere doch ganz normal auf LVN_BEGINLABELEDIT und besorge Dir das Edit Control mit LVM_GETEDITCONTROL (CListCtrl::GetEditControl), dann kanst Du es ganz einfach wie gewohnt subclassen!


Anmelden zum Antworten