CListCtrl => Sortierpfeile wie beim Explorer (solved)
-
*schmunzelt*
Die Site kenne ich schon, doch dort blieb meine Suche erfolglos und wenn ich mir den Titel angucke wundert es mich auch weniger.
Ich habe gestern abend auch noch etwas gefunden, was aber leider nicht so gut klappt, da ich die Schriftart angepaßt habe in meiner Liste und die wieder geändert wird.
Hier mal dern Link für Interessierte:
http://www.wildcomputer.com/h2mfcdclistviewheaders.htm
-
*geliebtes Doppelpost*
-
So ich habe mir das mal angesehen und versucht und getan:
Fazit:
2 Methoden, die eher weniger laufen.Bei der hier zeigt er nix mehr an......Das Bitmap wird nicht geladen:
void CBilView::setListCtrlHeaderBitmap( CListCtrl* pList, int iColumn, BOOL bUpDown ) { CBitmap MyBitmap; MyBitmap.LoadBitmap(IDB_BITMAP_ARR_UP); CHeaderCtrl* pListHeader = pList->GetHeaderCtrl(); HD_ITEM hditem; hditem.mask = HDI_FORMAT; BOOL bRes = pListHeader->GetItem( iColumn, &hditem ); hditem.mask = HDI_BITMAP | HDI_FORMAT; hditem.fmt |= HDF_BITMAP; hditem.hbm = (HBITMAP)MyBitmap.GetSafeHandle(); bRes = pListHeader->SetItem( iColumn, &hditem ); return; }Bei der hier ist alles ganz nett und funktioniert auch, aber ich kann leider nicht wieder die eigentliche Font herstellen in der Spaltenüberschrift.
void CBilView::ListViewSetArrow( CListCtrl * pList, int nColumn, BOOL bReverse ) { ASSERT_VALID(pList) ; // // Find header // CWnd * pChild = pList->GetWindow( GW_CHILD ) ; if ( pChild == NULL ) return ; ASSERT_VALID(pChild) ; char ss[256] ; GetClassName( pChild->m_hWnd, ss, sizeof ss ) ; if ( 0 != _stricmp( ss, "SysHeader32" ) ) { return ; } // // Get width and height of selected item // HD_ITEM hdi ; memset( &hdi, 0, sizeof hdi ) ; hdi.mask = HDI_WIDTH ; pChild->SendMessage( HDM_GETITEM, nColumn, (LPARAM)&hdi ); int ww = hdi.cxy ; CRect rectClient ; ::GetClientRect( pChild->m_hWnd, &rectClient ) ; int hh = rectClient.Height() ; ASSERT( ww > 0 ) ; ASSERT( hh > 0 ) ; // // Get Text // char szText[256] ; memset( &hdi, 0, sizeof hdi ) ; hdi.mask = HDI_TEXT ; hdi.pszText = szText ; hdi.cchTextMax = sizeof szText ; pChild->SendMessage( HDM_GETITEM, nColumn, (LPARAM)&hdi ); // // Create bitmap // HDC hdcHeader = ::GetDC( pChild->m_hWnd ) ; HBITMAP hbitmap = CreateCompatibleBitmap( hdcHeader, ww, hh ) ; HDC hbitmapDC = CreateCompatibleDC( hdcHeader ) ; SelectObject( hbitmapDC, hbitmap ) ; HBRUSH hBrush = GetSysColorBrush( COLOR_BTNFACE ) ; HBRUSH hOldBrush = (HBRUSH)SelectObject( hbitmapDC, hBrush ) ; //HFONT hOldFont = (HFONT)SelectObject( hbitmapDC, GetStockObject(DEFAULT_GUI_FONT) ) ; HFONT hOldFont = (HFONT)SelectObject( hbitmapDC, GetStockObject(DEFAULT_PALETTE) ) ; //HFONT hOldFont = (HFONT)(CFont)::SelectObject(&m_MyFont); CRect rectBack(0,0,ww,hh) ; FillRect( hbitmapDC, &rectBack, hBrush ) ; if ( ww > 32 ) { CRect rectText(0,0,ww-32,hh) ; SetBkMode( hbitmapDC, TRANSPARENT ) ; DrawTextEx( hbitmapDC, szText, -1, rectText, DT_LEFT | DT_TOP | DT_SINGLELINE | DT_NOPREFIX | DT_END_ELLIPSIS, NULL ) ; } HPEN hWhitePen = (HPEN)GetStockObject( WHITE_PEN ) ; HPEN hBlackPen = (HPEN)GetStockObject( BLACK_PEN ) ; HPEN hOldPen = (HPEN)SelectObject( hbitmapDC, hWhitePen ) ; if ( bReverse ) { MoveToEx( hbitmapDC, ww-24, 4, NULL ) ; LineTo( hbitmapDC, ww-28, 12 ) ; SelectObject( hbitmapDC, hBlackPen ) ; LineTo( hbitmapDC, ww-20, 12 ) ; LineTo( hbitmapDC, ww-24, 4 ) ; } else { MoveToEx( hbitmapDC, ww-20, 4, NULL ) ; LineTo( hbitmapDC, ww-28, 4 ) ; LineTo( hbitmapDC, ww-24, 12 ) ; SelectObject( hbitmapDC, hBlackPen ) ; LineTo( hbitmapDC, ww-20, 4 ) ; } SelectObject( hbitmapDC, hOldPen ) ; SelectObject( hbitmapDC, hOldFont ) ; SelectObject( hbitmapDC, hOldBrush ) ; DeleteDC( hbitmapDC ) ; ::ReleaseDC( pChild->m_hWnd, hdcHeader ) ; // // set header of selected item // memset( &hdi, 0, sizeof hdi ) ; hdi.mask = HDI_BITMAP | HDI_FORMAT ; hdi.fmt = HDF_LEFT | HDF_BITMAP ; hdi.hbm = hbitmap ; pChild->SendMessage( HDM_SETITEM, nColumn, (LPARAM)&hdi ) ; // // reset all others // int nCount = (int)pChild->SendMessage( HDM_GETITEMCOUNT, 0, 0L); if ( nCount > 0 ) { for ( int ii = 0 ; ii < nCount ; ii++ ) { if (nColumn != ii ) { HD_ITEM hdi2 ; memset( &hdi2, 0, sizeof hdi2 ) ; hdi2.mask = HDI_FORMAT ; hdi2.fmt = HDF_LEFT | HDF_STRING ; pChild->SendMessage( HDM_SETITEM, ii, (LPARAM)&hdi2 ) ; } } // for } // if }
-
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