前一段时间参与了一个项目,实现了一个类似于资源管理器的客户端。有CTreeCtrl和CListCtrl,实现本身没有什么难度。
但是使用字符串排序后的样子显得很丑:
在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)); }
现在的排序结果:
浙公网安备 33010602011771号