一直没能找到答案的经典问题:静态控件Static 怎么才能真正的透明显示?
就象MSN中,当别人输入消息时,对话框的下面就显示XX在输入消息
但是那个Static又不改变主对话框的背景图片
我怎么设置Static的属性都不行。总是出现灰色的static。
怎么才能让自己的static完全透明的只显示其中的文字而不遮盖背景图片???
问题点数:100、回复次数:7Top
1 楼happyparrot(快乐鹦鹉)回复于 2005-12-20 17:26:02 得分 20
显示文字时,用SetBkMode(TRANSPARENT);
可以响应对话框的OnCtlColor事件,判断控件是否为静态框,是则设置背景模式为透明Top
2 楼halleyw(自己动手)回复于 2005-12-20 17:28:52 得分 0
能否说的详细点?
有没有具体的例子或者代码段?
Top
3 楼goodboyws(深夜不眠者(VCMVP))回复于 2005-12-20 17:38:19 得分 20
把对话框的背景复制一份(因为对话框本身的DC包含有CStatic的内容,需要用内存DC/内存位图),在CStatic的WM_ERASEBKGND消息响应时复制到CStatic的DC,返回TRUE;
如果你对效果要求很苛刻,只有这个方法Top
4 楼Atomictry(天影)回复于 2005-12-20 17:41:12 得分 20
添加OnCtlColor事件:
if(nCtlColor == CTLCOLOR_STATIC)
{
pDC->SetBkMode (TRANSPARENT);
return (HBRUSH) GetStockObject (HOLLOW_BRUSH);;
} Top
5 楼goodboyws(深夜不眠者(VCMVP))回复于 2005-12-20 17:47:12 得分 20
BEGIN_MESSAGE_MAP(CMyStatic, CStatic)
//{{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;
Top
6 楼teli_eurydice(哭泣的仙人掌。。。。)回复于 2005-12-20 17:47:51 得分 20
不填充背景不就可以了阿,另外显示文字时,用SetBkMode(TRANSPARENT);
Top
7 楼goodboyws(深夜不眠者(VCMVP))回复于 2005-12-20 18:06:04 得分 0
补充一点,m_cStatic.SetWindowText改变文本之后需要调用Invalidate(TRUE);Top





