Botcher::Blog

快意人生 水煮沉浮
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

资源管理器风格的排序

Posted on 2010-02-04 00:27  Botcher  阅读(467)  评论(0)    收藏  举报
    前一段时间参与了一个项目,实现了一个类似于资源管理器的客户端。有CTreeCtrl和CListCtrl,实现本身没有什么难度。
但是使用字符串排序后的样子显得很丑:
 
image 
    在MFC Feature Pack中找到了资源管理器名字排序的代码,却根本没法使用到我的项目中:
 
	case AFX_ShellList_ColumnName:
		{
			HRESULT hr = pItem1->pParentFolder->CompareIDs(0, pItem1->pidlRel, pItem2->pidlRel);

			if (FAILED(hr))
			{
				return 0;
			}

			nRes = (short) SCODE_CODE(GetScode(hr));
		}
		break;

 

    后来找到了StrCmpLogicalW这样函数,可惜的是只有Unicode版本的,并且只支持Windows XP及以上的操作系统。
于是利用该函数自己封装了一个比较函数。
 
int WINAPI CompareStringLogical(LPCTSTR psz1, LPCTSTR psz2)
{
	int nRet = 0;
#ifdef UNICODE
	if (IsWindowsXPOrLater())
	{
		nRet = StrCmpLogicalW(psz1, psz2);
	}
	else
	{
		nRet = _tcscmp(psz1, psz2);
	}
#else
	nRet = _tcscmp(psz1, psz2);
#endif

	return nRet;
}  
BOOL WINAPI IsWindowsXPOrLater() 
{
	OSVERSIONINFO osvi;
	osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
	::GetVersionEx(&osvi);

	// Perform the test.
	return  (osvi.dwMajorVersion > 5) || ((osvi.dwMajorVersion == 5) &&(osvi.dwMinorVersion > 0)); 
}

现在的排序结果:

 
image