MFC的画椭圆的一些问题

chjzka 2012-10-03 06:48:35
Q1:为什么当窗口显示,画椭圆会执行2次?
Q2:为什么在画椭圆时无法按其他按钮,比如最大化?

以下是代码(有圆1在窗口中间,然后每隔0.5秒在圆1的圆周上隔10度画圆)
CPoint center;//中心圆圆心
double pie=3.141;
double cont,r1=30,r2=50;


void CSSBView::OnDraw(CDC* /*pDC*/)
{
CSSBDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
cont=0;
CClientDC dc(this);
CRect rect;
GetWindowRect(&rect);
int w=rect.Width()/2; // device context for painting
int h=rect.Height()/2;
double rx;
double ry;
center.SetPoint(w,h);
while(cont<360){
CBrush *brush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
CBrush *oldbrush=dc.SelectObject(brush);
double coner=(cont/180.0)*pie;
CPoint c2,c3;
rx=double(center.x)+r1*cos(coner);
ry=double(center.y)+r1*sin(coner);
c2.SetPoint (rx-r2,ry-r2);
c3.SetPoint (rx+r2,ry+r2);
Sleep(500);
dc.Ellipse(CRect(c2,c3));
cont=cont+10;
}
}
...全文
512 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
不败的拿破仑 2014-11-18
  • 打赏
  • 举报
回复
MFC的界面靠消息循环,你sleep了,当然卡住了。 时间大于1秒/24帧,就被人眼看出来了 要sleep应该新开线程
zmr1991 2014-11-17
  • 打赏
  • 举报
回复
CPoint c2,c3; rx=double(center.x)+r1*cos(coner); ry=double(center.y)+r1*sin(coner); c2.SetPoint (rx-r2,ry-r2); c3.SetPoint (rx+r2,ry+r2); Sleep(500); dc.Ellipse(CRect(c2,c3)); cont=cont+10; 这里也看不懂
zmr1991 2014-11-17
  • 打赏
  • 举报
回复
学习了,int w=rect.Width()/2; // device context for painting int h=rect.Height()/2; 这个是什么意思啊
sumos 2012-10-08
  • 打赏
  • 举报
回复
点不了按钮的原因是:你在OnDraw中使用了Sleep函数,导致PAINT消息还未结束,对于按钮的消息,进入消息队列中一直排队。
长尾巴的悟空 2012-10-03
  • 打赏
  • 举报
回复
分析的透彻
hdg3707 2012-10-03
  • 打赏
  • 举报
回复
void CSSBView::OnDraw(CDC* /*pDC*/)
{
CSSBDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
if(m_Draw)//加这句
{//加这句
cont=0;
CClientDC dc(this);
CRect rect;
GetWindowRect(&rect);
int w=rect.Width()/2; // device context for painting
int h=rect.Height()/2;
double rx;
double ry;
center.SetPoint(w,h);
while(cont<360){
CBrush *brush=CBrush::FromHandle((HBRUSH)GetStockObject(NULL_BRUSH));
CBrush *oldbrush=dc.SelectObject(brush);
double coner=(cont/180.0)*pie;
CPoint c2,c3;
rx=double(center.x)+r1*cos(coner);
ry=double(center.y)+r1*sin(coner);
c2.SetPoint (rx-r2,ry-r2);
c3.SetPoint (rx+r2,ry+r2);
Sleep(500);
dc.Ellipse(CRect(c2,c3));
cont=cont+10;
}
m_Draw=FALSE;//加这句,在这个函数只画一次
}
}//加这句
在其它函数比如按钮函数,OnSize,OnSetFocus等消息函数里改变m_Draw变量值
在头文件里定义:BOOL m_Draw;//为了标明已画完图形了
程序初始化函数:m_Draw=TRUE;//程序一执行就画一次
因为只要窗口状态改变OnDraw函数就自动执行,因此就不断的在画图,导致你点不了按钮

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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