CListCtrl => Sortierpfeile wie beim Explorer (solved)



  • bei mir geht Möglichkeit 1 auch nicht.



  • hehehe..

    y00...das war der Versuch den ich startete unter Zuhilfename des Links von Codeguru von Dir. Waren wohl auch einige Fehlerchen drin dort...

    Irgendwelche Vorschläge? ^^



  • Ich habe bei codeguru ein Bsp Projekt runtergeladen, bei dem alles gefunzt hat. Ist aber ziemlich komplex.

    Ich glaube, dass das Problem bei den Flags liegt.

    Deine 2. möglichkeit ist mir auf jeden Fall zu lange.



  • yopyop

    habe die codeguru version nochmal überarbeitet und nun auch zum laufen bekommen. fehlt nur noch, daß die überschriften nicht korrekt ausgelesen werden(zeigerproblem) und das die graphik links ist. daran werde ich mich morgen machen, obwohl mir die graphik links gut gefällt.

    poste dann morgen mal das ergebnis



  • Ja bitte das wäre nett 🙂



  • So wie angedroht kommt nun meine Methode:

    void CBilView::setListCtrlHeaderBitmap( CListCtrl* pList, int iColumn, BOOL bUpDown )
    {
    	HINSTANCE hInst = AfxGetInstanceHandle();
    	HBITMAP hBitmap = NULL;
    	HD_ITEM hditem;
    
    	CString strText = "";
    
    	CWnd * pChild = pList->GetWindow( GW_CHILD ) ;
        if( pChild == NULL )
    	{
    		return ;
    	}
        ASSERT_VALID(pChild) ;
    
    	// Bitmap laden
    	if( bUpDown == TRUE )
    	{
    		hBitmap = ::LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP_ARR_UP));
    	}
    	else
    	{
    		hBitmap = ::LoadBitmap(hInst,MAKEINTRESOURCE(IDB_BITMAP_ARR_DOWN));
    	}
    
    	// HeaderCtrl auf ListCtrl holen
    	CHeaderCtrl* pListHeader = pList->GetHeaderCtrl();
    
    	// Spaltenüberschrift auslesen
        char szText[256] ;
        memset( &hditem, 0, sizeof hditem ) ;
        hditem.mask = HDI_TEXT ;
        hditem.pszText = szText ;
        hditem.cchTextMax = sizeof szText ;
        pChild->SendMessage( HDM_GETITEM, iColumn, (LPARAM)&hditem );
    	strText = szText;
    
    	// Spaltenüberschrift und Bitmap setzen
    	hditem.mask = HDI_FORMAT;
    	BOOL bRes = pListHeader->GetItem( iColumn, &hditem );
    	hditem.mask = HDI_TEXT | HDI_FORMAT | HDI_BITMAP;
    	hditem.fmt |= HDF_BITMAP;
    	hditem.hbm = hBitmap;
    	hditem.pszText = strText.GetBuffer(strText.GetLength());
    	hditem.cchTextMax = strText.GetLength();
    	bRes = pListHeader->SetItem( iColumn, &hditem );
    
    	// Reset der übrigen Spalten
    	int iCount = pListHeader->GetItemCount();
    
    	for( int i=0; i<iCount; i++ )
    	{
    		if( i != iColumn )
    		{
    			// Spaltenüberschrift auslesen
    			szText[256] ;
    			memset( &hditem, 0, sizeof hditem ) ;
    			hditem.mask = HDI_TEXT ;
    			hditem.pszText = szText ;
    			hditem.cchTextMax = sizeof szText ;
    			pChild->SendMessage( HDM_GETITEM, i, (LPARAM)&hditem );
    			strText = szText;
    
    			// Spaltenüberschrift setzen
    			hditem.mask = HDI_FORMAT;
    			bRes = pListHeader->GetItem( i, &hditem );
    			hditem.mask = HDI_FORMAT;
    			hditem.fmt &= ~HDF_BITMAP;
    			hditem.pszText = strText.GetBuffer(strText.GetLength());
    			hditem.cchTextMax = strText.GetLength();
    			bRes = pListHeader->SetItem( i, &hditem );
    		}
    	}
    
    	return;
    }
    

    Einfach 2 Bitmaps erstellen und die dann in der Methode laden. Könnte man sicherlich noch als Param übergeben oder sowas.

    Ein Problem, daß ich noch habe ist bei Auslesen der Spaltenüberschriften:
    Ich kriege es nicht anders als mit der SendMessage hin...

    Sollte das nicht auch mit CHeaderCtrl::GetItem direkt gehen?

    Naja......soweit funzt es erstmal.



  • Ja das funzt ja wirklich!

    Das mit SendMessage kannst du auch mit GetItem machen. Selber effekt.



  • Jover schrieb:

    Ja das funzt ja wirklich!

    Das mit SendMessage kannst du auch mit GetItem machen. Selber effekt.

    Schon versucht....Mit GetItem() wollte er immer nicht...

    kA warum

    [edit]
    anstatt des bool als 3. parameter bietet es sich sicherlich für allgemeine lösungen an, nen HBITMAP zu übergeben.
    [/edit]



  • Bei mir gehts schon mit GetItem



  • Jover schrieb:

    Bei mir gehts schon mit GetItem

    humm...

    magst mal posten?

    ich glaube bald meine entwicklungsumgebung spinnt ein bissel....



  • void CMyView::SetBitmapItem(int nCol, int nPriority, CListCtrl* pList)
    {
    		ASSERT((nPriority == 1) || (nPriority) == 2
    || (nPriority == 3));
    
    		HINSTANCE hInst = AfxGetInstanceHandle(); 
    		HBITMAP hBitmap = NULL; 
    		HD_ITEM hditem; 
    
    		CString strText = ""; 
    
    		CWnd * pChild = pList->GetWindow( GW_CHILD ) ; 
    		if( pChild == NULL ) 
    		{ 
    			return ; 
    		} 
    		ASSERT_VALID(pChild) ;
    
    		switch(nPriority)
    		{
    		case 1:
    			hBitmap = ::LoadBitmap(hInst,MAKEINTRESOURCE(IDB_1)); 
    			break;
    		case 2:
    			hBitmap = ::LoadBitmap(hInst,MAKEINTRESOURCE(IDB_2)); 
    			break;
    		case 3:
    			hBitmap = ::LoadBitmap(hInst,MAKEINTRESOURCE(IDB_3)); 
    			break;
    		default:
    			ASSERT(FALSE);
    			break;
    		}
    
    		CHeaderCtrl* pListHeader = pList->GetHeaderCtrl();
    
    		char szText[256];
    		memset(&hditem, 0, sizeof(hditem));
    		hditem.mask = HDI_TEXT;
    		hditem.pszText = szText;
    		hditem.cchTextMax = sizeof(szText);
    		//pChild->SendMessage(HDM_GETITEM, nCol, (WPARAM)&hditem);
    		pListHeader->GetItem(nCol, &hditem);
    		strText = szText;
    
    		hditem.mask = HDI_FORMAT;
    		BOOL bRes = pListHeader->GetItem(nCol, &hditem);
    		hditem.mask = HDI_TEXT | HDI_FORMAT | HDI_BITMAP;
    		hditem.fmt |= HDF_BITMAP;
    		hditem.hbm = hBitmap;
    		hditem.pszText = strText.GetBuffer(strText.GetLength());
    		hditem.cchTextMax = strText.GetLength();
    		bRes = pListHeader->SetItem(nCol, &hditem);
    }
    

    Bei mir its ein bisschen anders.
    Es wird aus 3 Bitmaps ausgewählt und das entfernen der Bitmaps habe ich in ne eigene Funktion gepackt


Anmelden zum Antworten