mirror of
				https://github.com/bobranten/Ext4Fsd.git
				synced 2025-10-30 13:28:31 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			357 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			357 lines
		
	
	
		
			9.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // TreeList.cpp : implementation file
 | |
| //
 | |
| 
 | |
| #include "stdafx.h"
 | |
| #include "resource.h"
 | |
| #include "TreeList.h"
 | |
| 
 | |
| #ifdef _DEBUG
 | |
| #define new DEBUG_NEW
 | |
| #undef THIS_FILE
 | |
| static char THIS_FILE[] = __FILE__;
 | |
| #endif
 | |
| 
 | |
| /////////////////////////////////////////////////////////////////////////////
 | |
| // CTreeList
 | |
| 
 | |
| CTreeList::CTreeList()
 | |
| {
 | |
|     m_SelectionRect = CRect(0,0,0,0);
 | |
|     m_SelectionFlag = FALSE;
 | |
|     m_Point = CPoint(0, 0);
 | |
| 	m_PrevItem = -1;
 | |
|     m_Rows = 0;
 | |
|     m_Columns = 1;
 | |
|     m_hBitmap = NULL;
 | |
|     m_hMemDC = NULL;
 | |
|     m_hOldBmp = NULL;
 | |
|     m_bFocus = FALSE;
 | |
| }
 | |
| 
 | |
| CTreeList::~CTreeList()
 | |
| {
 | |
| 	if (m_hBitmap) {
 | |
| 
 | |
|         if (m_hMemDC) {
 | |
|             ::SelectObject(m_hMemDC, m_hOldBmp);
 | |
|             ::DeleteDC(m_hMemDC);
 | |
|         }
 | |
| 
 | |
|         ::DeleteObject (m_hBitmap);
 | |
|         m_hBitmap = NULL;
 | |
|     }
 | |
| }
 | |
| 
 | |
| 
 | |
| BEGIN_MESSAGE_MAP(CTreeList, CListCtrl)
 | |
| 	//{{AFX_MSG_MAP(CTreeList)
 | |
| 	ON_WM_LBUTTONDOWN()
 | |
| 	ON_WM_RBUTTONDOWN()
 | |
| 	ON_NOTIFY_REFLECT(NM_KILLFOCUS, OnKillfocus)
 | |
| 	ON_NOTIFY_REFLECT(NM_SETFOCUS, OnSetfocus)
 | |
| 	//}}AFX_MSG_MAP
 | |
|     ON_MESSAGE(WM_SETFONT, OnSetFont)
 | |
|     ON_WM_MEASUREITEM_REFLECT()
 | |
| END_MESSAGE_MAP()
 | |
| 
 | |
| /////////////////////////////////////////////////////////////////////////////
 | |
| // CTreeList message handlers
 | |
| 
 | |
| void CTreeList::OnLButtonDown(UINT nFlags, CPoint point) 
 | |
| {
 | |
| 	// TODO: Add your message handler code here and/or call default
 | |
| 	m_Point = point;
 | |
| 	m_SelectionFlag = FALSE;
 | |
| 
 | |
| 	Invalidate();
 | |
| 	
 | |
| 	CListCtrl::OnLButtonDown(nFlags, point);
 | |
| }
 | |
| 
 | |
| BOOL CTreeList::PreCreateWindow(CREATESTRUCT& cs) 
 | |
| {
 | |
| 	// TODO: Add your specialized code here and/or call the base class
 | |
| 	cs.style |= LVS_REPORT | LVS_OWNERDRAWFIXED| WS_BORDER;
 | |
| 	return CListCtrl::PreCreateWindow(cs);
 | |
| }
 | |
| 
 | |
| LRESULT CTreeList::OnSetFont(WPARAM wParam, LPARAM)
 | |
| {
 | |
|     LRESULT res = Default();
 | |
| 
 | |
|     CRect rc;
 | |
|     GetWindowRect( &rc );
 | |
| 
 | |
|     WINDOWPOS wp;
 | |
|     wp.hwnd  = m_hWnd;
 | |
|     wp.cx    = rc.Width();
 | |
|     wp.cy    = rc.Height();
 | |
|     wp.flags = SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOZORDER;
 | |
|     SendMessage( WM_WINDOWPOSCHANGED, 0, (LPARAM)&wp );
 | |
| 
 | |
|     return res;
 | |
| }
 | |
| 
 | |
| void CTreeList::MeasureItem( LPMEASUREITEMSTRUCT lpMeasureItemStruct )
 | |
| {
 | |
|     lpMeasureItemStruct->itemHeight = 16;
 | |
| }
 | |
| 
 | |
| void CTreeList::DrawItem(LPDRAWITEMSTRUCT lpDrawItemStruct) 
 | |
| {
 | |
|     PULONG  pMagic = (PULONG) lpDrawItemStruct->itemData;
 | |
| 
 | |
|     TCHAR  lpBuffer[256];
 | |
|     LV_ITEM lvi;
 | |
|     LV_COLUMN lvc, lvcprev ;
 | |
| 
 | |
|     memset(lpBuffer, 0, 256);
 | |
|     lvi.mask = LVIF_TEXT | LVIF_PARAM ;
 | |
|     lvi.iItem = lpDrawItemStruct->itemID ;  
 | |
|     lvi.iSubItem = 0;
 | |
|     lvi.pszText = lpBuffer ;
 | |
|     lvi.cchTextMax = sizeof(lpBuffer);
 | |
|     GetItem(&lvi);
 | |
|     ::ZeroMemory(&lvc, sizeof(lvc));
 | |
|     ::ZeroMemory(&lvcprev, sizeof(lvcprev));
 | |
|     lvc.mask = LVCF_WIDTH |LVCF_FMT;
 | |
|     lvcprev.mask = LVCF_WIDTH | LVCF_FMT;
 | |
| 
 | |
|     CDC* pDC;
 | |
|     pDC = CDC::FromHandle(lpDrawItemStruct->hDC);
 | |
|     int nCol;
 | |
|     CRect rcText = lpDrawItemStruct->rcItem;
 | |
| 
 | |
|     CFont Fnt, *pOldFont = NULL;
 | |
|     LOGFONT lf;
 | |
| 
 | |
|     int cyPixels = pDC->GetDeviceCaps(LOGPIXELSY);
 | |
|     memset(&lf, 0, sizeof(LOGFONT));
 | |
| 
 | |
|     if (pMagic == NULL) {
 | |
|         return;
 | |
|     }
 | |
| 
 | |
|     if (*pMagic == EXT2_CDROM_DEVICE_MAGIC || *pMagic == EXT2_DISK_MAGIC) {
 | |
| 
 | |
|         if (IsVistaOrAbove()) {
 | |
|             lstrcpy(lf.lfFaceName, "MS Sans Serif"); /*Courier New*/
 | |
|             lf.lfHeight = -MulDiv(8, cyPixels, 72);
 | |
|             lf.lfWeight = TRUE;
 | |
|         } else {
 | |
|             lstrcpy(lf.lfFaceName, "Arial Black"); /*Courier New*/
 | |
|             lf.lfHeight = -MulDiv(8, cyPixels, 72);
 | |
|             lf.lfWeight = TRUE;
 | |
|         }
 | |
|     } else {
 | |
|         lstrcpy(lf.lfFaceName, "MS Sans Serif");
 | |
|         lf.lfHeight = -MulDiv(8, cyPixels, 72);
 | |
|     }
 | |
| 
 | |
|     Fnt.CreateFontIndirect(&lf);
 | |
|     pOldFont = (CFont *) pDC->SelectObject(&Fnt);
 | |
| 
 | |
|     /* loading bitmap */
 | |
|     if (m_hBitmap == NULL) {
 | |
|         m_hBitmap = (HBITMAP)::LoadImage(GetModuleHandle(NULL), 
 | |
|                              MAKEINTRESOURCE(IDB_LINE_SEP),
 | |
|                              IMAGE_BITMAP, 0, 0, 0);
 | |
| 
 | |
|         if (m_hBitmap) {
 | |
|             m_hMemDC  = ::CreateCompatibleDC(this->GetDC()->m_hDC);
 | |
|             m_hOldBmp = (HBITMAP)::SelectObject(m_hMemDC, m_hBitmap);
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     if (TRUE) {
 | |
| 
 | |
|         if (!m_SelectionFlag) {
 | |
|             for (nCol=0; GetColumn(nCol, &lvc); nCol++) {
 | |
|                 if (nCol > 0) {
 | |
|                     GetSubItemRect(lpDrawItemStruct->itemID, 
 | |
|                         nCol,LVIR_BOUNDS, m_SelectionRect);
 | |
|                 } else {
 | |
|                     GetItemRect(lpDrawItemStruct->itemID, 
 | |
|                              m_SelectionRect,LVIR_BOUNDS);
 | |
|                     m_SelectionRect.right = GetColumnWidth(0);
 | |
|                     m_SelectionRect.left = 0;
 | |
|                 }
 | |
| 
 | |
|                 if (m_SelectionRect.PtInRect(m_Point)) {
 | |
|                     m_SelectionFlag = TRUE;
 | |
|                     break;
 | |
|                 } else {
 | |
|                     m_SelectionFlag = FALSE;
 | |
|                 }
 | |
|             } 
 | |
|         }
 | |
|  
 | |
|         if ((lpDrawItemStruct->itemState & ODS_SELECTED) && m_SelectionFlag ) {
 | |
| 
 | |
|             CRect rc = lpDrawItemStruct->rcItem;
 | |
|             rc.left  += 4; rc.right -= 4;
 | |
|             rc.top   += 1; rc.bottom -= 0;
 | |
|             if (*pMagic == EXT2_CDROM_DEVICE_MAGIC || *pMagic == EXT2_DISK_MAGIC) {
 | |
|                 rc.bottom -= 3; rc.top -= 1;
 | |
|                 rc.right = (rc.Width() * 7 / 8) + rc.left;
 | |
|             }
 | |
|             pDC->FillSolidRect(&rc, GetSysColor(m_bFocus ? COLOR_HIGHLIGHT : COLOR_INACTIVEBORDER));
 | |
|         } else {
 | |
|             CRect rc = lpDrawItemStruct->rcItem;
 | |
|             pDC->FillSolidRect(&rc, GetSysColor(COLOR_WINDOW)) ;
 | |
|             pDC->SetTextColor(GetSysColor(COLOR_WINDOWTEXT)) ; 
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     for (nCol=0; GetColumn(nCol, &lvc); nCol++) {
 | |
| 
 | |
|         UINT  uFormat    = DT_LEFT ;
 | |
| 
 | |
|         if (*pMagic == EXT2_CDROM_DEVICE_MAGIC || *pMagic == EXT2_DISK_MAGIC) {
 | |
| 
 | |
|             rcText = lpDrawItemStruct->rcItem;
 | |
|             rcText.left += 4;
 | |
|             rcText.bottom += 1;
 | |
|             rcText.top = rcText.bottom - 6 + lf.lfHeight;
 | |
| 
 | |
|             ::DrawText(lpDrawItemStruct->hDC, lpBuffer, strlen(lpBuffer), 
 | |
|                               &rcText, DT_LEFT) ;
 | |
| 
 | |
|             CRect rect = lpDrawItemStruct->rcItem;
 | |
|             int rc = 0;
 | |
|             BITMAP  cs;
 | |
| 
 | |
| 
 | |
|             rect.top = rcText.bottom - 4;
 | |
|             rc = ::GetObject(m_hBitmap, sizeof(cs), &cs);
 | |
|             if (rc == 0) {
 | |
|                 pDC->SelectObject(pOldFont);
 | |
|                 return;
 | |
|             }
 | |
| 
 | |
|             ::StretchBlt(pDC->m_hDC, rect.left + 4, (rect.bottom + rect.top) / 2,
 | |
|                          rect.Width() * 7 / 8, cs.bmHeight,
 | |
|                          m_hMemDC, 0, 0, cs.bmWidth, cs.bmHeight, SRCCOPY);
 | |
| 
 | |
|         } else {
 | |
| 
 | |
|             if (nCol > 0) {
 | |
|                GetColumn(nCol, &lvcprev) ;
 | |
|                rcText.left = rcText.right;
 | |
|                rcText.right += lvcprev.cx;
 | |
|                rcText.left += 4;
 | |
| 
 | |
|                 if (nCol == 3 || nCol == 4) {
 | |
|                     uFormat = DT_RIGHT;
 | |
|                     rcText.right -= 4;
 | |
|                 }
 | |
| 
 | |
|             } else {
 | |
|                 rcText = lpDrawItemStruct->rcItem;
 | |
|                 rcText.top += (16 + lf.lfHeight) / 2;
 | |
|                 rcText.right = rcText.left + GetColumnWidth(0);
 | |
|                 rcText.left += 20;
 | |
|             }
 | |
| 
 | |
|             // Get and draw the text 
 | |
|             memset(lpBuffer, 0, 256);
 | |
|             ::ZeroMemory(&lvi, sizeof(lvi));
 | |
|             lvi.iItem = lpDrawItemStruct->itemID;
 | |
|             lvi.mask = LVIF_TEXT | LVIF_PARAM;
 | |
|             lvi.iSubItem = nCol;
 | |
|             lvi.pszText = lpBuffer;
 | |
|             lvi.cchTextMax = sizeof(lpBuffer);
 | |
|             GetItem(&lvi);
 | |
|    
 | |
|             ::DrawText(lpDrawItemStruct->hDC, lpBuffer, strlen(lpBuffer), 
 | |
|                               &rcText, uFormat) ;
 | |
| 
 | |
|             if (nCol == 0) {
 | |
|                 rcText.left -= 20;
 | |
|             } else {
 | |
|                 rcText.left -= 4;
 | |
|                 if (nCol == 3 || nCol == 4) {
 | |
|                     rcText.right += 4;
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     pDC->SelectObject(pOldFont);
 | |
| 
 | |
|     return;
 | |
| }
 | |
| 
 | |
| void CTreeList::OnRButtonDown(UINT nFlags, CPoint point) 
 | |
| {
 | |
| 	// TODO: Add your message handler code here and/or call default
 | |
| 	m_Point = point;
 | |
| 	m_SelectionFlag = FALSE;
 | |
| 
 | |
| 	Invalidate();
 | |
| 	
 | |
| 	CListCtrl::OnRButtonDown(nFlags, point);
 | |
| }
 | |
| 
 | |
| void CTreeList::OnKillfocus(NMHDR* pNMHDR, LRESULT* pResult) 
 | |
| {
 | |
| 	// TODO: Add your control notification handler code here
 | |
|     m_bFocus = FALSE;
 | |
|     Invalidate();
 | |
| 	*pResult = 0;
 | |
| }
 | |
| 
 | |
| void CTreeList::OnSetfocus(NMHDR* pNMHDR, LRESULT* pResult) 
 | |
| {
 | |
| 	// TODO: Add your control notification handler code here
 | |
|     m_bFocus = TRUE;
 | |
|     Invalidate();
 | |
| 
 | |
| 	*pResult = 0;
 | |
| }
 | |
| 
 | |
| int CTreeList::QuerySubItemText(int item, CHAR *Data, int length)
 | |
| {
 | |
|     LV_COLUMN lvc;
 | |
|     LV_ITEM lvi;
 | |
|     int     ncol;
 | |
|     CRect   rect;
 | |
| 
 | |
|     ::ZeroMemory(&lvc, sizeof(lvc));
 | |
|     lvc.mask = LVCF_WIDTH |LVCF_FMT;
 | |
| 
 | |
|     for (ncol=0; GetColumn(ncol, &lvc); ncol++) {
 | |
| 
 | |
|         if (ncol > 0) {
 | |
|             GetSubItemRect(item, ncol,LVIR_BOUNDS, rect);
 | |
|         } else {
 | |
|             GetItemRect(item, rect, LVIR_BOUNDS);
 | |
|             rect.right = GetColumnWidth(0);
 | |
|             rect.left = 0;
 | |
|         }
 | |
| 
 | |
|         if (rect.PtInRect(m_Point)) {
 | |
| 
 | |
|             ::ZeroMemory(Data, length);
 | |
|             ::ZeroMemory(&lvi, sizeof(lvi));
 | |
| 
 | |
|             lvi.iItem = item;
 | |
|             lvi.mask = LVIF_TEXT;
 | |
|             lvi.iSubItem = ncol;
 | |
|             lvi.pszText = Data;
 | |
|             lvi.cchTextMax = length;
 | |
| 
 | |
|             return GetItem(&lvi);
 | |
|             break;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     return FALSE;
 | |
| }
 | |
| 
 | |
| VOID CTreeList::Redraw()
 | |
| {
 | |
|     m_bFocus = TRUE;
 | |
|     m_SelectionFlag = TRUE;
 | |
|     Invalidate();
 | |
| } |