WTL开发的WM程序,想做一个透明的Lable,处理了WM_CTLCOLORSTATIC,但是没能实现想要的效果。LRESULT CTestDlg::OnCtlColorStatic(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
SetBkMode((HDC)wParam, TRANSPARENT);
return (LRESULT)AtlGetStockBrush(NULL_BRUSH);
} 敬请大虾们指点一二。
{
SetBkMode((HDC)wParam, TRANSPARENT);
return (LRESULT)AtlGetStockBrush(NULL_BRUSH);
} 敬请大虾们指点一二。
CDCHandle dc = (HDC)wParam; dc.SetBkMode(TRANSPARENT); return (LRESULT)GetStockObject(NULL_BRUSH);
你是不是忘了给对话框贴背景了?
背景色使用低Alpha通道的颜色数,前景色采用高Alpha的通道数;使用UpdateLayeredWindow进行窗口的裁剪即可实现透明效果。
目前效果:
背景是一张BMP图片,在OnEraseBkgnd里面绘:
LRESULT OnEraseBkgnd(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
if ( NULL != m_pBgBmp )
{
CDCHandle dc((HDC)wParam);
CDC dcMem;
dcMem.CreateCompatibleDC(dc);
HBITMAP hOldBmp = dcMem.SelectBitmap(*m_pBgBmp);
SIZE sizeBmp;
m_pBgBmp->GetSize(sizeBmp);
dc.BitBlt(0, 0, sizeBmp.cx, sizeBmp.cy, dcMem, 0, 0, SRCCOPY);
dcMem.SelectBitmap(hOldBmp);
dcMem.DeleteDC();
} return 0;
}然后就是处理WM_CTLCOLORSTATIC消息了:
LRESULT CTestDlg::OnCtlColorStatic(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
SetBkMode((HDC)wParam, TRANSPARENT);
return (LRESULT)AtlGetStockBrush(NULL_BRUSH);
}目标就是为了实现Static Text控件只显示文字,背景就是对话框的背景。
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if(pWnd->GetDlgCtrlID() == IDC_STATICNAME || pWnd->GetDlgCtrlID() == IDC_STATICMSG)
{
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(0, 0, 255));
return HBRUSH(GetStockObject(HOLLOW_BRUSH));
}
return hbr;
}
// 这个是之前做的一个satic透明的,
注意一点.在给static设置内容后需要刷新一下static控件.否则出现内容叠加的效果,
GetDlgItem(IDC_STATICMSG)->GetWindowRect(&rcEdit);
SetDlgItemText(IDC_STATICMSG, m_Msg);
this->InvalidateRect(&rcEdit, TRUE);
低效率的办法是,你把下面图片的相关部分拷贝到你重载的CStatic内. 现在机器的cpu都够强,应该用着还不错.-------------------
BeauGauge Suite V2 虚拟仪表控件升级至2.2哦
www.beaugauge.com
HBRUSH CLabel::CtlColor(CDC* pDC, UINT nCtlColor)
{
// TODO: Change any attributes of the DC here
// TODO: Return a non-NULL brush if the parent's handler should not be called if (CTLCOLOR_STATIC == nCtlColor)
{
pDC->SelectObject(&m_font);
pDC->SetTextColor(m_crText);
pDC->SetBkMode(TRANSPARENT);
//设置透明
HBRUSH temp = HBRUSH(GetStockObject(HOLLOW_BRUSH));
return temp;
}
if (m_Type == Background)
{
if (!m_bState)
return m_hwndBrush;
} return m_hBrush;
}
WTL开发的WM程序,,,,WM程序,,,WM-->Windows Mobile Windows下实现的代码,楼上的代码基本上都可以实现,但是在WM下还是不可以。 有一种做法,就是获取父窗口的DC,把这个DC拷贝到CStatic控件的DC来,用这个DC来画CStatic控件的背景,这种做法在windows下可以达到目的,但是WM下还是无法达到目的。可能原因还是这个:
绘对话框背景的时候,根本就没有去画对话框上面那些控件所在位置,也就是那些控件的背景还是系统默认的背景。这个现象在WM下调试,通过设置断点,在模拟器可以看到。Windows下进断点后,程序界面就看不到了,无法确认是相同的表现。
个人理解:因为WM下画对话框时,控件虽在位置没有被画,所以通过父窗口DC画CStatic背景后出来的效果还是跟上面13楼的图一个效果。