对话框贴图了,怎么才能把List 列表控件做成透明样式?如小弟我相册里的那个界面图
对话框贴图了,如何才能把List 列表控件做成透明样式??如我相册里的那个界面图
如题
------解决方案--------------------
你的问题好难. 你现在做到什么程度了? 要不使用DUIlib试试.
------解决方案--------------------
需要用专业的界面库等
------解决方案--------------------
要自绘 list了,派生一个CListCtrl,画背景的时候,把父窗口的区域背景画上去就行了,
------解决方案--------------------
通过标准控件配置应该没戏
而且这个要自绘都会比较麻烦
有很多细节需要处理
------解决方案--------------------
要取 父窗口的区域背景 是很难的.
我都不知道怎么截取窗口遮住那片区域的图片.
------解决方案--------------------
把父窗口上listctrl占据的区域背景做成一个背景画刷(这时要隐藏listctrl),在listctrl画背景是用这个画刷画背景就可以做到listctrl的背景和对话框一样。
------解决方案--------------------
整个背景图可以放在一个内存DC中,父窗口和子窗口的背景都来自于这个内存DC,这样随意取哪个 Rect 的背景都可以了。
------解决方案--------------------
给你一段产生背景画刷的代码:
//
CBrush* CTransListCtrlDlg::CreateBackgroundBrush(CDC* pDC,int ctrlId)
{
CDC dcMem;
dcMem.CreateCompatibleDC(pDC);//DeleteDC needed
CBitmap* pOldBitmap = dcMem.SelectObject(&m_bitmap);
// Retrieve the size of our bitmap...
BITMAP bmp;
m_bitmap.GetObject(sizeof(bmp),&bmp);
// and the size of our dlg's client area
CRect rect;
GetClientRect(&rect);
// listctrl has no border !
CRgn prgnClip;
CRect rc;
GetDlgItem(ctrlId)->GetWindowRect(&rc);
prgnClip.CreateRectRgnIndirect(rc);//DeleteObject needed
CDC* pDCex=GetDCEx(&prgnClip,DCX_PARENTCLIP);//ReleaseDC needed
// Fill the client area of dlg,include the ctrl with our bitmap
pDCex->StretchBlt(rect.left, rect.top,rect.Width(), rect.Height(),
&dcMem,0, 0, bmp.bmWidth, bmp.bmHeight,SRCCOPY);
// we create the background brush for ListCtrl
CDC dcMemCtrl;
dcMemCtrl.CreateCompatibleDC(pDCex);//DeleteDC needed
CBitmap CtrlBmp;//DeleteObject needed
CtrlBmp.CreateCompatibleBitmap(pDCex,rc.Width(),rc.Height());
pOldBitmap = dcMemCtrl.SelectObject(&CtrlBmp);
ScreenToClient(&rc);
MapWindowPoints(this,rc);
// afxDump << rc << " xx\n";
dcMemCtrl.BitBlt(0, 0, rc.Width(), rc.Height(), pDCex, rc.left, rc.top, SRCCOPY);
CBitmap *nowBMP=dcMemCtrl.SelectObject(pOldBitmap);
// copy to CB for checking
#ifndef TEST
OpenClipboard();
EmptyClipboard();
SetClipboardData(CF_BITMAP,nowBMP->GetSafeHandle());
CloseClipboard();
#endif
CBrush *pBackBr=new CBrush;
pBackBr->CreatePatternBrush(nowBMP);
//
DeleteObject(prgnClip);
DeleteObject(CtrlBmp);
ReleaseDC(pDCex);
dcMemCtrl.DeleteDC();
//
return pBackBr;
}
如题
------解决方案--------------------
你的问题好难. 你现在做到什么程度了? 要不使用DUIlib试试.
------解决方案--------------------
需要用专业的界面库等
------解决方案--------------------
要自绘 list了,派生一个CListCtrl,画背景的时候,把父窗口的区域背景画上去就行了,
------解决方案--------------------
通过标准控件配置应该没戏
而且这个要自绘都会比较麻烦
有很多细节需要处理
------解决方案--------------------
要取 父窗口的区域背景 是很难的.
我都不知道怎么截取窗口遮住那片区域的图片.
------解决方案--------------------
把父窗口上listctrl占据的区域背景做成一个背景画刷(这时要隐藏listctrl),在listctrl画背景是用这个画刷画背景就可以做到listctrl的背景和对话框一样。
------解决方案--------------------
整个背景图可以放在一个内存DC中,父窗口和子窗口的背景都来自于这个内存DC,这样随意取哪个 Rect 的背景都可以了。
------解决方案--------------------
给你一段产生背景画刷的代码:
//
CBrush* CTransListCtrlDlg::CreateBackgroundBrush(CDC* pDC,int ctrlId)
{
CDC dcMem;
dcMem.CreateCompatibleDC(pDC);//DeleteDC needed
CBitmap* pOldBitmap = dcMem.SelectObject(&m_bitmap);
// Retrieve the size of our bitmap...
BITMAP bmp;
m_bitmap.GetObject(sizeof(bmp),&bmp);
// and the size of our dlg's client area
CRect rect;
GetClientRect(&rect);
// listctrl has no border !
CRgn prgnClip;
CRect rc;
GetDlgItem(ctrlId)->GetWindowRect(&rc);
prgnClip.CreateRectRgnIndirect(rc);//DeleteObject needed
CDC* pDCex=GetDCEx(&prgnClip,DCX_PARENTCLIP);//ReleaseDC needed
// Fill the client area of dlg,include the ctrl with our bitmap
pDCex->StretchBlt(rect.left, rect.top,rect.Width(), rect.Height(),
&dcMem,0, 0, bmp.bmWidth, bmp.bmHeight,SRCCOPY);
// we create the background brush for ListCtrl
CDC dcMemCtrl;
dcMemCtrl.CreateCompatibleDC(pDCex);//DeleteDC needed
CBitmap CtrlBmp;//DeleteObject needed
CtrlBmp.CreateCompatibleBitmap(pDCex,rc.Width(),rc.Height());
pOldBitmap = dcMemCtrl.SelectObject(&CtrlBmp);
ScreenToClient(&rc);
MapWindowPoints(this,rc);
// afxDump << rc << " xx\n";
dcMemCtrl.BitBlt(0, 0, rc.Width(), rc.Height(), pDCex, rc.left, rc.top, SRCCOPY);
CBitmap *nowBMP=dcMemCtrl.SelectObject(pOldBitmap);
// copy to CB for checking
#ifndef TEST
OpenClipboard();
EmptyClipboard();
SetClipboardData(CF_BITMAP,nowBMP->GetSafeHandle());
CloseClipboard();
#endif
CBrush *pBackBr=new CBrush;
pBackBr->CreatePatternBrush(nowBMP);
//
DeleteObject(prgnClip);
DeleteObject(CtrlBmp);
ReleaseDC(pDCex);
dcMemCtrl.DeleteDC();
//
return pBackBr;
}