如何透明控件背景? 控件背景默认为灰色,如何设置为透明? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 有的控减本身能够透明,如CStatic有的控件可能要重载类,然后把OnEraseBkgnd设置一下 DirectDraw中可轻松实现。不会DirectX, 用win2000的函数AlphaBlend()是背景透明。重载控件的OnDraw()可以,直接把控件窗口和背景运算也可以 jennyvenus(jennyvenus)不对,你把CSTATIC放在一张色彩鲜明的位图上试试看 如果是标准控件的话可以用CTLColor消息相应一下,然后返回一个空Brush的句柄。 做一个SubClassing动作,如下:1.用GetWindowLong()获得控件的WndProc()入口指针,并保存(pOld);2.设计一个视窗函数MyWndProc(),用SetWindowLong()把它放到控件的WndProc()位置,你的视窗函数内做如下处理: HRESULT hRet=1; switch(uMsg) { case WM_ERASEBKGND: break; default: hRet=(*pOld)(....); } return hRet;通过以上拦截WM_ERASEBKGND处理--即:不按默认刷新背景,也就是透明。如果你想在背景上贴一张画,....,这就是换肤术的原理;3.如果在SDI的CMyView::OnEraseBkgnd()中直接return true,相当于上述代码中的拦截WM_ERASEBKGND部分,结果会怎样!!! 响应WM_CTLCOLOR消息;.. CYourDlg::OnCtlColor(...){ ... // 加入: if(nCtlColor == IDC_STATIC) { pDC->SetBkMode(TRANSPARENT); return NULL; } ...} HBRUSH CTongjiView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CFormView::OnCtlColor(pDC, pWnd, nCtlColor); if( nCtlColor == CTLCOLOR_STATIC ) { TCHAR plszClassName[255]; GetClassName(pWnd->m_hWnd,plszClassName,255); if(_tcscmp(plszClassName,TRACKBAR_CLASS)==0) return CFormView::OnCtlColor(pDC, pWnd, nCtlColor); pDC->SetTextColor( RGB( 36, 73, 100 ) ); //×ÖÌåÑÕÉ« pDC->SetBkMode(TRANSPARENT); //±³¾°Ä£Ê½ return HBRUSH(m_HollowBrush); } return hbr;} void CTongjiView::OnDraw(CDC* pDC) { DrawBackgroud(pDC); DrawText(pDC);} void CTongjiView::DrawBackgroud(CDC *pDC){ if(m_bDrawBG) { //IPicture *m_pPic; IStream *pStm; CFileStatus fstatus; CFile file; LONG cb; if (file.Open("banner.jpg",CFile::modeRead)&&file.GetStatus("banner.jpg",fstatus)&& ((cb = fstatus.m_size) != -1)) { HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb); LPVOID pvData = NULL; if (hGlobal != NULL) { if ((pvData = GlobalLock(hGlobal)) != NULL) { file.ReadHuge(pvData, cb); GlobalUnlock(hGlobal); CreateStreamOnHGlobal(hGlobal, TRUE, &pStm); if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&m_pPic))) { OLE_XSIZE_HIMETRIC hmWidth; OLE_YSIZE_HIMETRIC hmHeight; m_pPic->get_Width(&hmWidth); m_pPic->get_Height(&hmHeight); //double fX,fY; //fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/((double)pDC->GetDeviceCaps(HORZSIZE)*100.0); //fY = (double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/((double)pDC->GetDeviceCaps(VERTSIZE)*100.0); if(FAILED(m_pPic->Render(*pDC,0,0,795,100,0,hmHeight,hmWidth,-hmHeight,NULL))) AfxMessageBox("Failed To Render The picture!"); m_bDrawBG = FALSE; } else AfxMessageBox("Error Loading Picture From Stream!"); } } } else AfxMessageBox("Can't Open Image File!"); } else{ OLE_XSIZE_HIMETRIC hmWidth; OLE_YSIZE_HIMETRIC hmHeight; m_pPic->get_Width(&hmWidth); m_pPic->get_Height(&hmHeight); //m_pPic->Render(*pDC,0,70,794,60,0,hmHeight,hmWidth,-hmHeight,NULL); m_pPic->Render(*pDC,0,0,795,100,0,hmHeight,hmWidth,-hmHeight,NULL); }} 我的一个软件中使用了透明的CStatic,CEdit,CButton,CCombox如果需要,请与我联系。只要你相信。绝对不会浪费你的时间与精力。 JRTPLIB传送h.264视频 wince6.0下数据库连接问题 电脑产生随机数存入数据库 cfiledialog导致程序关闭的问题 CString如何限制读入,比如读入6个字符 CTabCtrl怎么做鼠标双击选项卡就关闭页面的操作,就象遨游一样的 100分求VC6英文企业版,同时交友 得到了文件的全路径,如何判断此文件是否为*.swf文件? 不好意思 ,又是菜鸟问题! GDI 图像处理问题 请帮我认识一下ActiveX ? 请各位指教一下,CClientDC和CPaintDC有什么区别?
有的控件可能要重载类,然后把OnEraseBkgnd设置一下
不会DirectX, 用win2000的函数AlphaBlend()是背景透明。重载控件的OnDraw()可以,直接把控件窗口和背景运算也可以
1.用GetWindowLong()获得控件的WndProc()入口指针,并保存(pOld);
2.设计一个视窗函数MyWndProc(),用SetWindowLong()把它放到控件的WndProc()位置,你的视窗函数内做如下处理:
HRESULT hRet=1;
switch(uMsg)
{
case WM_ERASEBKGND:
break;
default:
hRet=(*pOld)(....);
}
return hRet;
通过以上拦截WM_ERASEBKGND处理--即:不按默认刷新背景,也就是透明。如果你想在背景上贴一张画,....,这就是换肤术的原理;
3.如果在SDI的CMyView::OnEraseBkgnd()中直接return true,相当于上述代码中的拦截WM_ERASEBKGND部分,结果会怎样!!!
.. CYourDlg::OnCtlColor(...)
{
...
// 加入:
if(nCtlColor == IDC_STATIC)
{
pDC->SetBkMode(TRANSPARENT);
return NULL;
}
...
}
{
HBRUSH hbr = CFormView::OnCtlColor(pDC, pWnd, nCtlColor);
if( nCtlColor == CTLCOLOR_STATIC )
{
TCHAR plszClassName[255];
GetClassName(pWnd->m_hWnd,plszClassName,255);
if(_tcscmp(plszClassName,TRACKBAR_CLASS)==0)
return CFormView::OnCtlColor(pDC, pWnd, nCtlColor);
pDC->SetTextColor( RGB( 36, 73, 100 ) ); //×ÖÌåÑÕÉ«
pDC->SetBkMode(TRANSPARENT); //±³¾°Ä£Ê½
return HBRUSH(m_HollowBrush);
} return hbr;
}
{
DrawBackgroud(pDC);
DrawText(pDC);
}
{
if(m_bDrawBG) {
//IPicture *m_pPic;
IStream *pStm;
CFileStatus fstatus;
CFile file;
LONG cb;
if (file.Open("banner.jpg",CFile::modeRead)&&file.GetStatus("banner.jpg",fstatus)&&
((cb = fstatus.m_size) != -1))
{
HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, cb);
LPVOID pvData = NULL;
if (hGlobal != NULL)
{
if ((pvData = GlobalLock(hGlobal)) != NULL)
{
file.ReadHuge(pvData, cb);
GlobalUnlock(hGlobal);
CreateStreamOnHGlobal(hGlobal, TRUE, &pStm);
if(SUCCEEDED(OleLoadPicture(pStm,fstatus.m_size,TRUE,IID_IPicture,(LPVOID*)&m_pPic)))
{
OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight;
m_pPic->get_Width(&hmWidth);
m_pPic->get_Height(&hmHeight);
//double fX,fY;
//fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/((double)pDC->GetDeviceCaps(HORZSIZE)*100.0);
//fY = (double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/((double)pDC->GetDeviceCaps(VERTSIZE)*100.0);
if(FAILED(m_pPic->Render(*pDC,0,0,795,100,0,hmHeight,hmWidth,-hmHeight,NULL)))
AfxMessageBox("Failed To Render The picture!");
m_bDrawBG = FALSE;
}
else
AfxMessageBox("Error Loading Picture From Stream!");
}
}
}
else
AfxMessageBox("Can't Open Image File!");
}
else{
OLE_XSIZE_HIMETRIC hmWidth;
OLE_YSIZE_HIMETRIC hmHeight;
m_pPic->get_Width(&hmWidth);
m_pPic->get_Height(&hmHeight);
//m_pPic->Render(*pDC,0,70,794,60,0,hmHeight,hmWidth,-hmHeight,NULL);
m_pPic->Render(*pDC,0,0,795,100,0,hmHeight,hmWidth,-hmHeight,NULL);
}
}
如果需要,请与我联系。
只要你相信。绝对不会浪费你的时间与精力。