求助大神帮忙指点。。

datangMB 2012-10-08 03:46:36
	CClientDC dc(this);
CBrush brush1,brush2,OldBrush;
brush1.CreateSolidBrush(RGB(255,0, 0));
brush2.CreateSolidBrush(RGB(0,255,0));

CString str;
for(i=140;i>=0;i--){
if(i>20&&i<=140)
{
str.Format(_T("%d"),(i-20));
dc.TextOut(115,220,str);
dc.SelectObject(&brush1);
dc.Ellipse(140,220,155,235);

}
else if(i<=20&&i>=0);
{
str.Format(_T("%d"),i);
dc.TextOut(115,220,str);
dc.SelectObject(&brush2);
dc.Ellipse(140,220,155,235);

}
Sleep(1000);
}

我要做的是120秒倒计时到0画红圆,20秒倒计时到0画绿圆,运行结果是140秒全部画成绿圆,99显示990,后面多个0,求高手帮忙修改修改,先谢过。。
...全文
147 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
schlafenhamster 2012-10-09
  • 打赏
  • 举报
回复
你可以不要这句,但要调:
dc.SetTextAligh(TA_RIGHT);//默认 TA_LEFT
schlafenhamster 2012-10-09
  • 打赏
  • 举报
回复
'dc.TextOut(100,220,"",10);'
这是擦除原数字用的。
因为TextOut用的是左对齐。这样显示 ‘100’后,99会在10处显示,而留下一个0没擦除。
看上去是‘990’。
你可以调整
dc.TextOut(100,220," ",10);//到合适的大小。
注意 变宽字体的 ‘ ’是很窄的,(所以用了10个空格)
zgdqlc 2012-10-09
  • 打赏
  • 举报
回复
str.Format(_T("%d"),(i-20));
可以改为 str.Format(_T("%03d"),(i-20));把数字显示固定为3位,这样99显示099。你的问题就是没有刷新
datangMB 2012-10-09
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

别Sleep(100)了,改用SetTimer起定时器吧
[/Quote]
前面放了定时器setTimer(1,1000,NULL),如果去掉sleep(),就一直显示000不动,放入sleep(),才会动呢,新手呢,是不是定时器使用错了,我放在ondraw()下的
sumos 2012-10-09
  • 打赏
  • 举报
回复
因为TextOut的地方没有刷新。
你可以先用一个白色的画刷把文字区域刷一遍,然后再写文字。
datangMB 2012-10-09
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

改了改:
C/C++ code

void CAboutDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
KillTimer(1);
//
CClientDC dc(this);
CBrush brush1,bru……
[/Quote]
dc.TextOut(100,220,"",10);这段代码有问题,我的vs2010在.下面画红的波浪线
datangMB 2012-10-09
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

引用 5 楼 的回复:
按照你们说的改了之后依然是全程绿圈,只是从原来的140倒计时变为120倒计时,到0后出现负数,99依然显示990的

我这里是红的啊!
if(i<=20&&i>=0)
{
...
}
[/Quote]
我的问题里有个明显的错误,我发现了else if();多了个分号,目前可以120变红,20秒变绿的,但是100以下显示xx0,比如990,980,970,这样子的怎么去掉后面的0啊,是不是%d的原因呢,求指教
datangMB 2012-10-09
  • 打赏
  • 举报
回复
谢谢各位了,网速不行,结贴给分出现错误,先道个歉,大家都是好人
vc_qing 2012-10-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
按照你们说的改了之后依然是全程绿圈,只是从原来的140倒计时变为120倒计时,到0后出现负数,99依然显示990的
[/Quote]
我这里是红的啊!
if(i<=20&&i>=0)
{
...
}
schlafenhamster 2012-10-08
  • 打赏
  • 举报
回复
改了改:

void CAboutDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
KillTimer(1);
//
CClientDC dc(this);
CBrush brush1,brush2;
HBRUSH OldBrush;
brush1.CreateSolidBrush(RGB(255,0, 0));
brush2.CreateSolidBrush(RGB(0,255,0));

CString str;
int i;
int k;
for(i=140 ; i >= 0 ;i--)
{
dc.TextOut(100,220," ",10);
if( i > 20 )
{
k=i-20;
afxDump << k << " red\n";
OldBrush=(HBRUSH)dc.SelectObject(&brush1);
}
else
{
k=i;
afxDump << k << " green\n";
OldBrush=(HBRUSH)dc.SelectObject(&brush2);
}
str.Format(_T("%d"),k);
dc.TextOut(100,220,str);
dc.Ellipse(140,220,155,235);
dc.SelectObject(OldBrush);
dc.SelectObject(OldBrush);
Sleep(100);
}

// CDialog::OnTimer(nIDEvent);
}
Eleven 2012-10-08
  • 打赏
  • 举报
回复
别Sleep(100)了,改用SetTimer起定时器吧
pig357 2012-10-08
  • 打赏
  • 举报
回复
先FillRect清空图片
datangMB 2012-10-08
  • 打赏
  • 举报
回复
按照你们说的改了之后依然是全程绿圈,只是从原来的140倒计时变为120倒计时,到0后出现负数,99依然显示990的
schlafenhamster 2012-10-08
  • 打赏
  • 举报
回复
HBRUSH Old=(HBRUSH)dc.SelectObject(brush2);
dc.Ellipse(140,220,155,235);
dc.SelectObject(Old);
不恢复是不好的习惯。

sumos 2012-10-08
  • 打赏
  • 举报
回复
str = " ";
dc.TextOut(115,220,str); 首先写空格,把以前写的覆盖了
str.Format(_T("%d"),(i-20));
dc.TextOut(115,220,str);
qlizhang 2012-10-08
  • 打赏
  • 举报
回复
// else if(i<=20&&i>=0);

else if(i<=20&&i>=0)

str.Format(_T("%d"),(i-20));
dc.TextOut(115,220," ");
dc.TextOut(115,220,str);

datangMB 2012-10-08
  • 打赏
  • 举报
回复
自己先顶了。。

15,979

社区成员

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

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