Botcher::Blog

快意人生 水煮沉浮
posts - 3, comments - 0, trackbacks - 0, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

公告

2011年5月13日

 

image

 

使用32位位图,实现如上效果的CTreeCtrl的Overlay图标。

 

直接看代码吧:

 

	m_overlayImages.Create(16, 16, ILC_COLOR32 | ILC_MASK, 0, 0);
	CBitmap bmp;
	if (!bmp.LoadBitmap(IDB_BITMAP_ICON))
	{
		ASSERT(FALSE);
		return FALSE;
	}
	m_overlayImages.Add(&bmp, RGB(255, 0, 255));
	int nIconCount = m_overlayImages.GetImageCount();
	
	for (int i = 1; i < nIconCount; i++)			//support 16
	{
		m_overlayImages.SetOverlayImage(i, i);
	}
	m_treeCtrl.SetImageList(&m_overlayImages, TVSIL_NORMAL);

	HTREEITEM hRoot = m_treeCtrl.InsertItem(_T("Root"), 0, 0, TVI_ROOT);
	for (int overlay = 1; overlay < nIconCount; overlay++)			//support 16
	{
		HTREEITEM hItem = m_treeCtrl.InsertItem(_T("Overlay"), 0, 0, hRoot);
		m_treeCtrl.SetItemState(hItem, INDEXTOOVERLAYMASK(overlay), TVIS_OVERLAYMASK);
	}

 

 

代码下载

posted @ 2011-05-13 22:35 Botcher 阅读(159) 评论(0) 编辑

2010年7月8日

CMFCListCtrl是MFC Feature Pack中提供的新类,它很好的封装了CListCtrl的排序功能,

只要重写比较函数就OK了。

 

virtual int OnCompareItems(LPARAM lParam1, LPARAM lParam2, int iColumn);

 

但是,在使用GroupView模式时,以上的比较函数仍然被调用,但并没有排序。

 

AFX_INLINE int CListCtrl::EnableGroupView(BOOL fEnable)
{
	ASSERT(::IsWindow(m_hWnd));
	return (int)ListView_EnableGroupView(m_hWnd, fEnable); // LVM_ENABLEGROUPVIEW
}

 

面对以上问题,对CMFCListCtrl派生出CGroupSortableListCtrl类,以实现组内排序。


image   image

 

以下附上代码:

 

 

posted @ 2010-07-08 23:19 Botcher 阅读(393) 评论(0) 编辑

2010年2月4日

    前一段时间参与了一个项目,实现了一个类似于资源管理器的客户端。有CTreeCtrl和CListCtrl,实现本身没有什么难度。
但是使用字符串排序后的样子显得很丑:
 
image 
    在MFC Feature Pack中找到了资源管理器名字排序的代码,却根本没法使用到我的项目中:
 
	case AFX_ShellList_ColumnName:
		{
			HRESULT hr = pItem1-&gt;pParentFolder-&gt;CompareIDs(0, pItem1-&gt;pidlRel, pItem2-&gt;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 

posted @ 2010-02-04 00:27 Botcher 阅读(112) 评论(0) 编辑