我在框架类中定义了两个PBULIC 类型的变量,然后在视图类的ONdraw函数中调用 怎么会出错啊?
框架类中的一个函数:
void CMainFrame::OnReceive()
{
     a=1;//a为P框架类中BULIC 类型的变量
     b=REC[1];//a为P框架类中BULIC 类型的变量,REC[1是::OnReceive()中的局部变量}在视图类中的一个函数:
void CFuwuqiView::OnDraw(CDC* pDC)
{
     。
     CMainFrame pt;
     pt.a;
     while(pt.a==1)
       { 
         int c;
          c=pt.b;
//输出C的值///
        ........       }
}程序运行是,确定了会执行void CMainFrame::OnReceive()这个函数,但是在while(pt.a==1)中设置了断点,程序就是进不去,也不会输出c的值。请问为什么?

解决方案 »

  1.   

    void CFuwuqiView::OnDraw(CDC* pDC)
    {
      。
      CMainFrame pt;
      pt.a;
      while(pt.a==1)
      {  
      int c;
      c=pt.b;
    //输出C的值///
      ........  }
    ==兄弟,你刚用VC不到一个月吧?
    新人有个很大的缺陷就是对类和实例的概念不清楚。
      

  2.   

    要获得CMainFrame的指针,而不是新建一个对象
      

  3.   

    本帖最后由 happyparrot 于 2011-07-12 10:38:10 编辑
      

  4.   

    CMainFrame pt这样的话,a还是初始化的值,应该不是1,除非把a弄成static的
      

  5.   

    void CFuwuqiView::OnDraw(CDC* pDC)
    {
      。
      CMainFrame *p = (CMainFrame*)AfxGetApp()->m_pMainWnd;
      if(pt->a==1)
      {   
      int c;
      c=pt->b;
    //输出C的值///
      ........  }
    有 错误啊!
    我漏了一个就是在while()里面给pt.a=0;
      

  6.   

    (CMainFrame*)pMainFrame = (CMainFrame*)AfxGetMainWnd();
      

  7.   

    CMainFrame *p = (CMainFrame*)AfxGetApp()->m_pMainWnd;
      if(pt->a==1)
      {   
     应该 是
    CMainFrame *pt = (CMainFrame*)AfxGetApp()->m_pMainWnd;
    谢谢你啊。如过能 给解释解释 那更好
      

  8.   

    唯一需要解释的就是类和实例的关系。你之前等于又定义了一个CMainFrame的实例,它和当前的框架对象不是同一个东西,自然不能得到想要的数据,而现在是去获取当前的框架对象,自然就OK了。
      

  9.   

    CMainFrame PT;
    在什么地方定义 才算是一个对象呢?我看那个孙鑫视频 好像说的对象啊?
      

  10.   

    CMainFrame *p = (CMainFrame*)AfxGetApp()->m_pMainWnd;
    这样这个空间和当前正在运行的主框架对象就会是同一个空间?是吗
      

  11.   

    while(pt->huatupanduan==1)//判断是否接收到数据
    //if(pt->huatupanduan==1)
    {
    z=pt->recedata;//接收到的数据 DC.MoveTo(gridRect.left+(x*(int)datadx),gridRect.bottom-y*(int)datady);//起始点:第一次为绘图为原点,之后为上一次的结束点
    DC.LineTo(gridRect.left+((x+1)*(int)datadx),gridRect.bottom-(z)*(int)datady);//
    x++;
    y=z;
    pt->huatupanduan=0;

    }
    大哥 在帮个忙。为什么 这个要变化一下窗口尺寸 才能显示出来呢?我加分
      

  12.   

    你放在OnDraw中,那OnDraw什么时候会执行呢?就是窗口有刷新要求,所以在窗口尺寸变更时会显示。
      

  13.   

    视与fram的关系是,在原始处理过程中,Frame里{最好限定在Oncreate处}可以引用视,视不能引用frame。
    因为视初始化和frame初始化时间上存在冲突。
      

  14.   

    while(pt->huatupanduan==1)//判断是否接收到数据
    //if(pt->huatupanduan==1)

    z=pt->recedata;//接收到的数据DC.MoveTo(gridRect.left+(x*(int)datadx),gridRect.bottom-y*(int)datady);//起始点:第一次为绘图为原点,之后为上一次的结束点
    DC.LineTo(gridRect.left+((x+1)*(int)datadx),gridRect.bottom-(z)*(int)datady);//
    x++;
    y=z;
    pt->huatupanduan=0;}
    大哥 在帮个忙。为什么 这个要变化一下窗口尺寸 才能显示出来呢?我加分 
    ============
    变换窗口大小,等价于
       改变Rects,Invalidate();
    因此,你如果想主动改变窗口,就调Invalidate();
      

  15.   

    OnDraw,程序以运行 就执行了
      

  16.   

    回最后一个:
    你的OnReceive先运行,还是OnDraw先运行?怎么看也是OnDraw先运行,这时候你判断的属性还没有变为1呢,必须OnReceive执行后才会变成1,这时候OnDraw已经运行结束了,只有等待下次界面需要刷新时才会再次运行......
    真是口渴。什么代码都往OnDraw中放,照这样下去,你的系统只需要这一个函数......
      

  17.   

    两个实例,应该在里面用如下代码:
    CMainFrame *p = (CMainFrame*)AfxGetMainWnd();
    告诉你,在应用程序启动时,就创建了一个实例,而CMainFrame pt又定了一个实例,这两个东西互不干涉.现在明白了没.