📄 uictrl.cpp
字号:
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 + -