在一个基于对话框的VC++的MFC程序中,假设对话框程序分别是:Dopen.h和Dopen.cpp,自己编写了一个用于图像处理的函数(函数放在另外一个源程序和头文件中,假设为:chuli.h和chuli.cpp),而这个函数的代码中,有些变量(当然这些变量是局部变量)的值需要保存下来,以方便将来使用在对话框的编辑框中(编辑框中显示出来这些值,以便更好的研究问题),请问怎么样设置(需要用到static全局变量吗?),才能把这个自己编写的函数中的局部变量的值给保存下来,然后用在主程序Dopen.cpp中。有请各位大侠详细说明一下,谢谢
解决方案 »
- 现在想得到如下的效果:即已有图片做背景,在放上tab control 或者listbox时,想得到的是只有控件上的内容,其他仍旧是背景的,应该如何做啊?
- GDI绘图如何实现颜色合成的透明效果?
- 请问strcmp的问题 高手末入
- 我想用MFC实现FTP的登陆,下载,上传
- 请教一个鼠标取词的比较弱的问题,如何计算所需的到底是哪一个单词?
- 学术腐败,计算机等级考试乱出题,没经测试也拿出来考人
- 帮忙看看!!
- directshow应用中的怪问题,高手请进!分有的是,up有分!
- TCP zerowindow后,shutdown函数不能关闭连接
- 各位,我用CObArray的Add()方法向CObArray变量里添加结构体成员,但读出来却都为空,添加字符串却可以读出来,这是为何?
- 求解一个MSchart的问题?????????????
- 代理软件是如果让游戏指向代理服务器,而不是它原来的IP
*
* 函数名称:
* 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); }
}
HoughDIB(LPSTR lpDIBBits, LONG lWidth, LONG lHeight)中iDist和iAngleNumber的最后值