一直没能找到答案的经典问题:静态控件Static 怎么才能真正的透明显示? 就象MSN中,当别人输入消息时,对话框的下面就显示XX在输入消息但是那个Static又不改变主对话框的背景图片我怎么设置Static的属性都不行。总是出现灰色的static。怎么才能让自己的static完全透明的只显示其中的文字而不遮盖背景图片??? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 显示文字时,用SetBkMode(TRANSPARENT);可以响应对话框的OnCtlColor事件,判断控件是否为静态框,是则设置背景模式为透明 把对话框的背景复制一份(因为对话框本身的DC包含有CStatic的内容,需要用内存DC/内存位图),在CStatic的WM_ERASEBKGND消息响应时复制到CStatic的DC,返回TRUE;如果你对效果要求很苛刻,只有这个方法 添加OnCtlColor事件: if(nCtlColor == CTLCOLOR_STATIC) { pDC->SetBkMode (TRANSPARENT); return (HBRUSH) GetStockObject (HOLLOW_BRUSH);; } BEGIN_MESSAGE_MAP(CMyStatic, CStatic) //{{AFX_MSG_MAP(CMyStatic) ON_WM_ERASEBKGND() ON_WM_CTLCOLOR_REFLECT() //}}AFX_MSG_MAPEND_MESSAGE_MAP()BOOL CMyHyperLink::OnEraseBkgnd(CDC* pDC) { // TODO: Add your message handler code here and/or call default if (m_pParentDC && m_pParentDC->GetSafeHdc()) { CRect rc; GetWindowRect(rc); GetParent()->ScreenToClient(rc); pDC->BitBlt(0, 0, rc.Width(),rc.Height(), m_pParentDC,rc.left,rc.top,SRCCOPY); return TRUE; } return FALSE;}BRUSH CMyStatic::CtlColor(CDC* pDC, UINT nCtlColor) { UNUSED_ALWAYS(nCtlColor); pDC->SetBkMode(TRANSPARENT); return ((HBRUSH)GetStockObject(HOLLOW_BRUSH));}.....用法 CDC* pDC = GetDC(); m_MemDC.CreateCompatibleDC(pDC); m_Bitmap.CreateCompatibleBitmap(pDC, rc.Width(), rc.Height()); m_MemDC.SelectObject(&m_Bitmap);//内存位图不能选出来 ReleaseDC(pDC); m_cStatic.m_pParentDC = &m_MemDC; 不填充背景不就可以了阿,另外显示文字时,用SetBkMode(TRANSPARENT); 补充一点,m_cStatic.SetWindowText改变文本之后需要调用Invalidate(TRUE); OnNewDocument 不自动调用,必须要我点击菜单->新建的时候再调用,如何做? OCX控件如何在不是窗口类中使用? 请教一个串口搜索的问题。 冒个泡~ 怎么样打开IE的选项对话框中的安全属性页?? 什么是系统注册区?? recv阻塞线程的问题 学校里要开数学建摸课,各位前辈说说看有没有必要去听听? 很简单的问题 perl eval 学习及总结 请教vc中用ADO调用oralce中带参数的存储过程问题? 天杀的SDK 绘图问题 我没辙了
可以响应对话框的OnCtlColor事件,判断控件是否为静态框,是则设置背景模式为透明
if(nCtlColor == CTLCOLOR_STATIC)
{
pDC->SetBkMode (TRANSPARENT);
return (HBRUSH) GetStockObject (HOLLOW_BRUSH);;
}
//{{AFX_MSG_MAP(CMyStatic)
ON_WM_ERASEBKGND() ON_WM_CTLCOLOR_REFLECT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()BOOL CMyHyperLink::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
if (m_pParentDC && m_pParentDC->GetSafeHdc())
{
CRect rc;
GetWindowRect(rc);
GetParent()->ScreenToClient(rc);
pDC->BitBlt(0, 0, rc.Width(),rc.Height(), m_pParentDC,rc.left,rc.top,SRCCOPY);
return TRUE;
} return FALSE;
}
BRUSH CMyStatic::CtlColor(CDC* pDC, UINT nCtlColor)
{
UNUSED_ALWAYS(nCtlColor);
pDC->SetBkMode(TRANSPARENT);
return ((HBRUSH)GetStockObject(HOLLOW_BRUSH));
}
.....
用法 CDC* pDC = GetDC();
m_MemDC.CreateCompatibleDC(pDC);
m_Bitmap.CreateCompatibleBitmap(pDC, rc.Width(), rc.Height());
m_MemDC.SelectObject(&m_Bitmap);//内存位图不能选出来
ReleaseDC(pDC);
m_cStatic.m_pParentDC = &m_MemDC;