⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uictrl.cpp

📁 vc座的资源管理器源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
		strExp = str.Right(str.GetLength()-nDouble);
	}
	else
	{
		if (str.Find(GetNegativeSign()) == 0)
		{
			strNeg = str.Left(1);
			strTemp = str.Right(str.GetLength()-1);
		}
		else
			strTemp = str;
	}
	int len = strTemp.GetLength();
	if (len <= 3 || len > nMaxDigLen)
		return;
	LPCTSTR pBuf = strTemp;
	pBuf += (len-1);
	TCHAR tempbuf[nMaxDigLen+1];
	LPTSTR pTempBuf = tempbuf;
	LPCTSTR pSep = GetThousandSep();
	for(int i=0;i < len;i++)
	{
		if (i && ((i % 3) == 0)) 
		{
			if (*pTempBuf != *pSep)
			{
				*pTempBuf =  *pSep;
				pTempBuf = _tcsinc(pTempBuf);
			}
		}
		*pTempBuf = *pBuf;
		pTempBuf = _tcsinc(pTempBuf);
		pBuf = _tcsdec(strTemp,pBuf);
	}
	*pTempBuf = '\0';
	_tcsrev(tempbuf);
	str = strNeg;
	str += tempbuf;
	str += strExp;
}

BOOL CUIODListCtrl::AddString(int nRow,int nCol,int nValue,CUIODListCtrl::eColTypes type)
{
	CString sValue;
	sValue.Format(_T("%d"),nValue);
	return AddString(nRow,nCol,sValue,type);
}

BOOL CUIODListCtrl::AddString(int nRow,int nCol,double dValue,CUIODListCtrl::eColTypes type)
{
	char szBuf[nMaxDigLen];
	_gcvt(dValue,_MAX_INT_DIG,szBuf);
#ifdef _UNICODE
USES_CONVERSION;	
	return AddString(nRow,nCol,A2W(szBuf),type);
#else	
	return AddString(nRow,nCol,szBuf,type);
#endif	
}

BOOL CUIODListCtrl::AddString(int nRow,int nCol,COleDateTime &dtValue,CUIODListCtrl::eColTypes type)
{
	return AddString(nRow,nCol,dtValue.Format(),type);
}

BOOL CUIODListCtrl::AddString(int nRow,int nCol,LPCTSTR szItem,CUIODListCtrl::eColTypes type)
{
	if (m_nItems == 0) 
	{
		TRACE(_T("No rows defined in ODListCtrl\n")); 
		return FALSE;
	}
	if (nCol >= m_nSubItems) 
	{
		TRACE(_T("Tried to add invalid column number(%d) in ODListCtrl\n"),nCol); 
		return FALSE;
	}
	SetColType(nCol,type);
//	return SetItemText(nRow,nCol/*+m_nImage*/,szItem);
	CUIStrListCtrlData *pData = (CUIStrListCtrlData *)GetListCtrlData(nRow);
	ASSERT_KINDOF(CUIStrListCtrlData,pData);
	BOOL ret=FALSE;
	if (type == e_NumericFormatComma || type == e_DoubleFormatComma)
	{
		CString sBuf(szItem);
		AddThousandSeps(sBuf);
		ret = pData->AddString(nCol,sBuf);
	}
	else if (type == e_NumericFormatTime || type == e_DoubleFormatTime)
	{
		CString sBuf(szItem);
		ConvertToTime(sBuf);
		ret = pData->AddString(nCol,sBuf);
	}
	else
		ret = pData->AddString(nCol,szItem);
	return ret;
}						  

void CUIODListCtrl::UpdateString(int nRow)
{ 
	CRect rect;
	if (GetItemRect(nRow,&rect,LVIR_BOUNDS))
	{
		RedrawItems(nRow,nRow);
		UpdateWindow();
	}
}

int CUIODListCtrl::AddCallBackItem(DWORD dwData,int nImage)
{
	if (m_nSubItems == 0) 
	{
		TRACE(_T("No columns defined in ODListCtrl\n")); 
		return FALSE;
	}
	CUIListCtrlData *pListCtrlData = GetNewListCtrlData(dwData,m_nItems);
	BOOL ret = InsertItem(LPSTR_TEXTCALLBACK,(LPARAM)pListCtrlData,nImage);
	if (ret)
		m_objList.Append(pListCtrlData);
	else
		delete pListCtrlData;
	return ret ? m_nItems-1 : -1;
}

int CUIODListCtrl::AddTextItem(int nImage)
{
	CUIStrListCtrlData *pListCtrlData = new CUIStrListCtrlData(m_nSubItems);
	if (InsertItem(LPSTR_TEXTCALLBACK,(LPARAM)pListCtrlData,nImage))
	{
		m_objList.Append(pListCtrlData);
		return m_nItems-1;
	}
	delete pListCtrlData;
	return -1;
}

int CUIODListCtrl::GetImageIndex(UINT nIconID)
{
	int nImage = 0;
	if (nIconID)
	{
		if (!m_mapImageIndex.Lookup(nIconID,nImage))
		{
			nImage = AddIcon(nIconID);
		}
	}
	return nImage;
}

// from handle
int CUIODListCtrl::AddIcon(HICON hIcon,UINT nIconID)
{
	CImageList *pILSmall = NULL;
	CImageList *pILLarge = NULL;
	GetImageLists(&pILSmall,&pILLarge);
	int nSmallIndex = pILSmall->Add(hIcon);
	// save the image ID
	if (nIconID)
		m_mapImageIndex[nIconID] = nSmallIndex;
	int nLargeIndex = pILLarge->Add(hIcon); 
	if (nSmallIndex == -1 || nLargeIndex == -1)
	{
		TRACE(_T("Failed to add icon to image list in CUIODListCtrl\n"));
		return -1;
	}
	return nSmallIndex;
}

// from resource id
int CUIODListCtrl::AddIcon(UINT nIconID)
{
	HICON hIcon = AfxGetApp()->LoadIcon(nIconID);
	if (hIcon == NULL)
	{
		TRACE(_T("LoadIcon failed in CUIODListCtrl\n"));
		return -1;
	}
	return AddIcon(hIcon,nIconID);
}

// from file
int CUIODListCtrl::AddIcon(LPCTSTR pszIcon)
{
	CString sImageFile;
	int nIndex;
	if (m_mapImageFile.Lookup(sImageFile,nIndex))
	{
		return nIndex;
	}
    HICON hIcon = (HICON)LoadImage(AfxGetInstanceHandle(), 
            pszIcon,
            IMAGE_ICON,
            ::GetSystemMetrics(SM_CXICON),
            ::GetSystemMetrics(SM_CYICON),
            LR_LOADFROMFILE);
	if (hIcon == NULL)
	{
		TRACE(_T("LoadImage(Large) failed in CUIODListCtrl\n"));
	}
    HICON hIconSm = (HICON)LoadImage(AfxGetInstanceHandle(), 
            pszIcon,
            IMAGE_ICON,
            ::GetSystemMetrics(SM_CXSMICON),
            ::GetSystemMetrics(SM_CYSMICON),
            LR_LOADFROMFILE);
	if (hIconSm == NULL)
	{
		TRACE(_T("LoadImage(Small) failed in CUIODListCtrl\n"));
	}
	if (hIcon == NULL && hIconSm == NULL)
		return -1;
	CImageList *pILSmall = NULL;
	CImageList *pILLarge = NULL;
	GetImageLists(&pILSmall,&pILLarge);
	int nSmallIndex = pILSmall->Add(hIconSm);
	int nLargeIndex = pILLarge->Add(hIcon); 
	if (nSmallIndex == -1 || nLargeIndex == -1)
	{
		TRACE(_T("Failed to add icon to image list in CUIODListCtrl\n"));
		return -1;
	}
	sImageFile = pszIcon;
	m_mapImageFile[sImageFile] = nSmallIndex;
	return nSmallIndex;
}

BOOL CUIODListCtrl::InsertItem(LPTSTR szItem,LPARAM lParam,int nImage)
{
	LV_ITEM lvi;
	lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
	lvi.state = 0;      
	lvi.stateMask = 0;  

	lvi.iItem = m_nItems;
	lvi.iSubItem = 0;
	lvi.pszText = szItem; 
	lvi.cchTextMax = MAX_TEXT;
	lvi.iImage = nImage;
	lvi.lParam = lParam;
	if (CListCtrl::InsertItem(&lvi) == -1) 
	{
		TRACE1("Unable to insert item %u into list control\n",m_nItems);
		return FALSE;
	}
	if (nImage) 
		m_nImage = 1;
	m_nItems++;
	return TRUE;
}

int CUIODListCtrl::SetCurSel(int nSelect)
{
	if (GetItemCount() && SetItemState(nSelect,LVIS_SELECTED | LVIS_FOCUSED,LVIS_SELECTED | LVIS_FOCUSED))
		return TRUE;
	return -1;
}

// messages
LRESULT CUIODListCtrl::OnSetColumnWidth(WPARAM wParam,LPARAM lParam)
{
	Default();
	return TRUE;
}

LRESULT CUIODListCtrl::OnDeleteAllItems(WPARAM wParam,LPARAM lParam)
{
	m_nItems=0;
	m_nImage=0;
	m_hOrigFont=NULL;
	AllItemsDeleted();
	m_objList.DeleteAll();
	TRACE0("All items deleted in CUIODListCtrl\n");
	Default();
	return TRUE;
}

CUIListCtrlData *CUIODListCtrl::GetNewListCtrlData(DWORD dwData,int nItem)
{
	CUIListCtrlData *pListCtrlData = new CUIListCtrlData(m_nSubItems);
	pListCtrlData->SetExtData(dwData); 
	return pListCtrlData;
}

int CUIODListCtrl::FindItem(DWORD dwExtData)
{
	int count = GetItemCount();
	CUIListCtrlData *pData;
	for(int i=0;i <	count;i++) 
	{
		pData = GetListCtrlData(i);
		if (pData->GetExtData() == dwExtData)
			break;
	}
	return i == count ? -1 : i;
}

BOOL CUIODListCtrl::GetFullRowSel() const
{
	return(m_bFullRowSel);
}

DWORD CUIODListCtrl::GetExStyle() 
{
	return SendMessage(LVM_GETEXTENDEDLISTVIEWSTYLE);
}

BOOL CUIODListCtrl::SetExStyle(UINT nStyle,BOOL bModify)
{
	DWORD dwStyle = GetExStyle();
	if (bModify)
		dwStyle |= nStyle;
	else
		dwStyle &= ~nStyle;
	BOOL bRet = SendMessage(LVM_SETEXTENDEDLISTVIEWSTYLE, 0, dwStyle);
	if (bRet)
		SaveProfile();
	return bRet;
}

void CUIODListCtrl::SetFullRowSel(bool bSet)
{
	// no painting during change
	if ((bSet && m_bFullRowSel==TRUE) || (!bSet && m_bFullRowSel==FALSE))
		return;
	m_bFullRowSel=bSet;
	if(!(GetStyle() & LVS_OWNERDRAWFIXED)) 
	{
		SetExStyle(LVS_EX_FULLROWSELECT,m_bFullRowSel);
	}
	RedrawItems(GetCurSel(),GetCurSel());
	SaveProfile();
}

void CUIODListCtrl::SetIconSize(int nImageList)
{
	m_nImageList = nImageList;

	CRect rc;
	GetWindowRect(rc);
	GetParent()->ScreenToClient(rc);
	rc.bottom++; // Force a WM_MEASUREITEM message
	MoveWindow(rc,FALSE);
	rc.bottom--; // We really don't want to resize it
	MoveWindow(rc,TRUE);
}

void CUIODListCtrl::ChangeIconSize()
{
	SetCurSel(0);
	EnsureVisible(0,0);
	if (m_nImageList == LVSIL_NORMAL)
		SetIconSize(LVSIL_SMALL);
	else
		SetIconSize(LVSIL_NORMAL);
}

BOOL CUIODListCtrl::GetDispInfo(LV_DISPINFO *pDispInfo)
{
	CUIStrListCtrlData *pData = (CUIStrListCtrlData*)pDispInfo->item.lParam;
	ASSERT_KINDOF(CUIStrListCtrlData,pData);
	if (!pData->IsKindOf(RUNTIME_CLASS(CUIStrListCtrlData)))
		return FALSE;
	pDispInfo->item.pszText = pData->GetString(pDispInfo->item.iSubItem);
	return TRUE;
}

BOOL CUIODListCtrl::PopupMenuItem(int nItem,int nCol,CMenu *pPopup,CPoint point)
{
	int nCurSel = GetCurSel();
	int nSel = GetNextSel(nCurSel);
	UINT nPopupID = (nSel == -1 ? m_PopupID : m_MultiPopupID);
	if (nPopupID && (nCol == 0 && nItem != -1))
	{
		CMenu menu;
		VERIFY(menu.LoadMenu(nPopupID));
		CMenu* pMyPopup = menu.GetSubMenu(0);
		ASSERT(pMyPopup != NULL);
		if (m_pPopupWnd == NULL)
			m_pPopupWnd = this;
		pMyPopup->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, point.x, point.y, m_pPopupWnd);
		return TRUE;
	}
	return nSel == -1 ? FALSE : TRUE;
}

int CUIODListCtrl::HitTestEx(CPoint &point, int *col) const
{
	int colnum = 0;
	int row = HitTest( point, NULL );
	
	if( col ) *col = 0;

	// Make sure that the ListView is in LVS_REPORT
	if( (GetWindowLong(m_hWnd, GWL_STYLE) & LVS_TYPEMASK) != LVS_REPORT)
		return row;

	// Get the top and bottom row visible
	row = GetTopIndex();
	int bottom = row + GetCountPerPage();
	if( bottom > GetItemCount() )
		bottom = GetItemCount();
	
	// Get the number of columns
	CHeaderCtrl* pHeader = (CHeaderCtrl*)GetDlgItem(0);
	int nColumnCount = pHeader->GetItemCount();
	CRect rcHeader;
	pHeader->GetClientRect(&rcHeader);
	if (point.y >= 0 && point.y <= rcHeader.Height())
		return -2;

	// Loop through the visible rows
	for( ;row <=bottom;row++)
	{
		// Get bounding rect of item and check whether point falls in it.
		CRect rect;
		GetItemRect( row, &rect, LVIR_BOUNDS );
		if( rect.PtInRect(point) )
		{
			// Now find the column
			for( colnum = 0; colnum < nColumnCount; colnum++ )
			{
				int colwidth = GetColumnWidth(colnum);
				if( point.x >= rect.left 
					&& point.x <= (rect.left + colwidth ) )
				{
					if( col ) *col = colnum;
					return row;
				}
				rect.left += colwidth;
			}
		}
	}
	return -1;
}

CEdit* CUIODListCtrl::EditSubLabel( int nItem, int nCol )
{
	// The returned pointer should not be saved
	if (m_bEditSubItems == false || (GetWindowLong(m_hWnd, GWL_STYLE) & LVS_EDITLABELS) != LVS_EDITLABELS)
	{
		return NULL;
	}

	// Make sure that the item is visible
	if( !EnsureVisible( nItem, TRUE ) ) 
		return NULL;

	// Make sure that nCol is valid
	CHeaderCtrl* pHeader = (CHeaderCtrl*)GetDlgItem(0);
	if (pHeader == NULL)
		return NULL;
	int nColumnCount = pHeader->GetItemCount();
	if( nCol >= nColumnCount || GetColumnWidth(nCol) < 5 )
		return NULL;

	// Get the column offset
	int offset = 0;
	for( int i = 0; i < nCol; i++ )
		offset += GetColumnWidth( i );

	CRect rect;
	GetItemRect( nItem, &rect, LVIR_BOUNDS );

	// 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;
		size.cx = offset + rect.left;
		size.cy = 0;
		Scroll( size );
		rect.left -= size.cx;
	}

	// Get Column alignment
	LV_COLUMN lvcol;
	lvcol.mask = LVCF_FMT;
	GetColumn( nCol, &lvcol );
	DWORD dwStyle ;
	if((lvcol.fmt&LVCFMT_JUSTIFYMASK) == LVCFMT_LEFT)
		dwStyle = ES_LEFT;
	else if((lvcol.fmt&LVCFMT_JUSTIFYMASK) == LVCFMT_RIGHT)
		dwStyle = ES_RIGHT;
	else dwStyle = ES_CENTER;

	rect.left += offset+4;
	rect.right = rect.left + GetColumnWidth( nCol ) - 3 ;
	if( rect.right > rcClient.right) rect.right = rcClient.right;

	dwStyle |= WS_BORDER|WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL;
	CEdit *pEdit = new CInPlaceEdit(nItem, nCol, GetItemText( nItem, nCol ));
	pEdit->Create( dwStyle, rect, this, -1/*IDC_IPEDIT*/ );

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -