求助!!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;
}
对话框 构造:
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);
}