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

📄 resorgsymbolslistctrl.cpp

📁 ResOrg 图形化管理Vc项目的资源ID的工具的源代码。 ResOrg - Manage and Renumber Resource Symbol IDs Introduction The
💻 CPP
📖 第 1 页 / 共 2 页
字号:

				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 + -