我在对话框里加了一个编辑框和微调按钮并将他们绑定,也就是用编辑框里输入的数字改变微调按钮的状态,然后又为编辑框加了一个整型变量,为微调按钮加了一个CSpinButtonCtrl变量,然后在编辑框的OnChangeEdit1()消息处理函数中加上 UpdateData();想把在编辑框中输入的数字传给它所对应的整型变量,但是虽然编译的时候没有错误,运行时却有断言错误,如果将UpdateData();注释掉,则就没有断言错误了,这是怎么回事呢,请执教

解决方案 »

  1.   

    Edit控件和微调按钮的绑定需要他们的ID相连,并且在设为数字的时候,还需要设置一下微调按钮!考,都忘掉了,我马上试验一下!
      

  2.   

    经测试,我的程序没有问题啊,呵呵,UpdateData完全正确啊。
      

  3.   

    我也发现这个问题了,在定义了一个CSpinButtonCtrl变量以后,对话框初始化的时候就会出错,但是忽略可以继续执行,如果不行,就使用一个比较古板的办法,定义一个BOOL变量m_bFirst,构造函数中初始化为TRUE,然后在OnChangeEdit1()中改写为:
             if(m_bFirst)
    {
    m_bFirst = FALSE;
    }
    else
    {
    UpdateData();
    }
      

  4.   

    这样就可以避免在初始化的时候调用UpdateData了,呵呵,其后的操作都可以正常的调用UpdateData了,估计是不是在进行UpdateData的时候MFC还没有为Edit控件建立相应的变量,导致DoDataExchange函数调用失败,呵呵。
      

  5.   

    to vcleaner(我没做大哥已经很久了.......) 
    这样就可以避免在初始化的时候调用UpdateData了,呵呵,其后的操作都可以正常的调用UpdateData了,估计是不是在进行UpdateData的时候MFC还没有为Edit控件建立相应的变量,导致DoDataExchange函数调用失败,呵呵。
    不是这样的原因 是因为和微调按钮绑定的原因
      

  6.   

    呵呵,不会把?我试验了一下是可以的啊,要不你把你的程序发过来我给你看看,呵呵
    [email protected]
      

  7.   

    在VC++6.0中,创建控件的方法有两种,一种是直接使用相应控件类的创建函数创建,这种方法与创建窗口的方法一样,因为控件也是一种窗口,另一种是使用对话框模板创建,这种方法直观、使用方便,但如果使用不当,将出现一些逻辑错误。本文就第二种方法剖析这几种控件与编辑控件配合使用的方法与技巧。
    微调控件一般都有一个相伴的EDIT窗口。假定EDIT控件值的类型为整型,当EDIT窗口的内容发生变化时,如果使用UpdateData()函数获取编辑控件的值或利用GetPos函数获取旋转按钮的位置的时,将发生断言错误。针对这种情况,可以采取间接的方法来处理,既用GetWindowText()函数来获取编辑控件的文本字符串,然后再将其转换为整型。
    滚动条控件、滑动条控件与编辑控件没有伙伴关系,若将两者结合使用时,必须在两者之间作好数据传递,因为滚动条控件或滑动条控件的值不会直接反映在编辑控件中,反之亦然。当编辑控件的值发生变化时,应把编辑控件对应的成员变量的值传递到滚动条控件或滑动条控件对应的值类型的成员变量上,然后再利用SetScrollPos()函数或SetSliderPos()函数来修改滚动条控件与滑动条控件的位置。
    为了使初学者理解并掌握这三种控件的使用方法与技巧,下面通过一个具体的实例来观察这三种控件的使用,该实例利用三种控件来控制三原色的变化。此例已在VC++6.0环境下通过。创建应用项目的步骤如下:
    (1) 用MFC AppVizard(exe) 创建一个单文档应用程序项目Ex_Contrl。
    (2) 向应用程序添加一个对话框资源IDD_SCROLL,标题为“控件演示”,相应的对话框类CScrollDlg。
    (3) 参照图1,用编辑器为对话框添加如下表所示的一些控件。(图1)控件 ID号 标题 属性
    静态文本 IDC_DRAW 缺省 Static edge,其余缺省
    组框 缺省 颜色设置 缺省
    静态文本 缺省 红(R) 缺省
    编辑框 IDC_EDIT1 ------ 缺省
    滚动条 IDC_SCROLLBAR1 ------ 缺省
    静态文本 缺省 绿(G) 缺省
    编辑框 IDC_EDIT2 ------ 缺省
    滑动条 IDC_SLIDER1 ------ 缺省
    静态文本 缺省 蓝(B) 缺省
    编辑框 IDC_EDIT3 ------ 缺省
    旋转按钮控件 IDC_SPIN1 ------- Auto Buddy、Set buddy integer,Alignment,Right,其余缺省

    按钮 IDOK 退出 Default button,其余缺省
    (4) 打开ClassWizard 的Member Variables标签,在Class name中选择CscrollDlg,选中所需控件的ID号,双击鼠标,依次为下列控件增加成员变量。
     
    (5) 为编辑框IDC_EDIT1,IDC_EDIT2,IDC_EDIT3添加EN_CHANGE消息影射,相应的消息函数处理名分别为OnChangEdit1, OnChangEdit2, OnChangEdit13,各函数代码如下:
    void CScrollDlg::OnChangeEdit1()  //当往编辑框IDC_EDIT1中键入数字时触发
    {
    UpdateData(); //(1)将编辑框中键入的数字传给与IDC_EDIT1关联的变量m_RValue
    m_Scroll.SetScrollPos(m_RValue);       //(2)将滚动条调到m_Rvalue标示的位置
    m_ScrollVal=m_RValue;         //(3)为与滚动条相关联的整形变量赋上m_RValue
    PoutArea ();                             //(4)这是自己为CScrollDlg编的一//个成员函数,功能是在静态文本框IDC_DRAW中显示用户所调制的颜色
    }
    此函数是当用户往编辑框IDC_EDIT1中键入数字时触发的,他的功能是将用户在第一个编辑框中输入的红色颜色分量值传给滚动条,使滚动条处于与这个值相匹配的位置,并同时条用子定义的PoutArea ()函数在静态文本框IDC_DRAW中显示用户所调制的颜色。
    void CScrollDlg::OnChangeEdit2() 
    {
    UpdateData();
    m_Slider.SetPos(m_GValue);
    m_SliderVal=m_GValue;
    PoutArea ();
    }
    此函数是当用户往编辑框IDC_EDIT2中键入数字时触发的,他的功能是将用户在第二个编辑框中输入的绿色颜色分量值传给滑动条,使滑动条处于与这个值相匹配的位置,并同时条用子定义的PoutArea ()函数在静态文本框IDC_DRAW中显示用户所调制的颜色。void CScrollDlg::OnChangeEdit3() 
    {
    CEdit* Edit3;
    Edit3=(CEdit*)GetDlgItem(IDC_EDIT3);
    CString stoint;
    Edit3->GetWindowText(stoint);
    m_BValue=(INT)atol(stoint.GetBuffer(10));
    // m_BValue=m_Spin.GetPos();
    PoutArea ();
    }
    这个函数的功能也与前两个函数相似,也是将用户在第三个编辑框中输入的蓝色颜色分量值传给微调按钮,使微调按钮处于与这个值相匹配的位置,但是实现起来却完全不同,为什么不同呢,因为第三个编辑框与微调按钮之间已经通过微调按钮的auto buddy属性的设置建立了关联,如果也象前两个函数一样用UpdateData()函数将用户在第三个编辑框中输入的蓝色色颜色分量值传给m_Bvalue的话,将会引起断言错误    错误如下所示:
     
    (6) 用ClassWizard 为对话框增加WM_PAINT的消息影射,并增加下列代码:
    void CScrollDlg::OnPaint() 
    {
    CPaintDC dc(this); // device context for painting
    CWnd *pWnd=GetDlgItem(IDC_DRAW);
    CRect rect;
    pWnd->GetWindowRect(&rect);
    pWnd->UpdateWindow();
    Draw();
    }
    先获得静态文本控件IDC_DRAW的指针将之赋给pWnd,由pWnd指针获得此控件所处的矩形空间并将之赋给矩形变量rect,
    (7) 用Class Wizard 为对话框添加WM_INITDIALOG的消息影射,并增加下列代码:
    BOOL CScrollDlg::OnInitDialog() 
    {
    CDialog::OnInitDialog();
    m_RValue=m_GValue=m_BValue=0;  //为与三个编辑框相关联的整形变量赋初值
    m_ScrollVal=m_SliderVal=0;   //为与滚动条和滑动条控件关联的两个变量赋初值0
    m_Scroll.SetScrollRange(0,255);//设定滚动条控件的滚动范围为0-255
    m_Scroll.SetScrollPos(m_RValue);//设定滚动条控件的初始位置为0即最左边
    m_Slider.SetRange(0,255); //设定滑动条控件的滚动范围为0-255
    m_Slider.SetPos(m_GValue); //设定滑动条控件的初始位置为0即最左边
    m_Spin.SetRange(0,255); //设定微调按钮控件的调节范围为0-255
      m_Spin.SetPos(0); //设定微调按钮控件的初始位置为0
    UpdateData(FALSE);//用变量初始化控件
    return TRUE;  
    }
    (7) 为对话框类CscrollDlg添加两个protected型的成员函数,函数名分别为Draw和PoutArea,函数代码如下:
    void CScrollDlg:: PoutArea ()
    {
    CWnd *pWnd=GetDlgItem(IDC_DRAW);
    CRect rect;
    pWnd->GetWindowRect(&rect);
    InvalidateRect(rect,TRUE);
    }void CScrollDlg::Draw()
    {
    CWnd *pWnd=GetDlgItem(IDC_DRAW);      
    CDC *pDC=pWnd->GetDC();         获得窗口当前的设备环境指针       
    CBrush drawBrush;                  定义画刷变量
    drawBrush.CreateSolidBrush(RGB(m_RValue,m_GValue,m_BValue));
    //创建一个填充画刷。RGB是一个颜色宏,用来将指定的红、绿、蓝三种颜色分量
    //转换成一个32位的RGB颜色值
    CBrush *pOldBrush=pDC->SelectObject(&drawBrush);
    CRect rcClient;
    pWnd->GetClientRect(rcClient);
    pDC->Rectangle(rcClient);
    pDC->SelectObject(pOldBrush);}
    (8) 用Class Wizard 为对话框添加WM_HSCROLL消息影射,消息处理函数为OnHScroll,并增加下列代码:
    void CScrollDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
    {
    if (pScrollBar->GetDlgCtrlID()==IDC_SCROLLBAR1)//判断对话框的水平滚动事件
    //是否来源自于滚动条
    {
    switch(nSBCode)
    {
    case SB_LINELEFT:m_ScrollVal--;break;
    case SB_LINERIGHT:m_ScrollVal++;break;
    case SB_PAGELEFT:m_ScrollVal-=10;break;
    case SB_PAGERIGHT:m_ScrollVal+=10;break;
    case SB_THUMBPOSITION:m_ScrollVal=nPos;//看是否为拖动,如果是的话,
    //将nPos赋值给m_ScrollVal
    }
    if (m_ScrollVal<0) m_ScrollVal=0;
    if(m_ScrollVal>255) m_ScrollVal=255;
    m_Scroll.SetScrollPos(m_ScrollVal);
    m_RValue=m_ScrollVal;
    }
    else
    {   
    m_SliderVal=m_Slider.GetPos();
    m_GValue=m_SliderVal;
    } UpdateData(FALSE);
       Draw();
    CDialog::OnHScroll(nSBCode, nPos, pScrollBar);
    }
    (9) 在菜单资源的主菜单中增加顶层菜单项“测试控件”,然后为其增加子菜单项“滚动条等”(ID_TEST_SCROLL);在CmainFrame类中增加处理该菜单项的命令消息,并添加下列代码:
    void CMainFrame::OnTestScroll() 
    {
    CScrollDlg m_dlg;
    m_dlg.DoModal();
    }
    (10) 在MainFrm.cpp文件的开始处,增加包含CscrollDlg的头文件。
    #include “ScrollDlg.h”
      

  8.   

    微调按钮设置成
    自动选上
    set buddy inter选上编辑框的tab order 比微调按钮小1就可以自动了编辑对话框时ctrl+d设置tab order
      

  9.   

    这个函数的功能也与前两个函数相似,也是将用户在第三个编辑框中输入的蓝色颜色分量值传给微调按钮,使微调按钮处于与这个值相匹配的位置,但是实现起来却完全不同,为什么不同呢,因为第三个编辑框与微调按钮之间已经通过微调按钮的auto buddy属性的设置建立了关联,如果也象前两个函数一样用UpdateData()函数将用户在第三个编辑框中输入的蓝色色颜色分量值传给m_Bvalue的话,将会引起断言错误    错误如下所示: