My FAQ,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > Visual C++ > WINDOWS标准界面元素
Outlook风格的单列使用不同的颜色显示新邮件数
作者:未知 时间:2005-07-20 14:10 出处:VC知识库 责编:MyFAQ
              摘要:Outlook风格的单列使用不同的颜色显示新邮件数

Outlook风格的单列使用不同的颜色显示新邮件数

作者 Lazen


下载源代码

当利用业余时间开发完成纷飞(Outplay...)一个类似Outlook的客户端的邮件程序后 , 发现Outlook的新邮件的显示使用单列不同的颜色,酷酷的,于是决定,也该让我的 Outplay如此...

说做就做,就立刻查找了codeguru里的关于CTreeView的文章,找到了一些合适的信息,大概花了30分钟的时间,终于让我的纷飞(Outplay...)也酷了一把。
Follow me,你会发现它是如此的简单和便捷,仅仅需要在你的CTreeView中添加几行代码而已。

该怎么做呢?(as below)

首先假定你的CTreeView派生类CTreeViewEx,然后你需要在TreeViewEx.h中,添加如下行:

afx_msg void OnCustomDraw(NMHDR* pNMHDR, LRESULT* pResult);      
然后你需要在消息映射中添加:
ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomDraw)      
在OnCusteomDraw消息处理例程中添加如下代码:
void CLeftView::OnCustomDraw(LPNMHDR pNmhdr, LRESULT* pResult)
{
	static CRect	rcItem;
	static int		nItemState;

	LPNMTVCUSTOMDRAW pCustomDraw = (LPNMTVCUSTOMDRAW)pNmhdr;
	switch (pCustomDraw->nmcd.dwDrawStage)
	{
		case CDDS_PREPAINT:
			// 这种情况必须处理,且必须将pResult设置为 CDRF_NOTIFYITEMDRAW, 
			// 否则父窗口怎么也收不到 CDDS_ITEMPREPAINT 通知消息 (GGH) 
			*pResult = CDRF_NOTIFYITEMDRAW;

			// 重新定位视图窗口,这样 TreeCtrl 的 DefWindowProc 不会重画
			//::SetViewportOrgEx(pCustomDraw->nmcd.hdc, /*m_nOffset*/0, 0, NULL);
			break;

		case CDDS_ITEMPREPAINT:
			// 设置背景和前景颜色
			nItemState = pCustomDraw->nmcd.uItemState;

			pCustomDraw->nmcd.uItemState &= ~CDIS_FOCUS;
			pCustomDraw->clrText = m_colHilightText;
			// 记住绘制项目的矩形
			m_pTree->GetItemRect((HTREEITEM) pCustomDraw->nmcd.dwItemSpec, &rcItem, TRUE);
			*pResult = CDRF_NOTIFYPOSTPAINT;
			break;

		case CDDS_ITEMPOSTPAINT:
			DrawTreeItem(nItemState, rcItem, pCustomDraw->nmcd.hdc,
                         (HTREEITEM) pCustomDraw->nmcd.dwItemSpec);
			break;
		default:
			*pResult = CDRF_DODEFAULT;
	}
}      
最后你需要做的只是在DrawTreeItem中自绘你想要的得效果就是了如下:
void CLeftView::DrawTreeItem(int nItemState, CRect rcItem, HDC hdc, HTREEITEM hItem)
{
	// 如果此项获得输入焦点,则绘制外围矩形并用蓝色填充矩形区域
	COLORREF colText = m_colText;

	if(nItemState & CDIS_FOCUS)
	{
		::FillRect(hdc, &rcItem, (HBRUSH)m_BackBrush.m_hObject);
		// 新的焦点矩形代码......
		::DrawFocusRect( hdc, &rcItem);
		colText = m_colHilightText;
	}
	else if(nItemState & CDIS_SELECTED)
	{
		::FillRect(hdc, &rcItem, (HBRUSH)m_GrayBrush.m_hObject);
	}
	else
	{
		TRACE("CLEAR HIGH\n");
			// 清除剩余的高亮条
		::FillRect(hdc, &rcItem, (HBRUSH)m_BackBrushNormal.m_hObject);
	}

		// 总是要写没有背景的文本
	::SetBkMode(hdc, TRANSPARENT);
	::SetTextColor(hdc,colText);
	CString str = m_pTree->GetItemText(hItem);
	::DrawText(hdc, str, -1, &rcItem, DT_VCENTER | DT_SINGLELINE | DT_WORD_ELLIPSIS);
	
	int nNew = 20;
	CString strNew = _T("");
	strNew.Format(_T("(%d)"),nNew);
	::SetTextColor(hdc,RGB(0,0,255));
	RECT rc = rcItem;
	rc.left = rcItem.right+2;
	rc.right = rc.left + 100;
	::FillRect(hdc, &rc, (HBRUSH)m_BackBrushNormal.m_hObject);
	::DrawText(hdc,strNew, -1, &rc, DT_VCENTER | DT_SINGLELINE | DT_WORD_ELLIPSIS);
}      
需要说明的是如果你想支持拖放,那么你必需要做一些修改......
关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 myfaq.com.cn All rights reserved. www.myfaq.com.cn 版权所有