VC显示问题!

ywolf0214 2008-05-04 02:16:36
我建立一个MFC对话框,在背景上设置了一张图片,然后将static控件放在图片上面,在static控件里动态显示时间,因为要将static设置为透明,显示背景图片,不显示自己的灰色的背景,所以我自己重载了static类Mystatic,并添加Mystatic变量m_ShowTime,用函数m_ShowTime.Invalidate(1)来更新static的内容,奇怪的是static里的时间是更新了,但是时间在背景上显示后会覆盖前面显示的时间,这样就看到的字就花了。我自己想了一下是不是背景图片没有刷新导致的?请高手指点该怎么解决,谢谢!
...全文
159 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
ywolf0214 2008-05-05
  • 打赏
  • 举报
回复
OK!成功,谢谢!结贴!
Eleven 2008-05-05
  • 打赏
  • 举报
回复
可以
ywolf0214 2008-05-05
  • 打赏
  • 举报
回复
好,我试试看……
对了,我没有用加载位图的语句
m_Bitmap.LoadBitmap(IDB_BITMAP1);
m_Brush.CreatePatternBrush(&m_Bitmap);
我是直接用控件方式拖拽到对话框的。应该也可以吧?
Kudeet 2008-05-04
  • 打赏
  • 举报
回复
以下是我的代码,测试通过,没有闪烁的问题,你只需在头文件添加变量的定义,以及向资源添加IDB_BITMAP1的位图。

BOOL CTRANSDLGDlg::OnInitDialog()
{
CDialog::OnInitDialog();

//.............

m_Bitmap.LoadBitmap(IDB_BITMAP1);
m_Brush.CreatePatternBrush(&m_Bitmap);

::SetTimer(m_hWnd, 1000, 1000, NULL);

return TRUE;
}
HBRUSH CTRANSDLGDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
if (nCtlColor == CTLCOLOR_DLG)
return m_Brush;

HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

int nID = pWnd->GetDlgCtrlID();
pDC->SetBkMode(OPAQUE);
if(nID == IDC_STATIC1) //对指定的控件设属性
{

pDC->SetBkMode(TRANSPARENT);
return HBRUSH(GetStockObject(NULL_BRUSH));
}

return hbr;
}

void CTRANSDLGDlg::OnTimer(UINT nIDEvent)
{
if (nIDEvent == 1000)
{
CTime time = CTime::GetCurrentTime();
CString str = time.Format(_T("%A, %B %d, %Y, %S"));

CRect rc;
GetDlgItem(IDC_STATIC1)->GetWindowRect(&rc);
ScreenToClient(&rc);
InvalidateRect(rc);

GetDlgItem(IDC_STATIC1)->SetWindowText(str);
}

CDialog::OnTimer(nIDEvent);
}
cnzdgs 2008-05-04
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 ywolf0214 的回复:]
还是不行,按你那样改的……
还是现在的会覆盖以前的产生重影。哎……
[/Quote]
你应该是在OnTimer中更改显示时间吧?在OnTimer中先用m_ShowTime.SetWindowText改变要显示的文字,然后执行我在7楼给出的代码,肯定可以。
ywolf0214 2008-05-04
  • 打赏
  • 举报
回复
哎,刷新真的那么难么?
ywolf0214 2008-05-04
  • 打赏
  • 举报
回复
To laiyiling:
我开始也试着那么做了,但是却透明不了,所以不得不自己重载static类,重载后就可以实现透明了。
ywolf0214 2008-05-04
  • 打赏
  • 举报
回复
还是不行,按你那样改的……
还是现在的会覆盖以前的产生重影。哎……
cnzdgs 2008-05-04
  • 打赏
  • 举报
回复
RECT rt;
m_ShowTime.GetWindowRect(&rt);
ScreenToClient(&rt);
InvalidateRect(&rt);
用InvalidateRect就不用Invalidate了。
ywolf0214 2008-05-04
  • 打赏
  • 举报
回复
LPRECT lpRect;
m_ShowTime.GetClientRect (lpRect);
this->InvalidateRect (lpRect,1);
m_ShowTime.RePaint();
m_ShowTime.Invalidate(1);
这样写对么?
ywolf0214 2008-05-04
  • 打赏
  • 举报
回复
楼上两位都推荐用InvalidateRect来刷新,我也试过,好像不行。现在再试试吧,怎么得到那个区域呢?
还有,用了invalidaterect还需要用invalidate吗?
cnzdgs 2008-05-04
  • 打赏
  • 举报
回复
可以在每次显示时调一下对话框类的InvalidateRect刷新static控件矩形区域。
debehe 2008-05-04
  • 打赏
  • 举报
回复
刷新问题,你可以在m_ShowTime.Invalidate(1)时刷新一下父窗口的static所在的矩形区域InvalidateRect
Kudeet 2008-05-04
  • 打赏
  • 举报
回复
这样做透明:
HBRUSH CMydilog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
int nID = pWnd->GetDlgCtrlID();
pDC->SetBkMode(OPAQUE);
if(nID == IDC_STATIC1) //对指定的控件设属性
{
pDC->SetBkMode(TRANSPARENT);
return HBRUSH(GetStockObject(HOLLOW_BRUSH));
}
return hbr;
}
ywolf0214 2008-05-04
  • 打赏
  • 举报
回复
怎么没人回答啊!顶顶顶~~~~

15,979

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 界面
社区管理员
  • 界面
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧