在一个基于对话框的VC++的MFC程序中,假设对话框程序分别是:Dopen.h和Dopen.cpp,自己编写了一个用于图像处理的函数(函数放在另外一个源程序和头文件中,假设为:chuli.h和chuli.cpp),而这个函数的代码中,有些变量(当然这些变量是局部变量)的值需要保存下来,以方便将来使用在对话框的编辑框中(编辑框中显示出来这些值,以便更好的研究问题),请问怎么样设置(需要用到static全局变量吗?),才能把这个自己编写的函数中的局部变量的值给保存下来,然后用在主程序Dopen.cpp中。有请各位大侠详细说明一下,谢谢

解决方案 »

  1.   

    你可以修改你的图像处理类A的构造函数,加上对话框类的指针。这样你就可以通过该指针来操作对话框类B的public成员函数了。当然,在你A类中定义个B类的指针,专门用于接收从构造函数传递过来的对话框的指针。
      

  2.   

    /*************************************************************************
     *
     * 函数名称:
     *   HoughDIB()
     *
     * 参数:
     *   LPSTR lpDIBBits    - 指向源DIB图像指针
     *   LONG  lWidth       - 源图像宽度(象素数,必须是4的倍数)
     *   LONG  lHeight      - 源图像高度(象素数)
     * 返回值:
     *   BOOL               - 运算成功返回TRUE,否则返回FALSE。
     *
     * 说明:
     * 该函数用于对检测图像中的平行直线。如果图像中有两条平行的直线,则将这两条平行直线
     * 提取出来。
     * 
     * 要求目标图像为只有0和255两个灰度值的灰度图像。
     ************************************************************************/BOOL WINAPI HoughDIB(LPSTR lpDIBBits, LONG lWidth, LONG lHeight)
    {

    // 指向源图像的指针
    LPSTR lpSrc;

    // 指向缓存图像的指针
    LPSTR lpDst;

    // 指向变换域的指针
    LPSTR   lpTrans; // 图像每行的字节数
    LONG lLineBytes;

    // 指向缓存DIB图像的指针
    LPSTR lpNewDIBBits;
    HLOCAL hNewDIBBits; //指向变换域的指针
    LPSTR lpTransArea;
    HLOCAL hTransArea; //变换域的尺寸
    int iMaxDist;
    int iMaxAngleNumber; //变换域的坐标
    int iDist;
    int iAngleNumber; //循环变量
    long i;
    long j; //像素值
    unsigned char pixel; //存储变换域中的两个最大值
    MaxValue MaxValue1;
    MaxValue MaxValue2; // 暂时分配内存,以保存新图像
    hNewDIBBits = LocalAlloc(LHND, lWidth * lHeight); if (hNewDIBBits == NULL)
    {
    // 分配内存失败
    return FALSE;
    }

    // 锁定内存
    lpNewDIBBits = (char * )LocalLock(hNewDIBBits); // 初始化新分配的内存,设定初始值为255
    lpDst = (char *)lpNewDIBBits;
    memset(lpDst, (BYTE)255, lWidth * lHeight); //计算变换域的尺寸
    //最大距离
    iMaxDist = (int) sqrt(lWidth*lWidth + lHeight*lHeight); //角度从0-180,每格2度
    iMaxAngleNumber = 90; //为变换域分配内存
    hTransArea = LocalAlloc(LHND, lWidth * lHeight * sizeof(int)); if (hNewDIBBits == NULL)
    {
    // 分配内存失败
    return FALSE;
    }

    // 锁定内存
    lpTransArea = (char * )LocalLock(hTransArea);

    // 初始化新分配的内存,设定初始值为0
    lpTrans = (char *)lpTransArea;
    memset(lpTrans, 0, lWidth * lHeight * sizeof(int)); // 计算图像每行的字节数
    lLineBytes = WIDTHBYTES(lWidth * 8); for(j = 0; j <lHeight; j++)
    {
    for(i = 0;i <lWidth; i++)
    { // 指向源图像倒数第j行,第i个象素的指针
    lpSrc = (char *)lpDIBBits + lLineBytes * j + i; //取得当前指针处的像素值,注意要转换为unsigned char型
    pixel = (unsigned char)*lpSrc; //目标图像中含有0和255外的其它灰度值
    if(pixel != 255 && *lpSrc != 0)
    return FALSE; //如果是黑点,则在变换域的对应各点上加1
    if(pixel == 0)
    {
    //注意步长是2度
    for(iAngleNumber=0; iAngleNumber<iMaxAngleNumber; iAngleNumber++)
    {
    iDist = (int) fabs(i*cos(iAngleNumber*2*pi/180.0) + \
    j*sin(iAngleNumber*2*pi/180.0));

    //变换域的对应点上加1
    *(lpTransArea+iDist*iMaxAngleNumber+iAngleNumber) = \
    *(lpTransArea+iDist*iMaxAngleNumber+iAngleNumber) +1;
    }
    }

    }
    }

    //找到变换域中的两个最大值点
    MaxValue1.Value=0;
    MaxValue2.Value=0;

    //找到第一个最大值点
    for (iDist=0; iDist<iMaxDist;iDist++)
    {
    for(iAngleNumber=0; iAngleNumber<iMaxAngleNumber; iAngleNumber++)
    {
    if((int)*(lpTransArea+iDist*iMaxAngleNumber+iAngleNumber)>MaxValue1.Value)
    {
    MaxValue1.Value = (int)*(lpTransArea+iDist*iMaxAngleNumber+iAngleNumber);
    MaxValue1.Dist = iDist;
    MaxValue1.AngleNumber = iAngleNumber;
    } }
    }
    .........................................................................
    以下代码省略。就是说假如这是我自己编写的函数,里面的某些变量值,比如:iDist和iAngleNumber最后的值我要保存下来,以在主程序中使用,请问该怎么修改程序,以使能够在主程序中可以得到iDist和iAngleNumber的最后值
    主程序为:
    void CDopenDlg::OnHoughLine() 
    {
    // TODO: Add your control notification handler code here // 指向DIB的指针
    LPSTR lpDIB; // 指向DIB象素指针
    LPSTR   lpDIBBits;

    // 锁定DIB
    lpDIB = (LPSTR) ::GlobalLock((HGLOBAL)m_hDIB2);

    // 找到DIB图像象素起始位置
    lpDIBBits = ::FindDIBBits(lpDIB);

    // 调用HoughDIB()函数对DIB
    if (HoughDIB(lpDIBBits, ::DIBWidth(lpDIB), ::DIBHeight(lpDIB)))
    {
    Invalidate();
    }

    // 解除锁定
    ::GlobalUnlock((HGLOBAL)m_hDIB2); }
    }
      

  3.   

    请问怎么在void CDopenDlg::OnHoughLine()成员函数中得到调用函数
    HoughDIB(LPSTR lpDIBBits, LONG lWidth, LONG lHeight)中iDist和iAngleNumber的最后值