重载MFC树控件,树控件背景透明

羊儿葫芦贝尔 2013-03-29 05:54:18
各位好,我重载树控件CTreeCtrl类,想让树控件的背景透明化,这个要怎么实现呢?之前没有做过,类似的资料也比较少。 我尝试在OnCtlColor中用pDc->SetBkMode(TRANSPARENT)去设置,但是好像树控件并不支持。
...全文
264 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2013-06-01
  • 打赏
  • 举报
回复
您好 我是本版版主 此帖已多日无人关注 请您及时结帖 如您认为问题没有解决可按无满意结帖处理 另外本版设置了疑难问题汇总帖 并已在版面置顶 相关规定其帖子中有说明 您可以根据规定提交您帖子的链接 如您目前不想结帖只需回帖说明 我们会删除此结帖通知 见此回复三日内无回应 我们将强制结帖 相关规定详见界面界面版关于版主结帖工作的具体办法
路远兮 2013-04-01
  • 打赏
  • 举报
回复
这个我也想知道,我想给树控件换个背景图,最起码也是透明的,查了资料是要重载CTreeCtl类,但是具体怎么搞,求指教
lqfcu2 2013-04-01
  • 打赏
  • 举报
回复
引用 5 楼 dongchongyang 的回复:
回复下2楼“OnCtlColor中用pDc->SetBkMode(TRANSPARENT);树控件是用不了的。 你可以重载CTreeCtrl类,添加WM_ERASEBKGND消息,在消息响应函数里面实现。” 在OnEraseBKgnd里我也试过了,没有效果,背景还是不透明,请问有什么别的方法,指教一哈?
试试用树控件,覆盖区域的父容器的背景 来当树控件的背景 这样看着就是透明了~~
羊儿葫芦贝尔 2013-04-01
  • 打赏
  • 举报
回复
回复下2楼“OnCtlColor中用pDc->SetBkMode(TRANSPARENT);树控件是用不了的。 你可以重载CTreeCtrl类,添加WM_ERASEBKGND消息,在消息响应函数里面实现。” 在OnEraseBKgnd里我也试过了,没有效果,背景还是不透明,请问有什么别的方法,指教一哈?
schlafenhamster 2013-04-01
  • 打赏
  • 举报
回复
参考: BOOL cTree::OnEraseBkgnd(CDC* pDC) { CRect rc; GetClientRect(&rc); CDC MemDC; MemDC.CreateCompatibleDC(pDC); HBITMAP hBmp=(HBITMAP)MemDC.SelectObject(m_bitmap.m_hObject); pDC->StretchBlt(0,0,rc.Width(),rc.Height(),&MemDC,0,0,320,240,SRCCOPY); // set back (HBITMAP)MemDC.SelectObject(hBmp); // free DeleteObject(MemDC); // return TRUE; } // void cTree::OnPaint() { CPaintDC dc(this); // get size CRect rc; GetClientRect(&rc); // Create a compatible memory DC CDC memDC; memDC.CreateCompatibleDC(&dc); // Select a compatible bitmap into the memory DC CBitmap bitmap; bitmap.CreateCompatibleBitmap( &dc, rc.Width(), rc.Height()); HBITMAP oldBmp=(HBITMAP)memDC.SelectObject(&bitmap); // Let the control draws the tree. DefWindowProc(WM_PAINT, (WPARAM)memDC.m_hDC, 0 ); // 'and' to the background dc.BitBlt(0,0,rc.Width(),rc.Height(),&memDC,0,0,SRCAND); // set back memDC.SelectObject(oldBmp); // free DeleteObject(bitmap.m_hObject); DeleteObject(memDC); } //其中: CBitmap m_bitmap; 是 Tree的 背景位图。
羊儿葫芦贝尔 2013-04-01
  • 打赏
  • 举报
回复
引用 11 楼 lqfcu2 的回复:
引用 7 楼 dongchongyang 的回复:引用 6 楼 lqfcu2 的回复:引用 5 楼 dongchongyang 的回复:回复下2楼“OnCtlColor中用pDc->SetBkMode(TRANSPARENT);树控件是用不了的。 你可以重载CTreeCtrl类,添加WM_ERASEBKGND消息,在消息响应函数里面实现。” 在OnEraseBKgnd里……
能具体说说怎么做?
lqfcu2 2013-04-01
  • 打赏
  • 举报
回复
引用 7 楼 dongchongyang 的回复:
引用 6 楼 lqfcu2 的回复:引用 5 楼 dongchongyang 的回复:回复下2楼“OnCtlColor中用pDc->SetBkMode(TRANSPARENT);树控件是用不了的。 你可以重载CTreeCtrl类,添加WM_ERASEBKGND消息,在消息响应函数里面实现。” 在OnEraseBKgnd里我也试过了,没有效果,背景还是不透明,请问有什么别……

    PostMessage(Parent_Hwnd, WM_PrintClient, DC, prf_Client);
WM_PrintClient 消息可以把Parent_Hwnd的内容绘制到 DC中~~
羊儿葫芦贝尔 2013-04-01
  • 打赏
  • 举报
回复
引用 8 楼 schlafenhamster 的回复:
这个比较麻烦。 思路是,搞个 memDC ,让树先 paint 到这个 memDC (DefWindowProc(WM_PAINT,,,), 然后 把 树的 背景图 加上 去 (SCR_AND)
在网上刚看到一段代码,贴出来: void CMyTreeCtrl::OnPaint() { CPaintDC dc(this); // device context for painting // TODO: 在此处添加消息处理程序代码 // 不为绘图消息调用 CTreeCtrl::OnPaint() CDC dcMem; CClientDC dcParent(GetParent()); dcMem.CreateCompatibleDC(&dcParent); dcMem.SelectObject(theBmp); dc.SelectObject(GetStockObject(HOLLOW_BRUSH)); dc.SelectObject(theFont); dc.SetBkColor(CLR_NONE); dc.SetBkMode(TRANSPARENT); CRgn rgn; rgn.CreateRectRgnIndirect(&m_rcClient); dc.SelectClipRgn(&rgn); dc.BitBlt(0,0,m_rcClient.right,m_rcClient.bottom,&dcMem,m_rcWindow.left,m_rcWindow.top,SRCCOPY); HTREEITEM hItem=GetFirstVisibleItem(); HTREEITEM hItemTmp=hItem; RECT rcItemText; CString strItem; do { if (!hItem) { break; } hItemTmp=hItem; GetItemRect(hItem,&rcItemText,FALSE); strItem=GetItemText(hItem); rcItemText.left+=m_nItemTextMargin; rcItemText.right+=m_nItemTextMargin; while (hItemTmp=GetParentItem(hItemTmp)) { rcItemText.left+=GetIndent(); rcItemText.right+=GetIndent(); } rcItemText.left-=m_nLeftMargin; rcItemText.right-=m_nLeftMargin; dc.DrawText(strItem,&rcItemText,DT_LEFT|DT_SINGLELINE|DT_VCENTER); } while(hItem=GetNextVisibleItem(hItem)); } 源码地址:http://www.cnblogs.com/xuesongshu/archive/2013/03/21/2972593.html 我试了下,没有效果,树控件我是用动态创建的,不懂跟其他地方还有没有关系。
schlafenhamster 2013-04-01
  • 打赏
  • 举报
回复
这个比较麻烦。 思路是,搞个 memDC ,让树先 paint 到这个 memDC (DefWindowProc(WM_PAINT,,,), 然后 把 树的 背景图 加上 去 (SCR_AND)
羊儿葫芦贝尔 2013-04-01
  • 打赏
  • 举报
回复
引用 6 楼 lqfcu2 的回复:
引用 5 楼 dongchongyang 的回复:回复下2楼“OnCtlColor中用pDc->SetBkMode(TRANSPARENT);树控件是用不了的。 你可以重载CTreeCtrl类,添加WM_ERASEBKGND消息,在消息响应函数里面实现。” 在OnEraseBKgnd里我也试过了,没有效果,背景还是不透明,请问有什么别的方法,指教一哈? 试试用树控……
这是一个好思路,不过需要自己去对父类背景截屏然后贴图,好像有些难度~~
majun831112 2013-03-31
  • 打赏
  • 举报
回复
在vc++的教程中发现,树形结构中有个tv_item,其中一项是mask 解释是:结构成员有效性屏蔽位,不知道是用来干什么的。也不知怎么用啊。,能给讲讲吗
wawLwxj 2013-03-31
  • 打赏
  • 举报
回复
OnCtlColor中用pDc->SetBkMode(TRANSPARENT);树控件是用不了的。 你可以重载CTreeCtrl类,添加WM_ERASEBKGND消息,在消息响应函数里面实现。
羊儿葫芦贝尔 2013-03-30
  • 打赏
  • 举报
回复
没人回复么... 自己顶下...

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧