科学网

 找回密码
  注册

tag 标签: Visual

相关帖子

版块 作者 回复/查看 最后发表

没有相关内容

相关日志

Visual Basic与图像处理9
热度 1 prrsw 2012-10-10 15:15
Visual Basic与图像处理9
Visual Basic 与图像处理 ( 二 ) 6 、阈值变换 图像的阈值变换可以将一幅图像变为黑白二值图像,即按照设定的阈值,如果图像中像素点的灰度值小于该阈值,则将该像素点的灰度值设定为 0 ,在图像中显示为黑色,否则将改点的灰度值设定为 255 ,在图像中显示为白色。有时候为强化阈值后的效果,也会将阈值结果进行反相。 阈值变换的原理可以表达为如下的函数形式: 这里的 T 就是设定的阈值。 阈值变换的实现方法也比较简单,在本例示范时,增加了一个水平滚动条用于设定阈值,其余界面与灰度线性变换的类似,软件的界面如下图所示: 这里用一个 ThresholdValued 窗体级别变量作为阈值,其中阈值变换按钮对于的代码如下: Private Sub cmdThresholdTrans_Click() Dim i As Integer, j As Integer Dim PixelValue As Long Dim r As Integer, g As Integer, b As Integer Dim GrayValue As Integer Dim NGrayValue As Integer ThresholdValue = Val(txtThreshold) ' 设置目标图像的高度和宽度 DestImHeight = SourceImHeight DestImWidth = SourceImWidth ' 设置目标 PictureBox 的大小 PicDest.Height = DestImHeight PicDest.Width = DestImWidth ' 彩色图像的阈值变换 For i = 0 To SourceImHeight - 1 For j = 0 To SourceImWidth - 1 PixelValue = PicSource.Point(j, i) r = PixelValue Mod 256 g = (PixelValue \ 256) Mod 256 b = PixelValue \ 65536 ' 插入图像处理的过程,对 r, g, b 进行处理 GrayValue = 0.3 * r + 0.59 * g + 0.11 * b If GrayValue ThresholdValue Then NGrayValue = 0 Else NGrayValue = 255 PicDest.PSet (j, i), RGB(NGrayValue, NGrayValue, NGrayValue) Next j Next i End Sub 滚动条对应的代码如下: Private Sub HScroll1_Change() txtThreshold = Str(HScroll1.Value) End Sub 当文本框失去焦点时,也自动更改阈值,对应的代码如下: Private Sub txtThreshold_LostFocus() HScroll1.Value = Val(txtThreshold) End Sub
2535 次阅读|2 个评论
Visual Basic与图像处理8
prrsw 2012-10-10 11:24
Visual Basic与图像处理8
Visual Basic 与图像处理 ( 二 ) 5 、灰度线性变换 灰度线性变换也是一种典型的点运算,原理也比较简单,就是将图像中所有像素点的灰度按照线性函数进行变换,以 D image 表示目标图像, S image 表示源图像,灰度线性变换可以理解为: D image =k*S image +b 其中 k 为线性函数的斜率, b 为线性函数在 y 轴上的截距。当 k1 时,整个图像灰度的分布区域将变大,目标图像的整体对比度增大;反之,当 k1 时,整个图像灰度的分布区域将变小,目标图像的整体对比度减小;而 k=1 时,目标图像所有像素点的灰度增大或者减小,使得图像整体变亮或者变暗,而图像的整体对比度并不发生改变。 有两种特殊情况,当 k=1 , b=0 时,目标图像与原图像;而当 k=-1 , b=255 时,目标图像的灰度正好与原图像反转,就是平时所说的反相。 对于给定的 k 值和 b 值,对图像进行灰度线性变换比较简单,软件界面与灰度化处理的程序类似,直接更改其中的几句代码即可,软件的运行界面如下: 灰度线性变换按钮对应的代码如下: Private Sub cmdLinearTrans_Click() Dim i As Integer, j As Integer Dim PixelValue As Long Dim r As Integer, g As Integer, b As Integer Dim GrayValue As Integer Dim NGrayValue As Integer Dim k As Integer, t As Integer ' 改用字母 t ,避免与颜色值变量重复 ' 设置目标图像的高度和宽度 DestImHeight = SourceImHeight DestImWidth = SourceImWidth ' 设置目标 PictureBox 的大小 PicDest.Height = DestImHeight PicDest.Width = DestImWidth k = Val(txtK) t = Val(txtB) ' 彩色图像的灰度线性变换 For i = 0 To SourceImHeight - 1 For j = 0 To SourceImWidth - 1 PixelValue = PicSource.Point(j, i) r = PixelValue Mod 256 g = (PixelValue \ 256) Mod 256 b = PixelValue \ 65536 ' 插入图像处理的过程,对 r, g, b 进行处理 GrayValue = 0.3 * r + 0.59 * g + 0.11 * b NGrayValue = k * GrayValue + t If NGrayValue 255 Then NGrayValue = 255 ' 如果超过 255 ,统一设定为 255 If NGrayValue 0 Then NGrayValue = 0 ' 如果小于 0 ,统一设定为 0 PicDest.PSet (j, i), RGB(NGrayValue, NGrayValue, NGrayValue) Next j Next i End Sub 特殊情况下,当 k=-1 , b=255 时,实现的是图像的反相,效果如下图所示:
2918 次阅读|0 个评论
Visual Basic与图像处理7
prrsw 2012-10-10 10:44
Visual Basic与图像处理7
Visual Basic 与图像处理 ( 二 ) 4 、基于灰度直方图的灰度特征值计算 前文介绍过直接基于图像的每个像素点计算图像的均值和方差,在得到图像的灰度直方图统计以后,还可以根据直方图统计结果进行图像均值和方差的计算,这种算法效率更高,程序运行更快,尤其对于尺寸较大的图像,这种优势更为明显。算法的本质是将灰度等级相同的像素点进行归类,一次性计算出其和值,然后来计算均值和方差。本例将这种算法与前文直接根据像素点计算的方法进行比对,软件的界面如下: 从图中可以看出,两者的结果是一致的,其中基于直方图的特征计算按钮对应的代码如下: Private Sub cmdCalFeatureBaseHist_Click() Dim i As Integer, j As Integer Dim PixelValue As Long Dim r As Integer, g As Integer, b As Integer Dim GrayValue As Integer Dim Hist(0 To 255) As Long Dim SumValue As Long Dim MeanValue As Single Dim StdValue As Single ' 直方图统计 For i = 0 To SourceImHeight - 1 For j = 0 To SourceImWidth - 1 PixelValue = PicSource.Point(j, i) r = PixelValue Mod 256 g = (PixelValue \ 256) Mod 256 b = PixelValue \ 65536 ' 插入图像处理的过程,对 r, g, b 进行处理 GrayValue = 0.3 * r + 0.59 * g + 0.11 * b Hist(GrayValue) = Hist(GrayValue) + 1 Next j Next i ' 图像均值计算 For i = 1 To 255 ' 计算和值是,灰度等级为 0 的直接省略 SumValue = SumValue + Hist(i) * i Next i MeanValue = SumValue / SourceImHeight / SourceImWidth MeanValue = Format(MeanValue, "0.00") ' 保留两位小数 txtNewMean = Str(MeanValue) ' 图像标准差计算 SumValue = 0 For i = 0 To 255 SumValue = SumValue + (i - MeanValue) ^ 2 * Hist(i) Next i StdValue = Sqr(SumValue / SourceImHeight / SourceImWidth) StdValue = Format(StdValue, "0.00") ' 保留两位小数 txtNewStd = Str(StdValue) End Sub
2642 次阅读|0 个评论
Visual Basic与图像处理6
热度 2 prrsw 2012-10-10 10:24
Visual Basic与图像处理6
Visual Basic 与图像处理 ( 二 ) 3 、灰度直方图 灰度直方图是描述图像中像素灰度分布的一个统计图,简而言之就是描述图像中每个灰度值像素的个数或者概率,横坐标对应就是图像的灰度级别,纵坐标是该灰度级别对应的像素个数(或概率)。要得到图像的灰度直方图,首先要完成各灰度级别对应像素个数的统计,将统计结果存放于 Hist 数组中,然后再根据这个数组进行直方图的绘制。 基于前面的编程基础,相信要完成直方图统计应该都没有问题,这里要简要介绍一下直方图绘制的方法。前文提及过, PictureBox 不仅支持图像的读写,还支持图形的绘制,在这里为简便起见,只用一系列直线进行直方图的绘制, PictureBox 的 Line 方法可用于直线的绘制,其原型如下: object.Line (x1, y1) - (x2, y2), , 这里 (x1,y1) 为直线的起点, (x2,y2) 为直线的终点,如果没有 Step 表示直接从起点画到终点,如果有关键字 Step ,表示分别沿着 x1 , y1 在横向和纵向绘制 x2, y2 的长度, color 用于设置直线的颜色,可用 RGB 函数进行设定。如果使用了 B 选项,则 F 选项规定矩形以矩形边框的颜色填充。不能不用 B 而用 F 。如果不用 F 光用 B ,则矩形用当前的 FillColor 和 FillStyle 填充, FillStyle 的缺省值是 Transparent ,由于本例中只画直线,因此 B 选项和 F 选项都不选用。 在直方图绘制时,首先要确定每个灰度等级对应的线段长度,这里采用常见的一种方法,即首先找出统计概率最高的灰度等级,设定其绘制长度,其余灰度等级绘制的线段长度与该灰度等级成对比,假设概率最高的灰度等级对应的绘制长度为 L ,其他灰度等级的线段绘制长度可按照下面的方式进行计算: L gray = L * Hist / Hist max 首先对程序界面进行设计,本例主要由两个 PictureBox 组成,其中一个 PictureBox 用于存放图像,另一个用于直方图的绘制。用于直方图绘制的 PictureBox 宽度直接设置为 256 个像素,即每个灰度等级绘制的直线占的宽度都是 1 个像素。该程序的软件运行界面如下: 直方图绘制按钮对应的代码如下: Private Sub cmdHist_Click() Dim i As Integer, j As Integer Dim PixelValue As Long Dim r As Integer, g As Integer, b As Integer Dim GrayValue As Integer Dim Hist(0 To 255) As Long Dim maxHist As Long, L As Integer, L0 As Integer ' 直方图统计 For i = 0 To SourceImHeight - 1 For j = 0 To SourceImWidth - 1 PixelValue = PicSource.Point(j, i) r = PixelValue Mod 256 g = (PixelValue \ 256) Mod 256 b = PixelValue \ 65536 ' 插入图像处理的过程,对 r, g, b 进行处理 GrayValue = 0.3 * r + 0.59 * g + 0.11 * b Hist(GrayValue) = Hist(GrayValue) + 1 Next j Next i ' 直方图绘制 ' 第一步,寻找 Hist 数组中的最大值,即灰度等级统计概率最高者 maxHist = Hist(0) For i = 1 To 255 If maxHist Hist(i) Then maxHist = Hist(i) Next i ' 绘制直方图,其中最高概率的灰度等级绘制长度与 PictureBox 的高度一致 L = PicHist.Height For i = 0 To 255 L0 = L * Hist(i) / maxHist PicHist.Line (i, L - 1)-Step(0, -L0), RGB(0, 0, 255) ' 绘制蓝色线条 Next i End Sub
3846 次阅读|3 个评论
Visual Basic与图像处理5
prrsw 2012-10-10 09:28
Visual Basic与图像处理5
Visual Basic 与图像处理 ( 二 ) 2 、图像的特征值计算 这里所说图像的特征值是指可以直接从图像中提取出来的特征参数,常用于对图像的整体性评价,如图像的灰度均值可以用于判断图像整体亮度的高低。在图像灰度化的基础上可以很便捷的完成图像特征值的计算,本例中以两个基本的特征参数计算作为示范:均值和标准差。从本质上来说,图像灰度化以后就相当于一个二维矩阵,因此均值的计算只要求得图像中所有像素点的灰度值之和,再除以图像的高度与宽度的乘积即可,图像的标准差计算方法与此类似。以 MeanValue 和 StdValue 分别表示图像的均值和标准差,其计算公式如下: 首先设计程序的软件界面,本例中运行界面如下图: 同样“读入图像”按钮的代码与前文类似,这里给出特征值计算按钮对于的程序代码: Private Sub cmdCalFeature_Click() Dim i As Integer, j As Integer Dim PixelValue As Long Dim r As Integer, g As Integer, b As Integer Dim GrayValue As Integer Dim SumValue As Long Dim MeanValue As Single Dim StdValue As Single ' 图像均值计算 For i = 0 To SourceImHeight - 1 For j = 0 To SourceImWidth - 1 PixelValue = PicSource.Point(j, i) r = PixelValue Mod 256 g = (PixelValue \ 256) Mod 256 b = PixelValue \ 65536 ' 插入图像处理的过程,对 r, g, b 进行处理 GrayValue = 0.3 * r + 0.59 * g + 0.11 * b SumValue = SumValue + GrayValue Next j Next i MeanValue = SumValue / SourceImHeight / SourceImWidth MeanValue = Format(MeanValue, "0.00") ' 保留两位小数 txtMeanValue = Str(MeanValue) ' 图像标准差计算 SumValue = 0 For i = 0 To SourceImHeight - 1 For j = 0 To SourceImWidth - 1 PixelValue = PicSource.Point(j, i) r = PixelValue Mod 256 g = (PixelValue \ 256) Mod 256 b = PixelValue \ 65536 ' 插入图像处理的过程,对 r, g, b 进行处理 GrayValue = 0.3 * r + 0.59 * g + 0.11 * b SumValue = SumValue + (GrayValue - MeanValue) ^ 2 Next j Next i StdValue = Sqr(SumValue / SourceImHeight / SourceImWidth) StdValue = Format(StdValue, "0.00") ' 保留两位小数 txtStdValue = Str(StdValue) End Sub
2604 次阅读|0 个评论
Visual Basic与图像处理4
prrsw 2012-10-10 08:39
Visual Basic与图像处理4
Visual Basic 与图像处理 ( 二 ) 有了上面介绍的 Point 和 PSet 方法以后就可以进入真正的图像处理阶段了,与平时学习一样,这里同样从最简单的图像处理技术——点运算开始讲起。点运算简而言之就是对图像进行逐点运算,得到所需要的特征参数或者新的图像。点运算之所以简单是因为点运算每次只需要考虑当前一个像素点的颜色值,当然点运算不可能改变图像内的空间关系。 点运算中最简单是获得图像的特征参数包括均值、方差等,另一种就是按照特定的方式对图像的直方图进行改变,这里的特定方式可以看成是从像素到像素的操作,常见的有对比度增强、对比度拉伸或灰度变换。后面将从图像灰度化、特征参数计算、直方图统计、灰度线性变换、灰度拉伸、直方图均衡化等几种常用的实例进行讲解,同时以 Visual Basic 软件进行算法实现。 1、 图像的灰度化 图像的灰度化是指将原始的彩色图像转换为灰度图像,这也是后续其他点运算操作的先前操作,也就是说点运算是基于灰度图像进行的。彩色图像中 Red 、 Green 、 Blue 三个分量值相等时,呈现出的就是一种灰度化的效果,因此要讲彩色图像转换为灰度图像只要将上述三个分量值设置为同样的值即可。这里需要讨论的只是设置灰度值的方法,有一种最简单的方法是取三个分量中的一个或者是平均值,但在实践中发现这种简单的转换方法与人的视觉习惯不太符合,因此有许多公司在研究这种灰度转换模型,在本节中,我们采用加权平均的方法实现图像的灰度化,方法如下: Gray = 0.3*Red+0.59*Green+0.11*Blue 下面通过一个实例实现彩色图像的灰度化,本例是后续点运算的基础,同样第一次涉及图像处理的完整流程,因此讲述的稍微详细一点。 为了强调原始图像与目标图像的概念,这也是在一般图像处理软件里面都会涉及的,本例中在窗体中放置两个 PictureBox 控件,分别用于存放原始图像与目标图像。 读取图像的方法与前文介绍的一致,即用 LoadPicture 函数进行图像读取,在获得原始图像的高度和宽度以后,按照预定方式进行目标图像的高度和宽度设置,然后利用循环语句遍历原始图像,逐个改变原始图像中每个像素点的值,并将其赋值到目标图像中,就可以完成图像的点运算。这里的循环语句是后面其他图像处理中也经常需要使用的一个标准过程,其基本格式如下 For i = 0 To h - 1 For j = 0 To w - 1 PixelValue = Picture1.Point(j, i) r = PixelValue Mod 256 g = (PixelValue \ 256) Mod 256 b = PixelValue \ 65536 ’ 插入图像处理的过程,对 r, g, b 进行处理 …….………………………………. Picture2.PSet (j, i), RGB(RValue, GValue, BValue) Next j Next i 这里需要注意观察的是 Point 和 PSet 方法中坐标的位置,第一个坐标是横坐标,第二个坐标是纵坐标。 有了这个标准过程就可以理解图像灰度化处理的基本代码了,首先设计该程序的软件界面,效果如下图所示: 这里读入图像按钮的代码与前文类似,这里不在阐述,下面是灰度化按钮对于代码: Private Sub cmdGray_Click() Dim i As Integer, j As Integer Dim PixelValue As Long Dim r As Integer, g As Integer, b As Integer Dim GrayValue As Integer ' 设置目标图像的高度和宽度 DestImHeight = SourceImHeight DestImWidth = SourceImWidth ' 设置目标 PictureBox 的大小 PicDest.Height = DestImHeight PicDest.Width = DestImWidth ' 彩色图像的灰度化处理 For i = 0 To SourceImHeight - 1 For j = 0 To SourceImWidth - 1 PixelValue = PicSource.Point(j, i) r = PixelValue Mod 256 g = (PixelValue \ 256) Mod 256 b = PixelValue \ 65536 ' 插入图像处理的过程,对 r, g, b 进行处理 GrayValue = 0.3 * r + 0.59 * g + 0.11 * b PicDest.PSet (j, i), RGB(GrayValue, GrayValue, GrayValue) Next j Next i End Sub
3005 次阅读|0 个评论
Visual Basic与图像处理3
热度 1 prrsw 2012-10-9 19:19
Visual Basic与图像处理3
Visual Basic 与图像处理(二) 从本节开始,正式开始进入 Visual Basic 图像处理的内容,在正文中会结合一些实例来讲解 Visual Basic 处理图像的方法,当然在初始阶段,一切从简单的开始,在处理图像时也仅用 Point 与 PSet 相结合完成图像的读和写的两个过程。 1. 读入和保存图像 VB 中读入图像可以采用 LoadPicture 函数直接进行,当然也可以采用读取文件的方法直接读取图像数据,然后将图像数据在 PictureBox 中进行绘制。为了便于教学,一般都直接采用 LoadPicture 函数进行图像的读取, LoadPicture 函数的原型如下: LoadPicture ( , , , , ) as TPictureDisp 在我们读入图像时,一般直接使用下面的格式: Picture1.Picture=LoadPicture (FileName) 当 FileName 为空时,清空 PictureBox 中图像。 如果直接使用固定的 FileName 字符常量时,可读入存储器中固定位置的图像,如果希望以对话框的形式进行图像的选择性读取,可以使用 CommonDialog 控件实现。 图像保存对打开类似,可以使用写文件的形式进行图像数据的存储,在 Visual Basic 中提供了配合 PictureBox 控件专门的文件保存函数 SavePicture ,其函数原型如下: SavePicture ( Picture as TPictureDisp, FileName as String) 下面以一个实例示范如何进行图像读取和保存: 窗体中放有 1 个 PictureBox 控件用于显示图像, 2 个 CommandButton 分别用读取和保存图像, 1 个 CommodDialog 控件用于调用对话框。窗体外观如下: 注意设置 PictureBox 控件的相关属性。本例对应的相关代码如下: Option Explicit Private Sub cmdOpenImage_Click() Dim strFileName As String CommonDialog1.Filter = "bmp|*.bmp|jpg|*.jpg|gif|*.gif" ' 文件过滤,可以打开上述三类图像 CommonDialog1.ShowOpen If CommonDialog1.FileName "" Then strFileName = CommonDialog1.FileName PicShowImage.Picture = LoadPicture(strFileName) End If End Sub Private Sub cmdSaveImage_Click() Dim strFileName As String CommonDialog1.Filter = "bmp|*.bmp|jpg|*.jpg|gif|*.gif" ' 文件过滤,可以打开上述三类图像 CommonDialog1.ShowSave If CommonDialog1.FileName "" Then strFileName = CommonDialog1.FileName SavePicture PicShowImage.Picture, strFileName End If End Sub 2 、 PictureBox 控件中像素点颜色值存储格式 在 PictureBox 读入图像以后,像素点以长整型的格式存储在控件之中,利用 Point 方法可以实现像素点颜色值的读取,具体方法如下: Picture1.Point (x, y), 其中 x 为横坐标, y 为纵坐标。 在使用中常采用以下格式得到对应的值: Dim PixelValue as Long PixelValue=Picture1.Point (x, y) 为了便于后续运算,一般要完成颜色数据的分离,即将这个长整型的数转化为对应的 Red 、 Green 、 Blue 三个分量的值。在转化之前,首先看一下颜色值的存储方法,在 Visual Basic 中颜色点以下面的格式进行存储 : 其中第一个字节一般不使用,所以这里只讨论后面三个字节的分离,在数据合成时,上述三个分量分别占 1 个字节,如果将其理解为 256 进制就比如容易理解了,相当于十进制中的个位、十位和百位,只是在显示的时候还是以十进制的形式进行显示而已,如果要分离上述数据就比较简单了,只要将十进制转化为对应的 256 进制就可以了。十进制转化为二进制是除 2 取余法,转化为 256 进制也是采用同样的方法,除 256 取余即可。 下面就是作者在授课是经常采用的一种颜色数据分离方法 Dim r as Integer, g as Integer, b as Integer r = PixelValue Mod 256 g = (PixelValue \ 256) Mod 256 b = PixelValue \ 65536 3 . PictureBox 颜色点的写入 有了 Point 方法可以从 PictureBox 控件中读取颜色点值,对用还需要将某个颜色点值写入到对应的 PixtureBox 控件之中,这里采用与 Point 对用的 PSet 方法, PSet 的使用格式如下: Picture1.PSset (x, y), Color 这里的 Color 同样对应一个长整型的颜色数值,对上述数据分离对应的时,在数据处理时往往知道的是 Red, Green, Blue 三个分量的值,需要将这三个分量进行合成,得到长整型的颜色数值,合成方法与前面讲的非常类似,具体方法如下: PixelValue= r+256*g+256*b 当然在实际使用中还可以直接利用 RGB 函数进行颜色值的合成,使用方法如下: PixelValue=RGB(r, g, b) 下面结合一个实例结束这一部分内容,在完成图像读和写以后,本例中完成图像高度和宽度的自动读取,同时利用 Point 方法读取某个指定位置像素点的值,最后利用 PSet 方法将图像的左上角一块区域设置为红色。本例的运行结果如下: 对应的代码分别如下: Option Explicit Dim ImageHeight As Integer, ImageWidth As Integer Private Sub cmdOpenImage_Click() Dim strFileName As String CommonDialog1.Filter = "bmp|*.bmp|jpg|*.jpg|gif|*.gif" ' 文件过滤,可以打开上述三类图像 CommonDialog1.ShowOpen If CommonDialog1.FileName "" Then strFileName = CommonDialog1.FileName PicShowImage.Picture = LoadPicture(strFileName) End If ImageHeight = PicShowImage.Height ImageWidth = PicShowImage.Width Text1 = Str(ImageHeight) Text2 = Str(ImageWidth) End Sub Private Sub cmdPoint_Click() Dim r As Integer, g As Integer, b As Integer Dim x As Integer, y As Integer Dim pixelvalue As Long x = Val(Text3): y = Val(Text4) pixelvalue = PicShowImage.Point(x, y) r = pixelvalue Mod 256 g = (pixelvalue \ 256) Mod 256 b = pixelvalue \ 65536 Text5 = Str(r) Text6 = Str(g) Text7 = Str(b) End Sub Private Sub cmdPSet_Click() Dim i As Integer, j As Integer For i = 0 To 20 For j = 0 To 20 PicShowImage.PSet (i, j), RGB(255, 0, 0) Next j Next i End Sub
3442 次阅读|1 个评论
Visual Basic与图像处理2
prrsw 2012-10-9 15:47
Visual Basic与图像处理2
Visual Basic 与图像处理 ( 一 ) 4. PictureBox 控件 对于 Visual Basic 众多控件中,重点介绍一下这个 PictureBox 控件。 PictureBox 支持图像的读取,同时也支持图像的绘制,因此经常在 VB 中被用于图像处理使用。 PictureBox 支持常用的 bmp 、 jpg 和 gif 等格式的读取,自带简单的 Point 和 PSet 方法,便于构建简单的图像处理程序。 PictureBox 的 AutoSize 属性设定为 True 以后,读入图像中会自动调整 PictureBox 控件的大小,使其与图像的大小一致,从而可以自动获得图像的高度和宽度。为了使 PictureBox 的宽度和高度与图像的宽度与高度完全一致,可以将 PictureBox 的 BorderStyle 属性设置为 0-None 。 平时我们所说的图像的高度和宽度一般是以像素形式进行表示的,所以在控制绘制完成后,要将窗体以及 PictureBox 的 ScaleMode 属性设置为 3-Pixel ,这样得到的竖直才符合我们平时的认知。 下图即为一种的简单的程序实例,可以完成图像的读取和保存。 本例中 PictureBox 控件的相关属性已经进过设置,可以看出读取图像以后, PictureBox 控件的大小已经与图像一致,为了获得图像的高度和宽度可以使用下述语句: ImageHeight=Picture1.Height ImageWidth=Picture1.Width 5. 处理图像的三要素 这也是我经常跟学生讲的一句话,要理解图像处理的本质,首先要知道图像处理要从何下手,不管是什么语言,处理图像的语句可能不一样,但是基本过程是一致的。要处理图像首先要知道以下三个信息: (1) 第一个就是图像的高度和宽度,这也是平时遍历图像所需要的,在前面介绍 PictureBox 控件的时候已经做了简要介绍; (2) 图像的起点,也就是要理解图像的坐标格式,比如平时读取 bmp 图像是从左下角开始,在 VB 中, PicureBox 读入图像以后,图像的起点都是在左上角; (3) 每个像素的值,也就是要知道具体的图像内部数据,就好像矩阵处理要知道每个元素的值一样,前两个要素已经作了相关介绍,关于这个要素后文会专门介绍。 6. VB 图像处理的基本流程 这个流程也是初学者在编程时需要牢记的,这样才便于理清自己的思路。 l 读入图像并显示。 l 获得图像高度和宽度。 l 获得图像每一像素的数据。 l 对每一像素的数据进行相应变换。
3489 次阅读|0 个评论
Visual Basic与图像处理1
热度 1 prrsw 2012-10-9 14:58
Visual Basic 与图像处理(一) 1、 什么是图像? 图像的概念有很多种,当然有很多精确的名词解释,百度之即可得到,我这里解释的是便于向学生阐述的一种简单概念,如有学术同仁看到,请勿见笑。 所谓图像简而言之就是各种图形和影像的集合,平时所说的图像一般包含两种:矢量图和位图。矢量图有时也成为图形,所以有门课程叫图形图像学,即是各种图形的集合,有专门绘制和处理矢量图的软件比如 CorelDraw, Illustrator 等,当然用微软的 Office 软件业可以绘制各种矢量图,矢量图的存储时以坐标和方程形式进行存储,所以不会因为图像的缩放而出现模糊现象。 位图是一种点阵格式的图像,即图像数据是以一个个像素点形式进行排布的,如果把每个像素点看成独立的元素按,那么位图图像就可以理解为一种特殊的矩阵。我们这里研究的图像就是指这种位图图像。 图像处理就是指对图像进行分析、加工和处理,使其满足视觉、心理以及其他要求的一种技术,当然从本质上来说就是按指定的要求对矩阵进行处理的过程。从功能上来说,我们所说的图像处理可以分为两类,第一类是从图像到图像,即处理结果仍是一幅图像,只是增强或者削弱了图像的某些信息;第二类是图像到数据,即处理结果是以数据的形式出现,从图像中提取了所需要的特征信息。 2、 图像的种类 从图像的种类来说,平时一般把图像分为二值图像;灰度图像和彩色图像三种。二值图像即图像中像素只分为一种,一般是黑与白,在数值上以 0 与 1 ( 255 )表示,这种图像中每个像素只要一位即可表示,所占的存储空间非常小,但能够表达的信息也比较少。灰度图像所表达的信息比二值图像要丰富得多,普通的灰度图像每个像素点可以表达 0-255 个灰度等级,可以认为这种图像是真实信号的亮度表达,与以前的黑白电视机类似。对于彩色图像最常见的就是平时所说的 RGB 真彩色图像,即图像中每个像素点以三个字节表示,分别是 Red 、 Green 、 Blue 分量,每个分量取值范围都是 0-255 ,在有些系统中也将每个像素点三个分量进行合成,以一个长整型的变量进行表示,比如 VB 中像素点的表示方法即为如此。 3、 Visual Basic 简要介绍 在编程语言选择的时候,也考虑了实际应用情况以及学生的基础,当然也考虑到硕士生研究期限只有两年,选择了大部分纺织专业的硕士生在本科阶段初步学习过的 Visual Basic 6.0 软件,初期也考虑过使用 .net 版本,但各种原因吧,后来还是选择使用更为普及的 6.0 版本。 简要的总结了一下 Visual Basic 6.0 的特点: (1) 所见即为所得,便于程序员设计用户界面; (2) 面向对象进行编程,容易理解; (3) 支持 ActiveX 技术,容易使用第三方控件。当然 Visual Basic 程序员的数量以及网络资源也是考虑的其中一个要素,有了众多的研究人员和研究资料,学生在学习中碰到困难才容易解决。 对于 Visual Basic6.0 软件的使用介绍,这里就不详细介绍了,当然在上课时一般也会跟学生简要介绍一下各种功能的实现方法。
2970 次阅读|1 个评论
Visua Studio 2008 编译 cminpack
runningabc 2012-7-14 14:08
minpack有fortran版的和c/c++版的,后者称为cminpack 在cminpack的网站 http://devernay.free.fr/hacks/cminpack/index.html 中提到了cminpack相对于fortran的一些优点。其中一个优点就是cminpack中传入的函数指针的原型相比于fortran的minpack增加了一个void*型的指针,这个传入的指针有大作用,所有在函数体内部需要使用的相关参数都可以通过这个参数给传递进来。比如我们可以将所有参数组合定义为一个结构体,然后将指向该结构体的指针当做参数传递到该函数中。而在fortran当中,我们得定义一些全局变量来实现相同的功能,这对于大规模程序开发来说是不利的。 废话不多说了,从以上网站中找到相应的链接下载cminpack源程序 http://devernay.free.fr/hacks/cminpack/cminpack-1.3.0.tar.gz 解压后,找到cminpack.sln 我这里用的是Visual studio 2008,双击打开后会提示进行转换。 转换完成后,进行编译。 很遗憾,编译的时候报错了: 1------ 已启动生成: 项目: cminpack, 配置: Debug Win32 ------ 2------ 已启动生成: 项目: cminpack_dll, 配置: Debug Win32 ------ 2cminpack_dll : warning PRJ0009 : 未能打开生成日志进行写入。 2请确保该文件未被其他进程打开并且未被写保护。 1正在编译... 2正在编译... 1cl: 命令行 warning D9035 :“Wp64”选项已否决,并将在将来的版本中移除 1lmpar.c 2cl: 命令行 warning D9035 :“Wp64”选项已否决,并将在将来的版本中移除 2lmpar.c 1d:\my projects\mylib\cminpack-1.3.0\lmpar.c(219) : error C2143: 语法错误 : 缺少“;”(在“类型”的前面) 1d:\my projects\mylib\cminpack-1.3.0\lmpar.c(220) : error C2065: “i”: 未声明的标识符 1d:\my projects\mylib\cminpack-1.3.0\lmpar.c(220) : error C2065: “i”: 未声明的标识符 1d:\my projects\mylib\cminpack-1.3.0\lmpar.c(220) : error C2065: “i”: 未声明的标识符 1d:\my projects\mylib\cminpack-1.3.0\lmpar.c(221) : error C2065: “i”: 未声明的标识符 1d:\my projects\mylib\cminpack-1.3.0\lmpar.c(221) : error C2065: “i”: 未声明的标识符 2d:\my projects\mylib\cminpack-1.3.0\lmpar.c(219) : error C2143: 语法错误 : 缺少“;”(在“类型”的前面) 2d:\my projects\mylib\cminpack-1.3.0\lmpar.c(220) : error C2065: “i”: 未声明的标识符 2d:\my projects\mylib\cminpack-1.3.0\lmpar.c(220) : error C2065: “i”: 未声明的标识符 2d:\my projects\mylib\cminpack-1.3.0\lmpar.c(220) : error C2065: “i”: 未声明的标识符 2d:\my projects\mylib\cminpack-1.3.0\lmpar.c(221) : error C2065: “i”: 未声明的标识符 2d:\my projects\mylib\cminpack-1.3.0\lmpar.c(221) : error C2065: “i”: 未声明的标识符 2生成日志保存在“file://d:\My Projects\MyLib\cminpack-1.3.0\Debug\BuildLog.htm” 1生成日志保存在“file://d:\My Projects\MyLib\cminpack-1.3.0\Debug\BuildLog.htm” 1cminpack - 6 个错误,0 个警告 2cminpack_dll - 6 个错误,1 个警告 ========== 生成: 成功 0 个,失败 2 个,最新 0 个,跳过 0 个 ========== 容易发现,错误出在impar.c这个源文件当中。 找到219行,将 int i; 这行代码注释起来,然后跳到131行,加上一行代码 int i; 重新编译,这次编译通过了,不过有一个小小的warning cl: 命令行 warning D9035 :“Wp64”选项已否决,并将在将来的版本中移除 这个warning无关紧要,不过如果你想更清爽一点的话 找到:项目==cminpack属性==C/C++==常规==检测64位可移植性问题,设置为“否” OK,重新编译,这下整个世界就清净了。 1------ 已启动生成: 项目: cminpack, 配置: Debug Win32 ------ 1正在编译... 1chkder_.c 1covar.c 1covar1.c 1covar_.c 1dogleg.c 1dogleg_.c 1dpmpar.c 1dpmpar_.c 1enorm.c 1enorm_.c 1fdjac1.c 1fdjac1_.c 1fdjac2.c 1fdjac2_.c 1hybrd.c 1hybrd1.c 1hybrd1_.c 1hybrd_.c 1hybrj.c 1hybrj1.c 1正在生成代码... 1正在编译... 1hybrj1_.c 1hybrj_.c 1lmder.c 1lmder1.c 1lmder1_.c 1lmder_.c 1lmdif.c 1lmdif1.c 1lmdif1_.c 1lmdif_.c 1lmpar.c 1lmpar_.c 1lmstr.c 1lmstr1.c 1lmstr1_.c 1lmstr_.c 1qform.c 1qform_.c 1qrfac.c 1qrfac_.c 1正在生成代码... 1正在编译... 1qrsolv.c 1qrsolv_.c 1r1mpyq.c 1r1mpyq_.c 1r1updt.c 1r1updt_.c 1rwupdt.c 1rwupdt_.c 1chkder.c 1正在生成代码... 1正在创建库... 1生成日志保存在“file://d:\My Projects\MyLib\cminpack-1.3.0\Debug\BuildLog.htm” 1cminpack - 0 个错误,0 个警告 ========== 生成: 成功 1 个,失败 0 个,最新 1 个,跳过 0 个 ==========
7321 次阅读|0 个评论
VC++调用Matlab
thomaschoo2011 2012-7-10 17:21
先介绍下我的机器软件配置, WIN7 64bit, Matlab R2011b 64bit, VS2010. 在论坛上找了很久,看了N多帖子. 都无法让机器上VS2010调用R2011b的函数和引擎,总是出现错误信息: Link error: can't open "libmx.lib libmat.lib libeng.lib". 结果在Mathworks 的网页上发现了如下帖子,总算成功编译通过了. http://www.mathworks.com/support/solutions/en/data/1-FWTSV5/index.html?product=MLsolution=1-FWTSV5 文章的标题是: How do I setup a Visual Studio 2010 Express Project in order to run the engdemo.cpp example in MATLAB 7.13 (R2011b) on my 64bit machine? 后来发现,需要特别注意的是这里: “Configuration Properties” - “Linker” - “Input” and add libmx.lib, libmat.lib and libeng.lib as additional dependencies. 在输入libmx.lib, libmat.lib, libeng.lib 到 Additional Dependencies 框中时候, 必须用分号(;)分隔, 就是这样: libmx.lib; libmat.lib;libeng.lib; 否则就会出现can't open "libmx.lib libmat.lib libeng.lib".的错误信息. BTW,我的VS2010 是home premieum版, MATLAB 2011b
个人分类: 编程语言|4295 次阅读|1 个评论
关于visual c++10下正则表达式regex的环境设置问题
aamos 2012-5-30 09:45
平时的开发工具多为JAVA,突然间来了个需要C++编写的程序,周围也没有人熟悉VC的环境,只好自己动手,查了一圈,在VC下的正则表达式,基本上还是推崇采用boost工具,网上看到boost的在windows下的编译方法,折腾了不少时间,才算能用。 方法1: “1,下载Boost Release 1.44.0的文件包,下载的位置:然后解压缩到自己设定的位置,我这里设定就是 C:\Boost ,名称越简洁越好,以免发生意外。 2,设定 msvc 的版本跟编译器信息 可能很多人不愿意跟我一样使用这样的目录,为了方便起见,这里用 $BOOST$ 代表你的 Boost 的安装或者解压缩路径,比如在我的机器下,$BOOST$ 就等价于 C:\Boost 。 在 $BOOST$\tools\build\v2\user-config.jam 找到下面的几行: # Configure specific msvc version (searched for in standard locations and PATH).# using msvc : 8.0 ; #添加 Visual Studio 2010 的配置 using msvc : 10.0 : : /wd4819 /D_CRT_SECURE_NO_DEPRECATE /D_SCL_SECURE_NO_DEPRECATE /D_SECURE_SCL=0 ; 如果是 Visual Studio 2005 就是 8.0 ,Visual Studio 2008 就是 9.0 ,这个应该没有疑问的。偷懒就直接粘贴过去吧,这个记下来也没啥用。 3,生成 bjam$BOOST$ 目录下面,有个文件 bootstrap.bat 的批处理文件,双击或者在命令行提示符窗口中打开,稍等片刻,就会在该目录下生成 bjam.exe 以及它的 log 文件。 4,编译 Boost::Regex,注意,这里只编译 Boost::Regex 库。到 $BOOST$ 目录下,键入bjam --toolset=msvc --with-regex stage,或者直接复制粘贴吧,免得麻烦。编译生成的库文件会被在目录 $BOOST$\stage\lib 中。比如,在我的机器上就是:C:\BOOST\STAGE\LIB libboost_regex-vc100-mt-1_44.lib libboost_regex-vc100-mt-gd-1_44.lib libboost_regex-vc100-mt-gd.lib libboost_regex-vc100-mt.lib" “ 5. 在Visual Studio 2010下,点击工程名,右键,property,linker,general,Additional library directories处选择你编译的库的目录,即上面给出的“C:\BOOST\STAGE\LIB” 在property,C/c++,general,additional include directories,中选择你BOOST存放的根目录,如前的C:\Boost 8.此时,程序应该可以运行Regex支持了。 另外,如果程序运行时提示找不到boost***.lib库,可以尝试设置property,C/c++,code generation, runtime library,更改相应的设置,如MDd,选择动态时,生成的EXE在跨环境时还需要相应的DLL文件,不是很好;而我按照如上方法做之后,最后只生成的两个lib文件,并没有生成静态环境下的两个,虽然环境最终可以运行。 方法2: 先到官网下载http://sourceforge.net/projects/boost/files/boost/1.49.0/,现在我下载的版本是1.47.0 解压缩后,打开windows命令行,转到“boost_1_47_0\tools\build\v2”目录下。 运行:bootstrap.bat,生成b2.exe和bjam.exe两个Build文件。 将“bjam.exe”自制到解压缩的根目录下(boost_1_47_0) 命令行到根目录下:执行:bjam toolset=msvc-10.0 variant=debug,release threading=multi runtime-link=static install toolset=msvc-10.0:Viusal Studio 2010,如果是2008的话就是9.0,2005就是8.0 variant=debug,release 生成哪些库文件。可以单选release也行的。 threading=multi:多线程支持 runtime-link=static:静态库 还有一些选项,可以参考说明文件,里面都有详细的说明的 个人觉得呢,还是的方法2比较合适一些,另外,在BOOST官网上,推荐有BOOST的windows安装版,我试了一下,感觉到还是比较省事,可以选择自己所需要的内容,但是程序安装的过程中需要在线下载。 参考来源: http://www.cnblogs.com/PerfectString/archive/2010/08/30/Demo_Boost_Regex.html http://blog.csdn.net/niying/article/details/6697269
个人分类: 技术|3559 次阅读|0 个评论
神经美学研究些什么东东?
charlesqwu 2012-5-24 09:56
神经美学研究些什么东东?
什么是神经美学? What is neuroaesthetics? Apparently it is an emerging interdisciplinary field between neuroscience and aesthetics. Although I heard the term long before, I essentially know nothing of it. This weekend there will be a conference on neuroaesthetics at UC Berkeley ( http://www.minervaberkeley.org/conferences/importance-of-being-playful ). As I am trying to determine whether or not to attend the conference, I searched the Internet to try and learn a bit more about this so-called neuroaesthetics discipline. I found that the wiki page on neuroaesthetics is a good introduction but is in English only ( http://en.wikipedia.org/wiki/Neuroesthetics ). I also found an introduction paper in Chinese, which is available as a PDF file for downloading at: http://journal.psych.ac.cn/jinzhan/qikan/manage/wenzhang/120505.pdf . If anyone interested in learning a bit more about neuroaesthetics, download it! Mona Lisa by Leonardo da Vinci: What are your brain activities when you see a painting like this?
3435 次阅读|0 个评论
vic的不同编译器版本运算速度初测
lincystar 2012-3-11 06:40
vic的不同编译器版本运算速度初测 自: http://hi.baidu.com/longlivehejian/blog/item/a04c801df115e89b87d6b6da.html 2010-11-11 16:05 感谢 abur 的无私帮助,好人啊! 师弟小饭用mingw中的gfortran同样成功编译了vic官方网站中提供的汇流程序。所有的编译成果已经应用到了同门内部所有vic相关软件。 将vic4.0.4源代码在cygwin、mingw和visual studio(vs)环境中分别进行编译,并做运算速度测试。 【编译环境】 机器:intel i5-540 2.53GHZ,windows 7 32bit 运行库:cygwin1.dll(for cygwin), mscvrt.dll(for mingw),msvcr100.dll(for vc++ 2010) 【测试方法】 测试数据:淮河息县流域400网格 测试方法:IDL7.1中,spawn vic,输出systime差值 【测试结果】 可执行文件(vicNl.exe)大小:cygwin( 479KB ),mingw( 570KB ),vc++ 2010( 155KB ) 模型运行时间:cygwin( 536秒 ),mingw( 251秒 ),vc++( 144秒 ) 模型输出准确性: cygwin与mingw输出完全一致 ,vc++输出的小数位在部分时段有细微差别 【初步分析】 1. 运行库的差异直接决定了运算时间。cygwin编译的vic运行时需要启动cygwin运行环境,并在cygwin环境中再调用c运行库的支持。而mingw和vc++,直接使用的是windows下的c运行库mscvrt.dll和msvcr100.dll,运行速度改进显著。特别地,vc++ 生成的release版本,不但可执行文件大小大大减小,运行效率也大幅度提高; 2. 运行cygwin编译的vic,至少需要cygwin1.dll的支持。而mingw依赖于mscvrt.dll,该文件可能从windows 98起就作为windows系统自带的文件。因此,mingw编译的vic几乎可以在任何安装windows系统的电脑上运行。vc++编译的vic需要msvcr100.dll支持; 3. mingw中,无需改动任何代码,就可以成功编译vic,运行结果与cygwin下完全一致。但vc++中需要手动添加一些文件,并对源代码稍作修改。特别是rint函数,目前对它的理解还不够清晰,只做了简单的四舍五入的处理,以确保编译成功。这可能是vc++编译的vic的输出与前两者有细微差别的原因。 【使用建议】 1. 模型实际应用中采用运算速度相对较快且稳定的mingw版本; 2. vic模型的学习借助vc++来进行,充分利用vs的强大的集成开发环境; 3. 对vc++ release版本vic进行深入调试,找出细微差别的原因。毕竟该版本可以将运行时间缩短为cygwin的1/4,是相当有诱惑力的。
个人分类: 研究进展|0 个评论
intel visual fortran 备忘
Daniel1985 2011-11-19 22:11
1 在vs2008如何设置可以显示行号? 菜单-工具-选项在新窗口中左面树菜单中展开“文本编辑器”,找到子项“所有语言”在右面的面板中 显示的行号前面打勾 2 运行之后,dos窗口一闪而过的解决 stop的上一行加pause, 这样就能按回车以后再结束程序了 (注意不能在stop之后)。 比如程序: program main implicit none write(*,*) Hello! pausestop end 其实这是因为直接用F5 start debugging的原因 如果用ctrl+F5 start without debugging就不会出现上述的问题。 3 声明语句中的双冒号 加两个冒号是新的语法。 Integer :: iA , iB 这样子与 Integer iA , iB 没有任何区别 但是当变量声明包含修饰词,比如 Allocatable , Private , Public , Parameter , Intent , Optional 等的时候,两个冒号就非常有必要了,它表示修饰词结束了。 比如: Integer,Allocatable,Public :: iA( : ) , iB( : ) 就不能省略两个冒号。 推荐你定义变量时都采用 两个冒号的 新写法。 有了两个冒号你在声明是可以直接符值
个人分类: ABAQUS/PYTHON/FORTRAN|5481 次阅读|0 个评论
[转载]qt 4.5 与 visual studio 集成
romanhead 2010-11-24 19:12
qt 4.5 与 visual studio 集成 转自: http://blog.csdn.net/soulmachine/archive/2009/04/06/4049631.aspx 本文主要讲述将 Qt 4.5 与 Visual Studio 2008 集成,同样适用于 Visual Studio 2005, 2003 。 Qt 4.5 虽然新增了 LGPL 协议,但这也阻碍了我们在 VS 中使用 Qt 。因为免费开源的版本只提供了 GCC 编译好的二进制库,而没有 VC 编译好的二进制库,只有商业版本才有 VS 编译好的针对 Windows 的 DLL , lib 等二进制库(恩,可以理解)。 再者, VC 编译器比 GCC 还是要强劲很多,并且调试器异常强大。 Qt Creator 虽然很酷,目前还很粗糙。很多人也更为熟悉 VS 的界面。 下面我们就自己用 VS 编译出二进制库,然后就可以跟商业版一样了。 不过,你也可以直接 googleqt 4.5 编译好,找到很多人已经编译好的二进制库,下载下来直接用。下面的内容可以不看了 ^_^ 1. 下载并安装 qt-sdk-win-opensource-2009.01.exe ,安装到默认的 c:\qt\2009.01 。它包含了 MingGW 和 Qt Creator ,以及预编译好的二进制文件(用 GCC 编译的)。你可以直接使用 Qt Creator 开始开发工作,不需要任何额外的配置。 2. 将整个目录 c:\qt\2009.01 拷贝一份到 c:\qt\4.5.0-vc 。我们将会修改目录 c:\qt\4.5.0-vc ,使用 VC++ 来编译出所需要的库。这两个目录可以同时存在, Qt 使用 c:\qt\2009.01 , Visual Studio 使用 c:\qt\4.5.0-vc 。 3. 修改 C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\ 下的 vsvars32.bat ,在环境变量 PATH 中添加 Qt 的目录,如 c:\qt\4.5.0-vc\qt ,在 INCLUDE 添加上 c:\qt\4.5.0-vc\qt\include ,在 LIB 添加 c:\qt\4.5.0-vc\qt\include ,如: @set PATH=C:\Qt\4.5.0-vc\qt;c:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE;c:\Program Files\Microsoft Visual Studio 9.0\VC\BIN;c:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools;c:\Windows\Microsoft.NET\Framework\v3.5;c:\Windows\Microsoft.NET\Framework\v2.0.50727;c:\Program Files\Microsoft Visual Studio 9.0\VC\VCPackages;%PATH% @set INCLUDE=C:\Qt\4.5.0-vc\qt\include;c:\Program Files\Microsoft Visual Studio 9.0\VC\ATLMFC\INCLUDE;c:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE;%INCLUDE% @set LIB=C:\Qt\4.5.0-vc\qt\lib;c:\Program Files\Microsoft Visual Studio 9.0\VC\ATLMFC\LIB;c:\Program Files\Microsoft Visual Studio 9.0\VC\LIB;%LIB% 打开一个 cmd 命令行窗口,把这个文件拖过来执行,这样,你打开的 cmd 就具有上面设置的环境变量了,但是这些变量只针对你当前的 cmd ,不会更改本机配置,所以,不要关闭 cmd 窗口,你需要在这个 CMD 窗口中完成接下来的命令。 (网上很多没有这一步,会导致下面的 configure 失败) 4. 执行 c:\ cd c:\qt\4.5.0-vc\qt c:\qt\4.5.0-vc\qt configure -no-sql-sqlite -no-qt3support -no-opengl -platform win32-msvc2008 -no-libtiff -no-dbus -no-phonon -no-phonon-backend -no-webkit (这一步如果像这样编译的话,会导致tiff等图片不能被识别。应改成:) configure -debug-and-release -static -platform win32-msvc2008 -qt-zlib -qt-gif -qt-libpng -qt-libmng -qt-libtiff -qt-libjpeg -plugin-sql-sqlite -plugin-sql-odbc -no-qt3support -no-mmx -no-3dnow -no-sse -no-sse2 -no-openssl -no-dbus -no-phonon -no-phonon-backend -no-webkit -no-scripttools -no-dsp -no-vcproj 上面这行命令,你可以按自己的需要修改,但注意一定要指明 -platform 后的参数,指明想要配置成那个版本的 VS 。例如系想要编译成 VS2005 (当然前提是你已经安装了 VS2005 ),就换成 win32-msvc2005 。这一步会生成一个 makefile 供 nmake 编译生成所有的库。这一步要花点时间,大概 30 分钟。 5. 输入 nmake ,回车,开始编译。这一步跟漫长,我的大概编译了 3 个小时 ~~ 注意: 如果你是 Windows 7 下,这里多半会失败,因为 Win 7 SDK 有 Bug ,在 binary 没有 resouce 区域的时候 mt 程序是不能把 manifest 添加到 binary 中的(参考: http://download.microsoft.com/download/8/8/0/8808A472-6450-4723-9C87-977069714B27/ReleaseNotes.Htm ),所以我们需要做一些修改才行, 第一步,在 CMD 下执行如下命令 c:\qt\4.5.0-vc\qtecho.hello.rc c:\qt\4.5.0-vc\qt rc.exe /r hello.rc 得到 c:\qt\4.5.0-vc\qt\hello.res 资源文件。 第二步,修改 qmake 配置文件,使得 Makefile 的链接命令中会把 hello.res 一并链接到 binary 中。修改 mkspecs\win32-msvc2005 目录下的 qmake.conf 文件第 52 行为 QMAKE_LFLAGS = /NOLOGO C:\Qt\4.5.0-vc\qt\hello.res 这样任何 link 命令都必然会链接 hello.res 文件。 然后才能输入 nmake 开始编译。 6. 安装官方的 VS 插件 qt-vs-addin-1.0.0-beta.exe , 7. 启动 Visual Studio ,选择菜单 Qt-Qt Options ,在 Qt Verions 选项卡点击 Add , Version Name 随便填,例如 qt4.5.0-vc ,路径则输入 C:\Qt\4.5.0-vc\qt 。(网上的资料有说要建立环境变量 QTDIR= C:\Qt\4.5.0-vc\qt ,我个人认为是不必要的)。 同时在 我的电脑-属性- Advanced system setting-enviroment variables中给path添加C:\Qt\4.5.0-vc\bin; 8. 现在你的 Visual Studio 完全具备了 Qt 的所有功能,新建一个 Qt 工程编译运行试一试! (编译好后,在 VS 下点击 Debug-Debug without debuggine 可以看见程序运行的效果,不过 如果直接到 debug 目录下双击这个 exe 文件,会提示找不到 QtCore4d.dll ,这时你需要把 C:\Qt\4.5.0-vc\qt\bin 加入到 PATH 环境变量,这目录下还有 QtCore4.dll ,都是上面编译出来的)。 不过你现在的环境是集成了 LGPL 版 Qt 的 VS ,跟商业版的还是有点不同。例如 Qt Desiner (资源设计器)不是嵌入到 VS 得,需要通过菜单 Qt-Launch Desiner 来执行(商业版直接双击 .ui 文件就会启动 Qt Desiner )。不过这无关紧要,只是多点几下鼠标而已。 点击 Qt-Launch Linguist 可以启动 Qt Linguist ,它是一款本地化工具,也十分有用。
个人分类: 生活点滴|3468 次阅读|0 个评论
11个窗口揭示仪器开发多平台编程奥秘
chrujun 2010-7-14 13:26
为了开发仪器,不得不同时打开11个窗口。先介绍这些窗口的作用,再写几句总结。 第一个窗口:显示DSP程序文件目录供选择。 第二个窗口:UltraEdit编辑器,用于编辑DSP和LINUX下的C程序。 第三个窗口:VISUAL C++开发环境,用于开发和调试上位机程序。 第四个窗口:与仪器的联机的TELNET终端,用于监控仪器工作状态。 第五个窗口:同样是与与仪器的联机的TELNET终端,用于启动和运行仪器中的各种程序。 第六个窗口:命令行窗口。用于编译DSP程序,用FTP将DSP程序传到仪器。 第七个窗口:命令行窗口。用于上传LINUX程序。 第八个窗口:虚拟机,用于交叉编译仪器中的LINUX程序。 第九个窗口:基于串口的超级终端,用于监控仪器的基本工作状态。 第十个窗口:显示LINUX源程序目录。 第十一个窗口:正在运行的上位机程序,用于控制仪器的测量过程,分析测量数据。 为了开发基于嵌入式控制系统和DSP的仪器,需要同时开发运行在DSP、ARM和PC机上的程序。PC机处于主控程序状态,全部程序都在PC机上开发,再通过网络或串口传到下位机。为了实现不同程序的同步工作和调试,需要运行全部程序开发工具,再加上网络传输工具,这个要求必须要同时打开11个窗口,才能满足仪器开发的基本要求。
个人分类: 地球物理及仪器|4900 次阅读|12 个评论
[转载]Visual Studio 2008安装失败 "Web 创作组件"无法安装
zdpbeauty 2010-4-15 16:39
Visual Studio 2008 中文正式版可以从微软网站下载试用了,因为之前用英文版感觉比2005快一些,虽然.NET Framework 3.5有点庞大,但还是可以选择开发2.0的项目,因此打算立马安装。试用期为三个月,足够长了,因此安装Team System版本,体验一下新特性。但是最担心的事情还是发生了无法安装。 问题出在哪里呢?我打算找出原因,试图解决问题。 因为除Visual Studio本身以外,VS安装过程中安装的其他附带安装的组件,基本上都是有单独安装包的。先找到Visual Studio Web 创作组件的独立安装包,试试单独安装能不能成功。 果然,在安装DVD的\WCU\WebDesignerCore文件夹中找到了Visual Studio Web 创作组件的安装程序。将其复制到硬盘上并解压缩,可以发现该组件使用的是Office 2007的安装方式,运行其中的setup.exe,出现与Office 2007相同的安装程序界面。单击立即安装,结果出现找不到office.zh-cn文件夹中文件的对话框,选择了安装程序所在的正确位置并确定,又再一次弹出同样的窗口,安装无法继续: 仔细核对文件名,确定安装文件夹中的确有需要的文件,但为什么还是提示找不到呢? 既然这个组件使用Office 2007的安装方式,文件夹中也有office.zh-cn这个和Office 2007共有的组件,那会不会是因为Office 2007的问题,导致Visual Studio Web 创作组件无法安装呢? 打开Vista中的程序和功能,选择Office 2007,并单击更改按钮,在弹出的安装程序界面中,选择修复,并继续, 果然不出所料,这时也出现了同样的找不到安装文件的对话框,基本确定是因为Office 2007的问题导致Visual Studio 安装失败。 这时想起来,在安装Office时,安装程序默认情况下会将安装文件缓存在系统分区的隐藏文件夹MSOCache中,安装完成后并不会将其删除。由于这个文件夹实在是太大了,平常用Office其实并不需要它,因此安装完Office之后就手动将其删除了,而在修复Office组件时,需要访问MSOCache文件夹中的安装文件,所以就出现了以上问题。以往的经验是,已删除MSOCache文件夹时,可以放入Office原来的安装光盘,即可顺利修复。 于是直接放入Office 2007的安装光盘,在弹出寻找文件的对话框时,指向安装盘中office.zh-cn文件夹所在的位置(一般是光驱根目录),Office 2007被成功修复,这时再安装Visual Studio Web 创作组件,也顺利的安装上了: 接下来启动Visua Studio 2008安装程序,也顺利的安装,没有再遇到问题。安装完成后可以再次删除安装Visual Studio Web 创作组件时缓存下来的MSOCache文件夹(注意是隐藏文件夹)。 至此终于找到原因,原来是因为Office 2007的安装源缓存MSOCache文件夹被用户删除导致的。只要找到Office 2007的安装文件,即可顺利安装Visual Studio Web 创作组件。 最后还要考虑一个问题,为什么指向Visual Studio Web 创作组件安装程序中的office.zh-cn文件夹无法通过验证,而Office 2007安装盘中的office.zh-cn文件就可以呢?对比两个文件夹发现,其中只有OfficeLR.cab、officemui.msi、officemui.xml三个文件不同,而前两个主要文件,仅仅是数字签名日期不同。可能是由于系统中已经安装了Office 2007,而记录了这些安装程序的哈希值,安装程序只承认Office 2007的安装文件版本,而不接受其他的版本。 详细出处参考: http://www.jb51.net/article/15126.htm VS2008中文试用版刚出来不久就上网拖了下来 可是 安装 的时候却出问题了。后来,Google了下,把自己遇到的问题和解决方法跟大家分享。 1.让试用版变成正式版 从Microsoft那下了7个压缩文件分包后,解压后是一个ISO文件。 我用UltraISO编辑了下ISO文件:Setup--setup.sdb文件提取出来编辑,将 T2CRQGDKBVW7KJR8C6CKXMW3D 改成 PYHYPWXB3BB2CCMV9DX9VDY8T 这样,安装的时候就默认是这个正版的序列号了。 还有一种方法就是,不改这个文件,安装后,再添加删除程序的时候可以输入序列号: PYHYP-WXB3B-B2CCM-V9DX9-VDY8T 也可以变成正版。 好了,可以安装了^_^ 顺便把下载连接贴出来: 官方下载地址: http://www.microsoft.com/downloa ... p;displaylang=zh-cn 或直接下载压缩: http://download.microsoft.com/do ... SX1429243.part1.exe http://download.microsoft.com/do ... SX1429243.part2.rar http://download.microsoft.com/do ... SX1429243.part3.rar http://download.microsoft.com/do ... SX1429243.part4.rar http://download.microsoft.com/do ... SX1429243.part5.rar http://download.microsoft.com/do ... SX1429243.part6.rar http://download.microsoft.com/do ... SX1429243.part7.rar 团队资源管理器: http://download.microsoft.com/do ... TeamExplorerCHS.iso 一些VS2008介绍及学习资料: Visual Studio 2008的性能改进以及十大新功能: http://news.csdn.net/n/20080125/113132.html CSDN--Visual Studio 2008专题 http://subject.csdn.net/vs2008/
个人分类: 网络编程|3699 次阅读|0 个评论
Visual C++开发工具与调试技巧整理
whq2008 2009-9-8 17:32
引自 http://dev.yesky.com/133/7578633.shtml 自己总是用VC平台来开发东西,但是有时候总是出这样那样的问题,在这里把 VisualC++开发工具与调试技巧 整理摘录如下,希望对大家有用,省去大家再去搜索的烦恼。    1.如何在Release状态下进行调试   Project-Setting=ProjectSetting对话框,选择Release状态。C/C++标签中的Category选General,Optimizations选Disable(Debug),Debutinfo选ProgramDatabase。在Link标签中选中Generatedebuginfo复选框。   注:只是一个介乎Debug和Release的中间状态,所有的ASSERT、VERIFY都不起作用,函数调用方式已经是真正的调用,而不查表,但是这种状态下QuickWatch、调用队列跟踪功能仍然有效,和Debug版一样。    2.Release和Debug有什么不同   Release版称为发行版,Debug版称为调试版。   Debug中可以单步执行、跟踪等功能,但生成的可执行文件比较大,代码运行速度较慢。Release版运行速度较快,可执行文件较小,但在其编译条件下无法执行调试功能。   Release的exe文件链接的是标准的MFCDLL(UseMFCinasharedorstaticdll)。这些DLL在安装Windows的时候,已经配置,所以这些程序能够在没有安装VisualC++6.0的机器上运行。而Debug版本的exe链接了调试版本的MFCDLL文件,在没有安装VisualC++6.0的机器上不能运行,因为缺相应的DLL,除非选择usestaticdllwhenlink。    3.ASSERT和VERIFY有什么区别   ASSERT里面的内容在Release版本中不编译,VERIFY里面的内容仍然翻译,但不再判断真假。所以后者更安全一点。   例如ASSERT(file.Open(strFileName))。   一旦到了Release版本中,这一行就忽略了,file根本就不Open()了,而且没有任何出错的信息。如果用VERIFY()就不会有这个问题。    4.Workspace和Project之间是什么样的关系   每个Workspace可以包括几个project,但只有一个处于Active状态,各个project之间可以有依赖关系,在project的Setting..中可以设定,比如那个Active状态的project可以依赖于其他的提供其函数调用的静态库。    5.如何在非MFC程序中使用ClassWizard   在工程目录下新建一个空的.RC文件,然后加入到工程中就可以了。    6.如何设置断点   按F9在当前光标处增加一个断点和取消一个断点。   另外,在编辑状态下,按Ctrl+B组合键,弹出断点设置对话框。然后单击【Condition】按钮弹出设置断点条件的对话框进行设置。    7.在编辑状态下发现成员变量或函数不能显示提示是如何打开显示功能   这似乎是目前这个VisualC++6.0版本的一个bug,可按如下步骤使其正常,如再出现,可如法炮制:   (1)关闭Project   (2)删除工程名.ncb文件   (3)重新打开工程    8.如何将一个通过ClassWizard生成的类彻底删除   首先在工作区的FileView中选中该类的.h和.cpp文件,按delete删除,然后在文件管理器中将这两个文件删除,再运行ClassWizard,这时出现是否移走该类的提示,选择remove就可以了。    9.如何将在workspace中消失的类找出来   打开该类对应的头文件,然后将其类名随便改一下,这个时候工作区就会出现新的类,再将这个类改回原来的名字就可以了。    10.如何清除所有的断点   菜单【Edit】-【Breakpoints】,打开Breakpoints对话框,单击【RemoveAll】按钮即可。快捷键是Ctrl+Shift+F8。    11.如何再ClassWizard中选择未列出的信息   打开ClassWizard对话框,然后切换到ClassInfo页面。改变Messagefilter,如选择Window,Message页面就会出现Window的信息。    12.如何检测程序中的括号是否匹配   把光标移动到需要检测的括号前面,按快捷键Ctrl+]。如果括号匹配正确,光标就跳到匹配的括号处,否则光标不移动,并且机箱喇叭还会发出一声警告。    13.如何查看一个宏(或变量、函数)的定义   把光标移动到要查看的一个宏上,就比如说最常见的DECLARE_MAP_MESSAGE上按一下F12(或右键菜单中的相关菜单),如果没有建立浏览文件,就会出现提示对话框,按【确定】按钮,然后就会跳到该宏(或变量、函数)定义的地方。    14.如何添加Lib文件到当前工程   单击菜单【Project】-【Settings】弹出ProjectSetting对话框,切换到Link标签页,在Object/librarymodules处输入Lib文件名称,不同的Lib之间用空格格开。    15.如何快速删除项目下的Debug文件夹中临时文件   在工作区的FileView视图中选中对应的项目,单击右键弹出菜单,选择【Clean(selectiononly)】菜单即可。    16.如何快速生成一个现有工程除了工程名外完全相同的新工程   在新建工程的New对话框中选择CustomAppwizard项,输入新工程的名字,单击【OK】按钮。出现CustomAppWizard项,输入新工程的名字,单击【OK】按钮。出现CustomAppWizard-Step1of2对话框,选择AnexistingProject项,单击【Next】按钮。出现CustomAppWizard-Step2of2对话框,选择现有工程的工程文件名,最后单击【Finish】按钮。编译后就生成一个与现有工程相同但可以重新取名的工程AppWizard。   现在就可以项用MFCAppWizard一样用这个定制的向导。如果不想用了,可以在VisualC++6.0安装目录下Common\MSDev98\Template目录中删除该Wizard对应的.awx和.pdb文件。    17.如何解决VisualC++6.0不正确连接的问题   情景:明明改动了一个文件,却要把整个项目全部重新编译链接一次。刚刚链接好,一运行,又提示重新编译链接一次。   这是因为出现了未来文件(修改时间和创建时间比系统时间晚)的缘故。可以这样处理:找到工程文件夹下的debug目录,将创建和修改时间都比系统时间的文件全部删除,然后再从新RebuildAll一次。    18.引起LNK2001的常见错误都有哪些   遇到的LNK2001错误主要为:unresolvedexternalsymbolsymbol   如果链接程序不能在所有的库和目标文件内找到所引用的函数、变量或标签,将产生此错误信息
个人分类: 未分类|5630 次阅读|1 个评论
[转贴]VC常用数据类型使用转换详解
fswdong 2009-6-21 08:36
个人在算法调试过程中主要使用VC6,所以经常遇到一些基本类型转换问题,所以收集了这份小小的资料,以备后用 vc++中各种字符串的表示法 首先char* 是指向ANSI字符数组的指针,其中每个字符占据8位(有效数据是除掉最高位的其他7位),这里保持了与传统的C,C++的兼容。 LP的含义是长指针(long pointer)。LPSTR是一个指向以\0结尾的ANSI字符数组的指针,与char*可以互换使用,在win32中较多地使用LPSTR。 而LPCSTR中增加的C的含义是CONSTANT(常量),表明这种数据类型的实例不能被使用它的API函数改变,除此之外,它与LPSTR是等同的。 1.LP表示长指针,在win16下有长指针(LP)和短指针(P)的区别,而在win32下是没有区别的,都是32位.所以这里的LP和P是等价的. 2.C表示const 3.T是什么东西呢,我们知道TCHAR在采用Unicode方式编译时是wchar_t,在普通时编译成char. 为了满足程序代码国际化的需要,业界推出了Unicode标准,它提供了一种简单和一致的表达字符串的方法,所有字符中的字节都是16位的值,其数量也可以满足差不多世界上所有书面语言字符的编码需求,开发程序时使用Unicode(类型为wchar_t)是一种被鼓励的做法。 LPWSTR与LPCWSTR由此产生,它们的含义类似于LPSTR与LPCSTR,只是字符数据是16位的wchar_t而不是char。 然后为了实现两种编码的通用,提出了TCHAR的定义: 如果定义_UNICODE,声明如下: typedef wchar_t TCHAR; 如果没有定义_UNICODE,则声明如下: typedef char TCHAR; LPTSTR和LPCTSTR中的含义就是每个字符是这样的TCHAR。 CString类中的字符就是被声明为TCHAR类型的,它提供了一个封装好的类供用户方便地使用。 LPCTSTR: #ifdef _UNICODE typedef const wchar_t * LPCTSTR; #else typedef const char * LPCTSTR; #endif VC常用数据类型使用转换详解 先定义一些常见类型变量借以说明 int i = 100; long l = 2001; float f=300.2; double d=12345.119; char username ; char *buf; CString str; _variant_t v1; _bstr_t v2; 一、其它数据类型转换为字符串 短整型(int) itoa(i,temp,10); //将i转换为字符串放入temp中,最后一个数字表示十进制 itoa(i,temp,2); //按二进制方式转换 长整型(long) ltoa(l,temp,10); 二、从其它包含字符串的变量中获取指向该字符串的指针 CString变量 str = 2008北京奥运; buf = (LPSTR)(LPCTSTR)str; BSTR类型的_variant_t变量 v1 = (_bstr_t)程序员; buf = _com_util::ConvertBSTRToString((_bstr_t)v1); 三、字符串转换为其它数据类型 strcpy(temp,123); 短整型(int) i = atoi(temp); 长整型(long) l = atol(temp); 浮点(double) d = atof(temp); 四、其它数据类型转换到CString 使用CString的成员函数Format来转换,例如: 整数(int) str.Format(%d,i); 浮点数(float) str.Format(%f,i); 字符串指针(char *)等已经被CString构造函数支持的数据类型可以直接赋值 str = username; 五、BSTR、_bstr_t与CComBSTR CComBSTR、_bstr_t是对BSTR的封装,BSTR是指向字符串的32位指针。 char *转换到BSTR可以这样: BSTR b=_com_util::ConvertStringToBSTR(数据); //使用前需要加上头文件comutil.h 反之可以使用char *p=_com_util::ConvertBSTRToString(b); 六、VARIANT 、_variant_t 与 COleVariant VARIANT的结构可以参考头文件VC98\Include\OAIDL.H中关于结构体tagVARIANT的定义。 对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,再对联合结构中相同数据类型的变量赋值,举个例子: VARIANT va; int a=2001; va.vt=VT_I4; //指明整型数据 va.lVal=a; //赋值 对于不马上赋值的VARIANT,最好先用Void VariantInit(VARIANTARG FAR* pvarg);进行初始化,其本质是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系: unsigned char bVal; VT_UI1 short iVal; VT_I2 long lVal; VT_I4 float fltVal; VT_R4 double dblVal; VT_R8 VARIANT_BOOL boolVal; VT_BOOL SCODE scode; VT_ERROR CY cyVal; VT_CY DATE date; VT_DATE BSTR bstrVal; VT_BSTR IUnknown FAR* punkVal; VT_UNKNOWN IDispatch FAR* pdispVal; VT_DISPATCH SAFEARRAY FAR* parray; VT_ARRAY|* unsigned char FAR* pbVal; VT_BYREF|VT_UI1 short FAR* piVal; VT_BYREF|VT_I2 long FAR* plVal; VT_BYREF|VT_I4 float FAR* pfltVal; VT_BYREF|VT_R4 double FAR* pdblVal; VT_BYREF|VT_R8 VARIANT_BOOL FAR* pboolVal; VT_BYREF|VT_BOOL SCODE FAR* pscode; VT_BYREF|VT_ERROR CY FAR* pcyVal; VT_BYREF|VT_CY DATE FAR* pdate; VT_BYREF|VT_DATE BSTR FAR* pbstrVal; VT_BYREF|VT_BSTR IUnknown FAR* FAR* ppunkVal; VT_BYREF|VT_UNKNOWN IDispatch FAR* FAR* ppdispVal; VT_BYREF|VT_DISPATCH SAFEARRAY FAR* FAR* pparray; VT_ARRAY|* VARIANT FAR* pvarVal; VT_BYREF|VT_VARIANT void FAR* byref; VT_BYREF _variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,其构造函数会自动处理这些数据类型。 例如: long l=222; ing i=100; _variant_t lVal(l); lVal = (long)i; COleVariant的使用与_variant_t的方法基本一样,请参考如下例子: COleVariant v3 = 字符串, v4 = (long)1999; CString str =(BSTR)v3.pbstrVal; long i = v4.lVal; 七、其它 对消息的处理中我们经常需要将WPARAM或LPARAM等32位数据(DWORD)分解成两个16位数据(WORD),例如: LPARAM lParam; WORD loValue = LOWORD(lParam); //取低16位 WORD hiValue = HIWORD(lParam); //取高16位 对于16位的数据(WORD)我们可以用同样的方法分解成高低两个8位数据(BYTE),例如: WORD wValue; BYTE loValue = LOBYTE(wValue); //取低8位 BYTE hiValue = HIBYTE(wValue); //取高8位 如何将CString类型的变量赋给char*类型的变量 1、GetBuffer函数: 使用CString::GetBuffer函数。 char *p; CString str=hello; p=str.GetBuffer(str.GetLength()); str.ReleaseBuffer(); 将CString转换成char * 时 CString str(aaaaaaa); strcpy(str.GetBuffer(10),aa); str.ReleaseBuffer(); 当我们需要字符数组时调用GetBuffer(int n),其中n为我们需要的字符数组的长度.使用完成后一定要马上调用ReleaseBuffer(); 还有很重要的一点就是,在能使用const char *的地方,就不要使用char * 2、memcpy: CString mCS=_T(cxl); char mch ; memcpy(mch,mCS,20); 3、用LPCTSTR强制转换: 尽量不使用 char *ch; CString str; ch=(LPSTR)(LPCTSTR)str; CString str = good; char *tmp; sprintf(tmp,%s,(LPTSTR)(LPCTSTR)str); 4、 CString Msg; Msg=Msg+abc; LPTSTR lpsz; lpsz = new TCHAR ; _tcscpy(lpsz, Msg); char * psz; strcpy(psz,lpsz); CString类向const char *转换 char a ; CString str(aaaaaa); strncpy(a,(LPCTSTR)str,sizeof(a)); 或者如下: strncpy(a,str,sizeof(a)); 以上两种用法都是正确地. 因为strncpy的第二个参数类型为const char *.所以编译器会自动将CString类转换成const char *. CString转LPCTSTR (const char *) CString cStr; const char *lpctStr=(LPCTSTR)cStr; LPCTSTR转CString LPCTSTR lpctStr; CString cStr=lpctStr; 将char*类型的变量赋给CString型的变量 可以直接赋值,如: CString myString = This is a test; 也可以利用构造函数,如: CString s1(Tom); 将CString类型的变量赋给char ; sprintf(tmp, %s,(LPCSTR)str); (LPCSTR)str这种强制转换相当于(LPTSTR)(LPCTSTR)str CString类的变量需要转换为(char*)的时,使用(LPTSTR)(LPCTSTR)str 然而,LPCTSTR是const char *,也就是说,得到的字符串是不可写的!将其强制转换成LPTSTR去掉const,是极为危险的! 一不留神就会完蛋!要得到char *,应该用GetBuffer()或GetBufferSetLength(),用完后再调用ReleaseBuffer()。 2、strcpy()函数 CString str; char c ; strcpy(c, str); char mychar ; CString source=Hello; strcpy((char*)mychar,(LPCTSTR)source); 关于CString的使用 1、指定 CString 形参 对于大多数需要字符串参数的函数,最好将函数原型中的形参指定为一个指向字符 (LPCTSTR) 而非 CString 的 const 指针。 当将形参指定为指向字符的 const 指针时,可将指针传递到 TCHAR 数组(如字符串 )或传递到 CString 对象。 CString 对象将自动转换成 LPCTSTR。任何能够使用 LPCTSTR 的地方也能够使用 CString 对象。 2、如果某个形参将不会被修改,则也将该参数指定为常数字符串引用(即 const CString)。如果函数要修改该字符串, 则删除 const 修饰符。如果需要默认为空值,则将其初始化为空字符串 ,如下所示: void AddCustomer( const CString name, const CString address, const CString comment = ); 3、对于大多数函数结果,按值返回 CString 对象即可。 串的基本运算 对于串的基本运算,很多高级语言均提供了相应的运算符或标准的库函数来实现。 为叙述方便,先定义几个相关的变量: char s1 =dir/bin/appl,s2 =file.asm,s3 ,*p; int result; 下面以C语言中串运算介绍串的基本运算 1、求串长 int strlen(char *s); //求串s的长度 【例】printf(%d,strlen(s1)); //输出s1的串长12 2、串复制 char *strcpy(char *to,*from);//将from串复制到to串中,并返回to开始处指针 【例】strcpy(s3,s1); //s3=dir/bin/appl,s1串不变 3、联接 char *strcat(char *to,char *from);//将from串复制到to串的末尾, //并返回to串开始处的指针 【例】strcat(s3,/); //s3=dir/bin/appl/ strcat(s3,s2); //s3=dir/bin/appl/file.asm 4、串比较 int strcmp(char *s1,char *s2);//比较s1和s2的大小, //当s1s2、s1s2和s1=s2时,分别返回小于0、大于0和等于0的值 【例】result=strcmp(baker,Baker); //result0 result=strcmp(12,12); //result=0 result=strcmp(Joe,joseph) //result0 5、字符定位 char *strchr(char *s,char c);//找c在字符串s中第一次出现的位置, //若找到,则返回该位置,否则返回NULL 【例】p=strchr(s2,'.'); //p指向file之后的位置 if(p) strcpy(p,.cpp); //s2=file.cpp 注意:  ①上述操作是最基本的,其中后 4个操作还有变种形式:strncpy,strncath和strnchr。  ②其它的串操作见C的string.h。在不同的高级语言中,对串运算的种类及符号都不尽相同  ③其余的串操作一般可由这些基本操作组合而成 【例】求子串的操作可如下实现: void substr(char *sub,char *s,int pos,int len){ //s和sub是字符数组,用sub返回串s的第pos个字符起长度为len的子串 //其中0=pos=strlen(s)-1,且数组sub至少可容纳len+1个字符。 if (pos0||posstrlen(s)-1||len0) Error(parameter error!); strncpy(sub,s ,len); //从s 起复制至多len个字符到sub
个人分类: 科研资源|4450 次阅读|0 个评论

Archiver|手机版|科学网 ( 京ICP备07017567号-12 )

GMT+8, 2024-4-26 10:48

Powered by ScienceNet.cn

Copyright © 2007- 中国科学报社

返回顶部