CDC DrawText 字体的显示 切换界面时会有闪烁,如何解决?

yu3350360 2011-01-17 06:27:41
如题目
建立了一个对话框,有字体显示,有图片显示,Button控制图片切换,当切换图片时 字体会有闪烁的情况。
有好的解决办法嘛?
明天看答案。
...全文
342 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
向立天 2011-01-18
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 yu3350360 的回复:]
引用 9 楼 xianglitian 的回复:
OnBnClickedButleft()
这个函数里怎么会调用
CGVisitDlg::OnPaint();

在CGVisitDlg::OnPaint()加了如下的代码,所以才在这里调用的。

C/C++ code

CDC *pfdc;
CRect mRect[11]; //主菜单界面CRect 参数

int ip; ……
[/Quote]
首先OnPaint不应该被主动调用
然后OnPaint里面应该用CPaintDC
你这样用存在很大问题
yu3350360 2011-01-18
  • 打赏
  • 举报
回复
就是切换图片之后,那个“菜单”有闪烁。
yu3350360 2011-01-18
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wltg2001 的回复:]
你自己的问题描述得不清楚,没办法回答啊
而且也不一定就是双缓冲的事。
[/Quote]


CDC *pfdc;
CRect mRect[11]; //主菜单界面CRect 参数

int ip;
for(ip=0;ip<11;ip++)
{
pmDC[ip]=GetDC();
GetClientRect(&mRect[ip]);
}
menu.DrawPrimMenuBMP(pmDC,mRect,BtnSwitch); //图片
for(ip=0;ip<11;ip++)
{
ReleaseDC(pmDC[ip]);
}
pfdc=GetDC();
menu.DrawPrimMenuFont(pfdc);//文字


文字显示实现部分


void PrimaryMenu::DrawPrimMenuFont(CDC *pDC)
{
//字体绘制
CFont font;
char cFont[]="菜单";
CRect rect_adcon;
VERIFY(font.CreatePointFont(95, (LPCTSTR)"Arial", pDC));//创建字体 Arial格式 180为字高
CFont* def_font = pDC->SelectObject(&font);
int len=strlen(cFont);
CSize m_size = pDC->GetTextExtent((LPCTSTR)cFont,len);
SetRect(&rect_adcon,100,25,150,40);
pDC->SetBkMode(TRANSPARENT);//设置字体背景为透明
pDC->DrawText((CString)cFont,&rect_adcon,DT_LEFT|DT_VCENTER|DT_SINGLELINE);

pDC->SelectObject(def_font);
// Done with the font. Delete the font object.
font.DeleteObject();
}


//图片切换控制

void CGVisitDlg::OnBnClickedButleft()
{
// TODO: Add your control notification handler code here
int iBtn;

if(BtnSwitch[8]==TRUE) //切换线
{
for(iBtn=0;iBtn<9;iBtn++)
{
BtnSwitch[iBtn]=FALSE;
}
BtnSwitch[7]=TRUE;
}
。。。。。。

CGVisitDlg::OnPaint();
}

这样描述不知道请不清楚?
yu3350360 2011-01-18
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 xianglitian 的回复:]
OnBnClickedButleft()
这个函数里怎么会调用
CGVisitDlg::OnPaint();
[/Quote]
在CGVisitDlg::OnPaint()加了如下的代码,所以才在这里调用的。

CDC *pfdc;
CRect mRect[11]; //主菜单界面CRect 参数

int ip;
for(ip=0;ip<11;ip++)
{
pmDC[ip]=GetDC();
GetClientRect(&mRect[ip]);
}
menu.DrawPrimMenuBMP(pmDC,mRect,BtnSwitch); //图片
for(ip=0;ip<11;ip++)
{
ReleaseDC(pmDC[ip]);
}
pfdc=GetDC();
menu.DrawPrimMenuFont(pfdc);//文字


向立天 2011-01-18
  • 打赏
  • 举报
回复
OnBnClickedButleft()
这个函数里怎么会调用
CGVisitDlg::OnPaint();
向立天 2011-01-18
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 yu3350360 的回复:]
引用 11 楼 xianglitian 的回复:
引用 10 楼 yu3350360 的回复:
引用 9 楼 xianglitian 的回复:
OnBnClickedButleft()
这个函数里怎么会调用
CGVisitDlg::OnPaint();

在CGVisitDlg::OnPaint()加了如下的代码,所以才在这里调用的。

C/C++ code

CDC *pf……
[/Quote]解决就好
yu3350360 2011-01-18
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 xianglitian 的回复:]
引用 10 楼 yu3350360 的回复:
引用 9 楼 xianglitian 的回复:
OnBnClickedButleft()
这个函数里怎么会调用
CGVisitDlg::OnPaint();

在CGVisitDlg::OnPaint()加了如下的代码,所以才在这里调用的。

C/C++ code

CDC *pfdc;
CRect mRect[11]; //主菜……
[/Quote]
谢谢,这样子是有点乱来了,谢谢,不过问题已经解决了
wltg2001 2011-01-17
  • 打赏
  • 举报
回复
你自己的问题描述得不清楚,没办法回答啊
而且也不一定就是双缓冲的事。
yu3350360 2011-01-17
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 happyparrot 的回复:]
明天再回答
[/Quote]
这个也可以今天回答,呵呵
__lhy 2011-01-17
  • 打赏
  • 举报
回复
双缓冲过程

创建一个兼容内存DC
将图片通过SelectObject选入内存DC
将内存DC内容拷贝到显示DC
alangsos 2011-01-17
  • 打赏
  • 举报
回复
看看用双缓冲,我一般都是这样的
m_dcBack.DeleteDC();
m_dcBack.CreateCompatibleDC(GetDC());
CRect rt;
CString txt;
int i;
GetClientRect(&rt);
int w=rt.Width();
int h=rt.Height();
CBrush br(RGB(0,0,0));
CBitmap bm;
bm.CreateCompatibleBitmap(GetDC(),w,h);
CBitmap *pbm=m_dcBack.SelectObject(&bm);
m_dcBack.FillRect(rt,&br);

//这里你就可以画东西在m_dcBack了

//显示时就这样来显示
void CCurveDlg::Show()
{
CClientDC dc(this);
CRect rt;
GetClientRect(&rt);
int w=rt.Width();
int h=rt.Height();
dc.BitBlt(0,0,w,h,&m_dcBack,0,0,SRCCOPY);
}

void CCurveDlg::OnPaint()
{
CPaintDC dc(this); // device context for painting

// TODO: Add your message handler code here
Show(); //重画时直接blt就OK了
// Do not call CDialog::OnPaint() for painting messages
}
快乐鹦鹉 2011-01-17
  • 打赏
  • 举报
回复
明天再回答
TandyT 2011-01-17
  • 打赏
  • 举报
回复
有没有试过双缓冲显示啊?以前显示图像的时候也会,后来听大牛们说用双缓冲就可以解决这个闪烁的弊端。

15,979

社区成员

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

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