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

狼爷359911741

狼爷359911741

2016-01-29 12:03

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

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

作者 Lazen

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/cyuyanjiaocheng/)


下载源代码

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/cyuyanjiaocheng/) 当利用业余时间开发完成纷飞(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 CRectrcItem;static intnItemState;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 HIGHn");// 清除剩余的高亮条::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);}      
需要说明的是如果你想支持拖放,那么你必需要做一些修改......
展开更多 50%)
分享

猜你喜欢

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

C语言教程 C语言函数
Outlook风格的单列使用不同的颜色显示新邮件数

Managed C++设计新邮件检查器

C语言教程 C语言函数
Managed C++设计新邮件检查器

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

QQ取消新邮件到达时提示信息

电脑入门
QQ取消新邮件到达时提示信息

Foxmail写新邮件的快捷键是什么

电脑网络
Foxmail写新邮件的快捷键是什么

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

outlook2007如何备份邮件数据库

电脑网络
outlook2007如何备份邮件数据库

不同枕头使用不同的清洁维护

生活常识
不同枕头使用不同的清洁维护

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

AutoCAD线条加粗秘诀

AutoCAD线条加粗秘诀

java加密枝术

java加密枝术
下拉加载更多内容 ↓