重载MFC树控件,树控件背景透明 各位好,我重载树控件CTreeCtrl类,想让树控件的背景透明化,这个要怎么实现呢?之前没有做过,类似的资料也比较少。 我尝试在OnCtlColor中用pDc->SetBkMode(TRANSPARENT)去设置,但是好像树控件并不支持。MFC CTreeCtl 树 背景透明 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 OnCtlColor中用pDc->SetBkMode(TRANSPARENT);树控件是用不了的。你可以重载CTreeCtrl类,添加WM_ERASEBKGND消息,在消息响应函数里面实现。 在vc++的教程中发现,树形结构中有个tv_item,其中一项是mask 解释是:结构成员有效性屏蔽位,不知道是用来干什么的。也不知怎么用啊。,能给讲讲吗 这个我也想知道,我想给树控件换个背景图,最起码也是透明的,查了资料是要重载CTreeCtl类,但是具体怎么搞,求指教 回复下2楼“OnCtlColor中用pDc->SetBkMode(TRANSPARENT);树控件是用不了的。你可以重载CTreeCtrl类,添加WM_ERASEBKGND消息,在消息响应函数里面实现。” 在OnEraseBKgnd里我也试过了,没有效果,背景还是不透明,请问有什么别的方法,指教一哈? 这个比较麻烦。思路是,搞个 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我试了下,没有效果,树控件我是用动态创建的,不懂跟其他地方还有没有关系。 http://www.cnblogs.com/xuesongshu/archive/2013/03/21/2972593.html PostMessage(Parent_Hwnd, WM_PrintClient, DC, prf_Client);WM_PrintClient 消息可以把Parent_Hwnd的内容绘制到 DC中~~ 参考: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的 背景位图。 用SDK怎么实现子窗体的几种排列方式? 关于一个两程序同时操作一个数据库的的问题,帮忙解答,谢谢! 一个SOCKET通讯程序 大家的IOCP的 accept 都是 AcceptEx 么? 在单文档里使用循环链表那种最好? 一个奇怪的问题,请高手指教!! Visual C++ 中加入CSplitterWnd 关于slider的消息处理时间,求大神指点 今年35岁了,做vc++6年了,还没有确定方向,该往哪里走? 怎么样用MFC或C通过exchange server 在后台发邮件 能ping通连接不上? 如何给远程listctrl发送右键消息,弹出菜单?
你可以重载CTreeCtrl类,添加WM_ERASEBKGND消息,在消息响应函数里面实现。
你可以重载CTreeCtrl类,添加WM_ERASEBKGND消息,在消息响应函数里面实现。” 在OnEraseBKgnd里我也试过了,没有效果,背景还是不透明,请问有什么别的方法,指教一哈?
思路是,搞个 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我试了下,没有效果,树控件我是用动态创建的,不懂跟其他地方还有没有关系。
WM_PrintClient 消息可以把Parent_Hwnd的内容绘制到 DC中~~
{
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的 背景位图。