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

2016-01-29 12:03 100 1 收藏

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

【 tulaoshi.com - C语言心得技巧 】

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

作者 Lazen


下载源代码

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

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

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

该怎么做呢?(as below)

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

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com)
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);}      
需要说明的是如果你想支持拖放,那么你必需要做一些修改......

来源:http://www.tulaoshi.com/n/20160129/1484417.html

延伸阅读
标签: Web开发
    CSS的写法可以用以下的几种方法实现:     (1)使用Embed(嵌入样式单)排版样式:     即将CSS代码直接插入每个页面的HTML的head区,就象上一节看到的。使用style.../style标签。例如: style type="text/css" !-- h2 { font-family: "宋体"; font-size: 12pt; font-style: italic...
    CSS的写法可以用以下的几种方法实现:     (1)使用Embed(嵌入样式单)排版样式:     即将CSS代码直接插入每个页面的HTML的<head区,就象上一节看到的。使用<style...</style标签。例如: <style type="text/css" <!-- h2 { font-family: "宋体"; font-size: 12...
outlook怎么发邮件   设置Outlook Express软件来收发邮件,以中文版Outlook Express 6为例: 步骤1、打开Outlook Express后,单击窗口中的工具菜单,选择帐户。 步骤2、点击邮件标签,点击右侧的添加按钮,在弹出的菜单中选择邮件。 步骤3、弹出的对话框中,根据提示,输入显示名,然后点击下一步。 步...
标签: excel
Excel怎样设置不同数据显示不同颜色   例子说明:在工资表中让大于或等于2000元的工资总额以红色显示,大于或等于1500元的工资总额以绿色显示,低于1000元的工资总额以蓝色显示,其它的就默认的黑色显示。 具体操作步骤: 1、首先,将大于或等于2000元的工资总额设置为红色。选中所有员工的工资总额; 2、单击菜单栏...
Outlook Express邮件应用技巧 收件人不是我拒收 很多朋友都被垃圾邮件所困扰,因为经常可以收到通过群发功能给发送的垃圾邮件,那么能不能在收邮件的时候,设定只要E-mail的收件人不是自己的话,就直接把邮件从服务器上删除呢?当然可以,在outlook Express里面很容易实现,只需要设定以下邮件规则即可: 1、选择菜单上的工具&r...

经验教程

676

收藏

84
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部