📄 resorgsymbolslistctrl.cpp
字号:
if ( (NULL != pSymbol) && IsVisible(pSymbol) )
{
AddSymbol(pSymbol);
}
}
SortList(m_nSortColumn, m_bSortAscending);
//AutoSizeColumn();
}
}
SetRedraw(TRUE);
Invalidate();
UpdateWindow();
RedrawWindow();
}
void CResOrgSymbolsListCtrl::AddSymbols(const CResourceSymbolList& listSymbols)
{
ASSERT(NULL != m_pResourceSymbolManager);
SetRedraw(FALSE);
DeleteAllItems();
if (listSymbols.GetCount() > 0)
{
POSITION pos = listSymbols.GetHeadPosition();
while (pos != NULL)
{
CResourceSymbol* pSymbol = listSymbols.GetNext(pos);
if ( (NULL != pSymbol) && IsVisible(pSymbol) )
{
AddSymbol(pSymbol);
}
}
SortList(m_nSortColumn, m_bSortAscending);
}
SetRedraw(TRUE);
Invalidate();
UpdateWindow();
RedrawWindow();
}
bool CResOrgSymbolsListCtrl::AddSymbol(CResourceSymbol* pSymbol)
{
int nItem = FindSymbol(pSymbol);
if (nItem < 0)
{
int nItem = InsertItem( GetItemCount(),
_T(""));
if (nItem >= 0)
{
SetItemData(nItem, (LPARAM)pSymbol);
UpdateSymbol(pSymbol);
return true;
}
}
return false;
}
bool CResOrgSymbolsListCtrl::UpdateSymbol(CResourceSymbol* pSymbol)
{
int nItem = FindSymbol(pSymbol);
if (nItem >= 0)
{
CString sLabel = pSymbol->GetName();
if (pSymbol->IsModified())
{
sLabel += _T(" *");
}
int nIconID = SymbolTypes.GetIconID( pSymbol->GetType() );
LVITEM item;
item.iItem = nItem;
item.iSubItem = NAME_COLUMN;
item.mask = LVIF_IMAGE;
item.iImage = m_ctrlImages.AddIcon(nIconID);
SetItem(&item);
SetItemText(nItem, NAME_COLUMN, sLabel);
SetItemText(nItem, TYPE_COLUMN, pSymbol->GetTypeName() );
SetItemText(nItem, ID_COLUMN, ::UIntToStr(pSymbol->GetValue()) );
CString sOrigValue;
if (pSymbol->IsModified() && pSymbol->GetValue() != pSymbol->GetOriginalValue())
{
sOrigValue = ::UIntToStr(pSymbol->GetOriginalValue() );
}
SetItemText(nItem, ORIGINAL_ID_COLUMN, sOrigValue);
CNGSplitPath split(pSymbol->GetFileName() );
SetItemText(nItem, FILE_COLUMN, split.GetFileName() + split.GetExtension() );
if (m_bShowStatusColumn)
{
SetItemText(nItem, STATUS_COLUMN, m_pResourceSymbolManager->GetDisplayedStatus(pSymbol) );
}
}
return (nItem != -1);
}
bool CResOrgSymbolsListCtrl::UpdateAllSymbols(void)
{
SetRedraw(FALSE);
for (int nItem = 0; nItem < GetItemCount(); nItem++)
{
CResourceSymbol* pSymbol = GetSymbol(nItem);
if (NULL != pSymbol)
{
UpdateSymbol(pSymbol);
}
}
SetRedraw(TRUE);
return (GetItemCount() > 0);
}
bool CResOrgSymbolsListCtrl::RemoveSymbol(CResourceSymbol* pSymbol)
{
int nItem = FindSymbol(pSymbol);
if (nItem >= 0)
{
DeleteItem(nItem);
return true;
}
return false;
}
void CResOrgSymbolsListCtrl::RemoveAllSymbols(void)
{
DeleteAllItems();
}
bool CResOrgSymbolsListCtrl::Sort(void)
{
if (m_nSortColumn >= NAME_COLUMN)
{
SortList(m_nSortColumn, m_bSortAscending);
return true;
}
return false;
}
int CResOrgSymbolsListCtrl::FindSymbol(CResourceSymbol* pSymbol) const
{
int nItem = -1;
if (pSymbol != NULL)
{
LV_FINDINFO FindInfo;
FindInfo.flags = LVFI_PARAM;
FindInfo.lParam = (DWORD)pSymbol;
nItem = FindItem(&FindInfo);
}
return nItem;
}
int CResOrgSymbolsListCtrl::GetSelection(CResourceSymbolList& rlistSymbols) const
{
rlistSymbols.RemoveAll();
POSITION pos = GetFirstSelectedItemPosition();
while (NULL != pos)
{
int nItem = GetNextSelectedItem(pos);
if (nItem >= 0)
{
// Get the data value from nItem
// This translates into a pointer to the data object
CResourceSymbol* pSymbol = GetSymbol(nItem);
if (NULL != pSymbol)
{
rlistSymbols.AddTail(pSymbol);
}
}
}
return rlistSymbols.GetCount();
}
CResourceSymbol* CResOrgSymbolsListCtrl::GetSelection(void) const
{
if (1 == GetSelectedCount() )
{
// Work out which one is selected
int nItem = GetNextItem(-1, LVNI_ALL | LVNI_SELECTED);
if (-1 != nItem)
{
// Get the data value from nItem
// This translates into a pointer to the data object
CResourceSymbol* pSymbol = GetSymbol(nItem);
#ifdef _DEBUG
ASSERT(pSymbol != NULL);
if (pSymbol != NULL)
{
ASSERT_KINDOF(CResourceSymbol, pSymbol);
}
#endif
return pSymbol;
}
}
return NULL;
}
CResourceSymbol* CResOrgSymbolsListCtrl::GetSymbol(int nItem) const
{
if (nItem >= 0)
{
// Get the data value from nItem
// This translates into a pointer to the data object
CResourceSymbol* pSymbol = reinterpret_cast<CResourceSymbol*>( GetItemData(nItem) );
#ifdef _DEBUG
ASSERT(pSymbol != NULL);
if (pSymbol != NULL)
{
ASSERT_KINDOF(CResourceSymbol, pSymbol);
}
#endif
return pSymbol;
}
return NULL;
}
/////////////////////////////////////////////////////////////////////////////
// CResOrgSymbolsListCtrl message handlers
int CResOrgSymbolsListCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
int nResult = CResOrgSymbolsListCtrl_BASE::OnCreate(lpCreateStruct);
if (-1 != nResult)
{
if (m_ctrlImages.GetSafeHandle() == NULL)
{
m_ctrlImages.Create(SMALL_ICON_CX,
SMALL_ICON_CY, // Small icon
ILC_COLOR | ILC_MASK, // Colour depth
0, // Initial images
1); // Growby
}
if (NULL == GetImageList(LVSIL_SMALL) )
{
SetImageList(&m_ctrlImages, LVSIL_SMALL);
}
}
return nResult;
}
void CResOrgSymbolsListCtrl::OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult)
{
LPNMLVCUSTOMDRAW lplvcd = (LPNMLVCUSTOMDRAW)pNMHDR;
CResOrgSymbolsListCtrl_BASE::OnCustomDraw(pNMHDR, pResult);
switch (lplvcd->nmcd.dwDrawStage)
{
case CDDS_PREPAINT:
*pResult = CDRF_NOTIFYITEMDRAW; // Request prepaint notifications for each item.
break;
case CDDS_ITEMPREPAINT: // Requested notification
if (lplvcd->nmcd.dwItemSpec >= 0)
{
if (m_bShowStatusColumn)
{
CResourceSymbol* pSymbol = (CResourceSymbol*)lplvcd->nmcd.lItemlParam;
if (NULL != pSymbol)
{
if (pSymbol->IsReadOnly())
{
lplvcd->clrText = ::GetSysColor(COLOR_GRAYTEXT);
// Request a post-paint notification so we can draw a grayed icon
*pResult = CDRF_NOTIFYPOSTPAINT;
}
else if ( !m_pResourceSymbolManager->IsUnique(pSymbol->GetName() ) ||
!m_pResourceSymbolManager->IsUnique(pSymbol->GetValue() ) )
{
// Highlight conflicting symbols in red...
lplvcd->clrText = RGB(255,0,0);
}
else if ( m_pResourceSymbolManager->IsOutOfRange(pSymbol) )
{
// Highlight out of range symbols in a slightly darker red...
lplvcd->clrText = RGB(160,0,0);
}
else if (pSymbol->IsModified())
{
// ...and changed symbols in blue...
lplvcd->clrText = RGB(0,0,255);
}
}
}
else
{
lplvcd->clrText = m_clrText;
}
}
break;
case CDDS_ITEMPOSTPAINT:
{
// Draw a "grayed" icon for read-only symbols
CResourceSymbol* pSymbol = (CResourceSymbol*)lplvcd->nmcd.lItemlParam;
if (NULL != pSymbol)
{
if (pSymbol->IsReadOnly())
{
// First, retrieve the image index
LV_ITEM item;
item.iItem = (int)lplvcd->nmcd.dwItemSpec;
item.iSubItem = 0;
item.mask = LVIF_IMAGE | LVIF_STATE;
GetItem(&item);
// Get the rectangle of the item from the list control
// The topleft corner is the point we need to draw the icon at
CRect rectIcon;
GetItemRect(item.iItem, &rectIcon, LVIR_ICON);
CPoint p( rectIcon.TopLeft() );
// Obtain a device context and a handle to the icon
CDC* pDC = CDC::FromHandle(lplvcd->nmcd.hdc);
ASSERT(pDC != NULL);
HICON hIcon = m_ctrlImages.ExtractIcon(item.iImage);
ASSERT(hIcon != NULL);
// At last! Draw it...
pDC->DrawState(p, CSize(0,0), hIcon, DSS_DISABLED, (HBRUSH)NULL);
// Finally - a bit of cleanup to keep the auditors happy...
::DestroyIcon(hIcon);
}
}
}
*pResult = CDRF_DODEFAULT;
break;
default:
break;
}
}
void CResOrgSymbolsListCtrl::OnNcCalcSize(BOOL bCalcValidRects, NCCALCSIZE_PARAMS FAR* lpncsp)
{
CWnd* pParent = GetParent();
if ( (NULL != pParent) && IsViewContainedInSplitterWindow(pParent) )
{
// If we're running inside a view within a splitter, remove our own scrollbars
// so the splitter scrollbars can do their thing instead
ModifyStyle(WS_HSCROLL | WS_VSCROLL, 0, 0);
}
CResOrgSymbolsListCtrl_BASE::OnNcCalcSize(bCalcValidRects, lpncsp);
}
void CResOrgSymbolsListCtrl::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
CResOrgSymbolsListCtrl_BASE::OnKeyDown(nChar, nRepCnt, nFlags);
switch (nChar)
{
case VK_PRIOR:
case VK_NEXT:
case VK_DOWN:
case VK_UP:
case VK_HOME:
case VK_LEFT:
case VK_RIGHT:
case VK_END:
{
// If we're running inside a view within a splitter, forward the settings from
// our own scrollbars to it so that its internal state is maintained
CWnd* pParent = GetParent();
if ( (NULL != pParent) && IsViewContainedInSplitterWindow(pParent) )
{
SCROLLINFO infoHorz;
GetScrollInfo(SB_HORZ, &infoHorz);
pParent->SendMessage(WM_SETSCROLLINFO, (WPARAM)SB_HORZ, (LPARAM)&infoHorz);
SCROLLINFO infoVert;
GetScrollInfo(SB_VERT, &infoVert);
pParent->SendMessage(WM_SETSCROLLINFO, (WPARAM)SB_VERT, (LPARAM)&infoVert);
}
}
break;
default:
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -