求助!!static设置透明后,InvalidateRect(&rc,true);不起作用!
出现文字重影!【我把ON_WM_CTLCOLOR 屏蔽后,就无重影】
下面贴出部分代码,请大神们帮忙看看 谢谢~
afx_msg LRESULT CMySubDialog::OnSubMsg(WPARAM wParam, LPARAM lParam)
{
// 将 wParam 强制转换为 CString 类型
CString* strMsg = (CString*)wParam;
int len = strMsg->GetLength();
int i = strMsg->Find('@');
CString str1 = strMsg->Left(i);
CString str2 = strMsg->Right(len-1-i);
SetDlgItemText(IDC_STATIC1,str2);
SetDlgItemText(IDC_STATIC2,str1);
CRect rc,rc2;
GetDlgItem(IDC_STATIC1)->GetWindowRect(&rc);
//转换为相对坐标
ScreenToClient(&rc);
//刷新指定区域,注意第2个参数为真,即刷新背景
InvalidateRect(&rc,true);
GetDlgItem(IDC_STATIC2)->GetWindowRect(&rc2);
ScreenToClient(&rc2);
InvalidateRect(&rc2,true);
return 0;
}
HBRUSH CMySubDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)静态文本重影 透明
{
//控件背景透明处理开始 -----------------------------------------
if(nCtlColor== CTLCOLOR_STATIC) //如果是静态标签
{
pDC->SetBkMode(TRANSPARENT);//设置背景模式为透明
//pDC->SetTextColor(RGB(255,0,0));
return (HBRUSH)GetStockObject(NULL_BRUSH);//返回一个空画刷
}
//控件背景透明处理结束 -----------------------------------------
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
return hbr;
}
[解决办法]
再你SetDlgItemText更新static控件文本信息之前调用InvalidateRect()来刷新该区域
[解决办法]
你这个需求就是要带着背景重画一遍
[解决办法]
你这里自绘和文字又没有关系
你可以吧文字也在这里绘上不就可以了
[解决办法]
不是“InvalidateRect(&rc,true);不起作用”
而是 “return (HBRUSH)GetStockObject(NULL_BRUSH);//返回一个空画刷”缘故。
[解决办法]
我试了试,发现 static 重绘 次数 多余 对话框 重绘 次数。这样 就 隔一段时间 重影好一些,慢慢 又 厉害了。下面的例子 可以 说明问题。
void CStaticDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
static int i=0;
CString str;
str.Format("Timer Counter %d",i);
i++;
CRect rc;
m_Static.GetWindowRect(&rc);
ScreenToClient(&rc);
InvalidateRect(&rc);
SendMessage(WM_PAINT,0,0);
// not : UpdateWindow();
//
m_Static.SetWindowText(str);
//CDialog::OnTimer(nIDEvent);
}
使用 UpdateWindow();
没办法 保证 对话框 重绘一次 ,static 重绘一次。
只好使用:
SendMessage(WM_PAINT,0,0);
你也可以试试。
[解决办法]
GetDlgItem(IDC_STATIC1)->ReDrawWindow();
[解决办法]
我把代码补全:
HBRUSH CStaticDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if (CTLCOLOR_STATIC==nCtlColor)//静态文字控件
{
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(255,0,0));
return (HBRUSH)::GetStockObject(NULL_BRUSH);//透明画刷
}
// TODO: Return a different brush if the default is not desired
return hbr;
}
BOOL CStaticDlg::OnEraseBkgnd(CDC* pDC)
{
// TODO: Add your message handler code here and/or call default
CRect rc;
GetClientRect(&rc);
pDC->FillRect(&rc,&m_brushPat);
return TRUE;
return CDialog::OnEraseBkgnd(pDC);
}
对话框 init
// TODO: Add extra initialization here
//
LOGFONT lf;
::ZeroMemory(&lf,sizeof(lf));
CDC *pDC=GetDC();
lf.lfHeight = - MulDiv(32, pDC->GetDeviceCaps(LOGPIXELSX),72);
lf.lfCharSet= DEFAULT_CHARSET;// keep chinese !
lf.lfPitchAndFamily= FIXED_PITCH
[解决办法]
FF_DONTCARE;// fixed
m_Font.CreateFontIndirect(&lf);
m_Static.SetFont(&m_Font);
ReleaseDC(pDC);
SetTimer(1,500,0);
return TRUE; // return TRUE unless you set the focus to a control
对话框 构造:
CStaticDlg::CStaticDlg(CWnd* pParent /*=NULL*/)
: CDialog(CStaticDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CStaticDlg)
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
m_bitmap.LoadBitmap(IDB_BITMAP1);
m_brushPat.CreatePatternBrush(&m_bitmap);
}
头:
CBitmap m_bitmap;
CBrush m_brushPat;
CFont m_Font;
[解决办法]
“SendMessage(WM_PAINT,0,0);”让人 觉得 不规范。
其实 这个 问题 极简单 , 因为 我的 对话框 是 用 一个 PattenBrush 来 画背景的,所以 把 他 返回给 static 就可以了。
HBRUSH CStaticDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
if((CTLCOLOR_STATIC==nCtlColor) && (pWnd==&m_Static))
{
pDC->SetBkMode(TRANSPARENT);
pDC->SetTextColor(RGB(255,0,0));
return m_brushPat;// (HBRUSH)::GetStockObject(NULL_BRUSH);
}
// TODO: Return a different brush if the default is not desired
return hbr;
}
void CStaticDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
static int i=0;
CString str;
str.Format("Timer Counter %d",i);
i++;
i %= 11;
m_Static.SetWindowText(str);
CDialog::OnTimer(nIDEvent);
}
结果:
[解决办法]
再把这个控件的 移动 代码 附上:
BOOL CStaticDlg::PreTranslateMessage(MSG* pMsg)
{
// TODO: Add your specialized code here and/or call the base class
static CPoint ptLast;
if(pMsg->message == WM_MOUSEMOVE)
{
CPoint newPt;
if(GetAsyncKeyState(VK_LBUTTON))
{
CRect rc;
m_Static.GetWindowRect(&rc);
m_Static.ScreenToClient(&rc);
m_Static.MapWindowPoints(this,&rc);
newPt=pMsg->pt;
ScreenToClient(&newPt);
if(rc.PtInRect(newPt))
{
rc.OffsetRect(newPt.x-ptLast.x,newPt.y-ptLast.y);
ptLast = newPt;
m_Static.MoveWindow(&rc);
m_Static.RedrawWindow();
}
}
else
{
newPt=pMsg->pt;
ScreenToClient(&newPt);
ptLast = newPt;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
[解决办法]
来晚了,先mark,明天看, 呵呵
[解决办法]
代码已上传。“对话框里控件的透明”0分
http://download.csdn.net/detail/schlafenhamster/6541179
“一个不常见的 使 对话框 中 控件 透明的 方法。 通过 CreatePatternBrush 产生一个 背景画刷,对话框和 所有透明控件都使用这个 画刷,非常 简单 有效的 方法。”