MFC : Transparent TreeCtrl from CTreeCtrl

来源:互联网 发布:windows xp下载 msdn 编辑:程序博客网 时间:2024/06/10 01:00

今天和别人讨论问题, 说到他要在一个不透明的窗体上放一个透明的CTreeCtrl.

在CodeProject上找了些资料, 集成了一下. 实现了一个简单的效果.

效果图:


工程下载点: testTransparentTreeCtrl.zip

编译环境 : vs2010 vc++ MFC dlg

代码预览:

CTreeCtrl 的继承类

#pragma once// CMyTreeCtrlclass CMyTreeCtrl : public CTreeCtrl{DECLARE_DYNAMIC(CMyTreeCtrl)public:CMyTreeCtrl();virtual ~CMyTreeCtrl();protected:    //{{AFX_MSG(CMyTreeCtrl)    afx_msg HBRUSH CtlColor(CDC* pDC, UINT nCtlColor);    afx_msg void OnCustomdraw(NMHDR* pNMHDR, LRESULT* pResult);    //}}AFX_MSGDECLARE_MESSAGE_MAP()private:    CBrush m_Brush;};

// MyTreeCtrl.cpp : implementation file//#include "stdafx.h"#include "testTreeCtrl.h"#include "MyTreeCtrl.h"// CMyTreeCtrlIMPLEMENT_DYNAMIC(CMyTreeCtrl, CTreeCtrl)CMyTreeCtrl::CMyTreeCtrl(){}CMyTreeCtrl::~CMyTreeCtrl(){}BEGIN_MESSAGE_MAP(CMyTreeCtrl, CTreeCtrl)    //{{AFX_MSG_MAP(CMyTreeCtrl)    ON_WM_CTLCOLOR_REFLECT()    ON_NOTIFY_REFLECT(NM_CUSTOMDRAW, OnCustomdraw)    //}}AFX_MSG_MAPEND_MESSAGE_MAP()HBRUSH CMyTreeCtrl::CtlColor(CDC* pDC, UINT nCtlColor) {    m_Brush.DeleteObject();    m_Brush.CreateStockObject(HOLLOW_BRUSH);    pDC->SetBkMode(TRANSPARENT);    return (HBRUSH)m_Brush;}void CMyTreeCtrl::OnCustomdraw ( NMHDR* pNMHDR, LRESULT* pResult ){    NMLVCUSTOMDRAW* pLVCD = reinterpret_cast<NMLVCUSTOMDRAW*>( pNMHDR );    *pResult = CDRF_DODEFAULT;    switch (pLVCD->nmcd.dwDrawStage) {    case CDDS_ITEM:    case CDDS_POSTPAINT:    case CDDS_PREERASE:    case CDDS_POSTERASE:    case CDDS_ITEMPOSTPAINT :    case CDDS_ITEMPREERASE :    case CDDS_ITEMPOSTERASE :        break ;    case CDDS_PREPAINT :        *pResult = CDRF_NOTIFYITEMDRAW;        break ;    case CDDS_ITEMPREPAINT :        {            pLVCD->clrTextBk = RGB(130, 130, 130);            pLVCD->clrText = RGB(39, 39, 39);        }        break ;    }}// CMyTreeCtrl message handlers

调用端代码:

CMyTreeCtrl m_MyTreeCtrl;


void CtestTreeCtrlDlg::DoDataExchange(CDataExchange* pDX){    CDialogEx::DoDataExchange(pDX);    DDX_Control(pDX, IDC_MY_TREE, m_MyTreeCtrl);}

void CtestTreeCtrlDlg::TreeInit(){    HTREEITEM item = NULL;    HTREEITEM itemSub = NULL;            item = m_MyTreeCtrl.InsertItem(L"根节点", NULL);    if (NULL != item)    {        itemSub = m_MyTreeCtrl.InsertItem(L"子节点1", item);        itemSub = m_MyTreeCtrl.InsertItem(L"子节点2", item);        m_MyTreeCtrl.Expand(item, TVE_EXPAND);    }}




0 0
原创粉丝点击