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

原创 2003年01月02日 09:21:00
下载演示程序        http://www.foolab.com/download/cooltree_r.zip
下载源代码           http://www.foolab.com/download/cooltree.zip
下载纷飞(Outplay...)http://www.foolab.com/download/outplay_1.03.zip
 
动机(Motivation)
 
当我利用业余时间开发完成纷飞(Outplay...),类似Outlook的客户端的邮件程序后,
我终于轻松地跳了起来,但是就在我的脚刚着地时,我突然看到我面前使用的Outlook,
单列使用不同的颜色显示新邮件,于是我决定,我也该让我的Outplay如此...
 
于是,我立刻查找了codeguru里的关于CTreeView的一些文章,我找到了一些合适的信
息,大该花了我30分钟左右的时间,我让我的纷飞(Outplay...)也出现了类似的效果。
让我慢慢的告诉你,你也会发现它是如此的简单和方便,仅仅是在你的CTreeView中添加
几行的代码
 
你应该怎么做呢?(Follow me)
 
首先假定你的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:
   // Need to process this case and set pResult to CDRF_NOTIFYITEMDRAW,
   // otherwise parent will never receive CDDS_ITEMPREPAINT notification. (GGH)
   *pResult = CDRF_NOTIFYITEMDRAW;
 
   // reposuition the viewport so the TreeCtrl DefWindowProc doesn't draw to viewport 0/0
   //::SetViewportOrgEx(pCustomDraw->nmcd.hdc, /*m_nOffset*/0, 0, NULL);
   break;
 
  case CDDS_ITEMPREPAINT:
   // set the background and foregroundcolor of the item to the background, so you don't see the default drawing of the text
   //get item state(focus,selected..), because it will be drawn of us
   nItemState = pCustomDraw->nmcd.uItemState;
 
   pCustomDraw->nmcd.uItemState &= ~CDIS_FOCUS;
   pCustomDraw->clrText = m_colHilightText;
   // remember the drawing rectangle of the item so we can draw it ourselves
   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)
{
 // if the item has got the focus, we have to draw sorouinding rectangle and fill a rect blue
 COLORREF colText = m_colText;
 
 if(nItemState & CDIS_FOCUS)
 {
  ::FillRect(hdc, &rcItem, (HBRUSH)m_BackBrush.m_hObject);
  // Add new focus rect code...
  ::DrawFocusRect( hdc, &rcItem);
  colText = m_colHilightText; //=:GetSysColor(COLOR_HIGHLIGHTTEXT);
 }
 else if(nItemState & CDIS_SELECTED)
 {
  ::FillRect(hdc, &rcItem, (HBRUSH)m_GrayBrush.m_hObject);
 }
 else
 {
  TRACE("CLEAR HIGH/n");
   // add this to clear leftover highlight bar
  ::FillRect(hdc, &rcItem, (HBRUSH)m_BackBrushNormal.m_hObject);
 }
 
  // always write text without background
 ::SetBkMode(hdc, TRANSPARENT);
 ::SetTextColor(hdc,colText);
 CString str = m_pTree->GetItemText(hItem);
 ::DrawText(hdc, str, -1, &rcItem, DT_VCENTER | DT_SINGLELINE | DT_WORD_ELLIPSIS);
 
// you may modify them according to your need
 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);
}
 
需要说明的是如果你支持拖放而且你需要做一些改变。
            愿你快乐 
            Lazen(Email:Outplay@foolab.com) 2002.12.29           

Ubuntu配置vim及不同语法显示不同颜色

第一步、安装vim 命令为:sudo apt-get install vim 第二步、更改vim的配置文件etc/vim命令为:(1)cd/etc/vim   (2)sudo gedit vimrc ...
  • sunfeilong1993
  • sunfeilong1993
  • 2013年11月20日 22:42
  • 2576

DataGridView 中单元格显示不一样颜色方法

1、DataGridView  中添加CellPainting事件方法 2、在CellPainting函数内部进行重绘
  • wangdaoyin2010
  • wangdaoyin2010
  • 2014年10月23日 14:49
  • 1820

TextView中的文本加效果,如设置不同颜色,大小或点击事件

方法一 利用HTML语言,改变文字颜色 例1: String str = "中软" + "国际"; TextView tv = new TextView(this); tv.set...
  • u012816314
  • u012816314
  • 2016年06月02日 17:40
  • 1242

在 Outlook 中,为什么附件有时候显示在邮件正文中,有时候显示在标题中?

原帖地址:http://support.microsoft.com/kb/2462816/zh-cn
  • broze
  • broze
  • 2014年05月16日 16:22
  • 41368

iOS开发 label上显示不同颜色不同大小的字

// 要显示不同颜色的数字     NSString *numberStr = [NSString stringWithFormat:@"%d",121]; // _myabel创建的label ...
  • syg90178aw
  • syg90178aw
  • 2015年01月20日 16:55
  • 2143

深度定制 UIButton 按钮 和label显示不同颜色

(1)label显示不同颜色 http://www.cnblogs.com/taintain1984/p/3550525.html self.title = @"For iOS...
  • u010828718
  • u010828718
  • 2015年04月02日 13:24
  • 1285

Ubuntu下使用ls命令显示文件颜色相关内容及修改

在Ubuntu下,使用ls命令显示目录下文件及文件夹时会先显示不同颜色,如下图所示: 如果知道了不同颜色分别代表的含义,那么对于我们查看目录下文件信息方便了很多,所以就搜索了...
  • star11053234
  • star11053234
  • 2013年03月16日 10:50
  • 9191

highcharts分段显示不同颜色

在做统计图的时候,碰到一个需求 类似如下: 就是在红色虚线框内的折线在不同区域用不同的颜色表示,并且是虚线。 开始定位为用highcharts库实现。确定用这个库后,开始在网上查资...
  • WHACKW
  • WHACKW
  • 2016年09月12日 10:19
  • 1529

一起学android之如何设置TextView中不同字段的字体颜色(22)

在这里先看看效果图: OK,有时候,在我们的项目中会要求TextView中文本有一部分的字体颜色不一样,这时我们应该使用 SpannableStringBuilder这个工具类,当然这个类...
  • GULINHAI12
  • GULINHAI12
  • 2015年03月12日 19:42
  • 3306

解决 outlook2007 邮件签名里面的图片只能显示一半 (有图有真相)

选中要在要插入图片的地方右键 将值调大 知道图片显示完全为止
  • zhouhaiqing0905
  • zhouhaiqing0905
  • 2014年02月21日 20:56
  • 3306
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Outlook风格的使用不同的颜色单列显示新邮件数
举报原因:
原因补充:

(最多只允许输入30个字)