VC++编程经验总结
VC++编程经验总结(精选6篇)
VC++编程经验总结 第1篇
VC++编程经验总结
vc++如何实现远程调试
*假设调试机IP 192.168.0.182 远程机IP 192.168.0.161
*远程机为调试机分配权限,使调试机可以使用远程桌面登陆到远程机器上(这样调试起来方便)。
*调试机上安装visual studio.net 2003
共享调试机上的Visual Studio上的远程调试目录(以我的机器为例)
C:Program FilesMicrosoft Visual Studio.NET
2003Common7PackagesDebugger
*远程机将上面的共享目录考贝到本地,比如:d:Debugger
*调试机共享要调试的程序所在目录,比如:
D:importantcvsrootdv-to-dvdbindebug
*远程机将调试机上的目录影射为本地目录。比如:Z:
*远程机上以命令行形式执行 D:Debuggermsvcmon.exe –tcpip –anyuser
*调试机启动vc.打开要调试的工程。比如dvtodvd.选择菜单project->properties 选debuging->remote setting
Connection :Remote via TCP/IP(Native only)
Remote machine: 192.168.0.161
Remote Command: z:dvtodvd.exe
*debug->start
*就可以调试了。
1.如何在Release状态下进行调试
Project->Setting=>ProjectSetting 对话框,选择Release状态。C/C++标签中的Category选General,Optimizations选 Disable(Debug),Debut info选Program Database。在Link标签中选中Generate debug info复选框。
注:只是一个介乎Debug和Release的中间状态,所有的ASSERT、VERIFY都不起作用,函数调用方式已经是真正的调用,而不查表,但是这种状态下QuickWatch、调用队列跟踪功能仍然有效,和Debug版一样。
2.Release和Debug有什么不同
Release版称为发行版,Debug版称为调试版。
Debug中可以单步执行、跟踪等功能,但生成的可执行文件比较大,代码运行速度较慢。Release版运行速度较快,可执行文件较小,但在其编译条件下无法执行调试功能。Release 的exe文件链接的是标准的MFC DLL(Use MFC in a shared or static dll)。这些DLL在安装Windows的时候,已经配置,所以这些程序能够在没有安装Visual C++ 6.0的机器上运行。而Debug版本的exe链接了调试版本的MFC DLL文件,在没有安装Visual C++6.0的机器上不能运行,因为缺相应的DLL,除非选择use static dll when link。
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.在编辑状态下发现成员变量或函数不能显示提示是如何打开显示功能
这似乎是目前这个Visual C++ 6.0版本的一个bug,可按如下步骤使其正常,如再出现,可如法炮制:
(1)关闭Project
(2)删除“工程名.ncb”文件
(3)重新打开工程
8.如何将一个通过ClassWizard生成的类彻底删除
首先在工作区的FileView中选中该类的.h和.cpp文件,按delete删除,然后在文件管理器中将这两个文件删除,再运行ClassWizard,这时出现是否移走该类的提示,选择remove就可以了。
9.如何将在workspace中消失的类找出来
打开该类对应的头文件,然后将其类名随便改一下,这个时候工作区就会出现新的类,再将这个类改回原来的名字就可以了。
10.如何清除所有的断点
菜单【Edit】->【Breakpoints…】,打开“Breakpoints”对话框,单击【Remove All】按钮即可。快捷键是“Ctrl + Shift + F8”。
11.如何再ClassWizard中选择未列出的信息
打开“ClassWizard”对话框,然后切换到“Class Info”页面。改变“Message filter”,如选择“Window”,“Message”页面就会出现Window的信息。
12.如何检测程序中的括号是否匹配
把光标移动到需要检测的括号前面,按快捷键“Ctrl + ]”。如果括号匹配正确,光标就跳到匹配的括号处,否则光标不移动,并且机箱喇叭还会发出一声警告。
13.如何查看一个宏(或变量、函数)的定义
把光标移动到要查看的一个宏上,就比如说最常见的DECLARE_MAP_MESSAGE上按一下F12(或右键菜单中的相关菜单),如果没有建立浏览文件,就会出现提示对话框,按【确定】按钮,然后就会跳到该宏(或变量、函数)定义的地方。
14.如何添加Lib文件到当前工程
单击菜单【Project】->【Settings…】弹出“Project Setting”对话框,切换到“Link”标签页,在“Object/library modules”处输入Lib文件名称,不同的Lib之间用空格格开。
15.如何快速删除项目下的Debug文件夹中临时文件
在工作区的FileView视图中选中对应的项目,单击右键弹出菜单,选择【Clean(selection only)】菜单即可。
16.如何快速生成一个现有工程除了工程名外完全相同的新工程
在新建工程的“New”对话框中选择“Custom Appwizard”项,输入新工程的名字,单击
【OK】按钮。出现“Custom AppWizard”项,输入新工程的名字,单击【OK】按钮。出现“Custom AppWizard-Step 1 of 2”对话框,选择“An existing Project”项,单击
【Next】按钮。出现“Custom AppWizard-Step 2 of 2”对话框,选择现有工程的工程文件名,最后单击【Finish】按钮。编译后就生成一个与现有工程相同但可以重新取名的工程AppWizard。
现在就可以项用MFC AppWizard一样用这个定制的向导。如果不想用了,可以在Visual C++ 6.0安装目录下CommonMSDev98Template目录中删除该Wizard对应的.awx和.pdb文件。
17.如何解决Visual C++ 6.0不正确连接的问题
情景:明明改动了一个文件,却要把整个项目全部重新编译链接一次。刚刚链接好,一运行,又提示重新编译链接一次。
这是因为出现了未来文件(修改时间和创建时间比系统时间晚)的缘故。可以这样处理:找到工程文件夹下的debug目录,将创建和修改时间都比系统时间的文件全部删除,然后再从新“Rebuild All”一次。
18.引起LNK2001的常见错误都有哪些
遇到的LNK2001错误主要为:unresolved external symbol “symbol”
如果链接程序不能在所有的库和目标文件内找到所引用的函数、变量或标签,将产生此错误信息。
一般来说,发生错误的原因有两个:一是所引用的函数、变量不存在,拼写不正确或者使用错误;其次可能使用了不同版本的链接库。以下是可能产生LNK2001错误的原因:
<1>由于编码错误导致的LNK2001错误
(1)不相匹配的程序代码或模块定义(.DEF)文件导致LNK2001。例如,如果在C++源文件了内声明了一变量“var1”,却试图在另一个文件内以变量“var1”访问改变量。
(2)如果使用的内联函数是在.cpp文件内定义的,而不是在头文件内定义将导致LNK2001错误。
(3)调用函数时如果所用的参数类型和头函数声明时的类型不符将会产生LNK2001错误。
(4)试图从基类的构造函数或析构函数中调用虚拟函数时将会导致LNK2001错误。
(5)要注意函数和变量的可公用性,只有全局变量、函数是可公用的。静态函数和静态变量具有相同的使用范围限制。当试图从文件外部方位任何没有在该文件内声明的静态变量时将导致编译错误或LNK2001错误。
<2>由于编译和联机的设置而造成的LNK2001错误
(1)如果编译时使用的是/NOD(/NODERAULTLIB)选项,程序所需要的运行库和MFC时将得到又编译器写入目标文件模块,但除非在文件中明确包含这些库名,否则这些库不会被链接进工程文件。这种情况下使用/NOD将导致LNK2001错误
(2)如果没有为wWinMainCRTStartup设定程序入口,在使用Unicode和MFC时将出现“unresolved external on _WinMain@16”的LNK2001错误信息。
(3)使用/MD选项编译时,既然所有的运行库都被保留在动态链接库之内,源文件中对“func”的引用,在目标文件里即对“__imp__func”的引用。如果试图使用静态库LIBC.LIB或LIBCMT.LIB进行链接,将在__imp__func上发生LNK2001错误。如果不使用/MD选项编译,在使用MSVCxx.LIB链接时也会发生LNK2001错误。
(4)使用/ML选项编译时,如用LIBCMT.LIB链接会在_errno上发生LNK2001错误。
(5)当编译调试版的应用程序时,如果采用发行版模态库进行链接也会产生LNK2001错误;同样,使用调试版模态库链接发行版应用程序时也会产生相同的错误。
(6)不同版本的库和编译器的混合使用也能产生问题,因为新版的库里可能包含早先的版本没有的符号和说明。
(7)在不同的模块中使用内联和非内联的编译选项能够导致LNK2001错误。如果创建C++库时打开了函数内联(/Ob1或/Ob2),但是在描述该函数的相应头文件里却关闭了函数内联(没有inline关键字),只是将得到错误信息。为避免该问题的发生,应该在相应的头文件中用inline关键字标志为内联函数。
(8)不正确的/SUBSYSTEM或ENTRY设置也能导致LNK2001错误。
19.如何调试一个没有源码的exe文件调用的dll
在Visual C++ 6.0中,进入“Project Setting”对话框然后选择Debug标签页。通常Visual Studio默认“executable for debug session”为可执行文件名,但可以将他改成任何你想要的程序。甚至可以指定不同的工作目录以及传递参数到你的程序。这个技术常用来调试Dlls、名字空间扩展、COM对象和其他从某些EXE以及从第三方的EXE中调用的plug-in程序。
20.Visual C++ 6.0工程中的项目文件都表示什么
.opt:工程关于开发环境的参数文件。如工具条位置等信息。
.aps(AppStudio File)资源辅助文件,二进制格式,一般不用去管它。
.clw:ClassWizard信息文件,实际上是INI文件格式,有兴趣可以研究一下。有时候ClassWizard出了问题,手工修改CLW文件可以解决。如果此文件不存在的话,每次用ClassWizard的时候回提示是否重建。
.dsp(DevelopStudio Project):项目文件,文本格式,不过不熟悉的不要手工修改。.dsw(DevelopStudio Workspace):是工作区文件,其他特点和.dsp差不多。
.plg:是编译信息文件,编译时的error和warning信息文件(实际上是一个html文件),一般用处不大。在单击菜单【Tool】->【Option】弹出的对话框里面有个选项可以控制这个文件的生成。
.hpj(Help Project):是生成帮助文件的工程,用microsoft Help Compiler可以处理。.mdp(Microsoft DevStudio Project):是旧版本的项目文件,如果要打开此文件的话,会提示你是否转换成新的.dsp格式。
.bsc:是用于浏览项目信息的,如果用Source Brower的话就必须有这个文件。如果不用这个功能的话,可以在Project Options里面去掉Generate Browse Info File,这样可以加快编译速度。
.map是执行文件的映象信息记录文件,除非对系统底层,这个文件一般用不着。.pch(Pre-Compiled File):是与编译文件,可以加快编译速度,但是文件非常大。
.pdb(Program Database):记录了程序有关的一些数据和调试信息,在调试的时候可能有用。
.exp:只有在编译DLL的时候才会生成,记录了DLL文件的一些信息,一般也没有用。.ncb:无编译浏览文件(no compile browser)。当自动完成功能出问题时可以删除此文件。编译工程后会自动生成。
VC++编程经验总结 第2篇
开粗:在机床的最大负荷下,绝大部分情况应选用尽可能大的刀,尽可能大的的进刀量,尽可能快的进给。在同一把刀的情况下,进给与进刀量成反比。一般情况下,机床的负荷不是问题,选刀的原则主要依产品的二维角与三维弧是否过小来考虑。选好刀后,便定刀长,原则是刀长大于加工深度,大工件则要考虑夹头是否有干涉。光刀:光刀的目的是为了达到满足工件表面光洁度、预留适当余量的加工要求。同样,光刀选用尽可能大的刀,尽可能快的时间,因为精刀需要较长的时间,用最合适的进刀与进给。在同一进给下横向进刀越大越快,曲面进刀量与加工后的光洁度有关,进给的大小与曲面的外表形状有关,在不伤及面的情况下,留最小的余量、用最大的刀、最快的转速、适当的进给。
二、装夹方法:
1、所有的装夹都是横长竖短。
2、虎钳装夹:装夹高度不应低于10个毫米,在加工工件时必须指明装夹高度与加工高度。加工高度应高出虎钳平面5毫米左右,目的是保证牢固性,同时不伤及虎钳。此种装夹属一般性的装夹,装夹高度还与工件大小有关,工件越大,则装夹高度相应增大。
3、夹板装夹:夹板用码仔码在工作台上,工件用螺丝锁在夹板上,此种装夹适用于装夹高度不够及加工力较大的工件,一般中大型工件,效果比较好。
4、码铁装夹:在工件较大、装夹高度不够,又不准在底部锁缧丝时,则用码铁装夹。此种装夹需二次装夹,先码好四角,加工好其它部分,然后再码四边,加工四角。二次装夹时,不要让工件松动,先码再松。也可以先码两边,加工另两边。
5、刀具的装夹:直径10mm以上,装夹长度不低于30mm;直径10mm以下,装夹长度不低于20mm。刀具的装夹要牢固,严防撞刀与直接插入工件。
三、刀具的分类及其适用范围:
1、按材质分:
白钢刀:易磨损,用于铜公及小钢料开粗。钨钢刀:用于清角(特别是钢料)及光刀。合金刀:类似于钨钢刀。紫刀:用于高速切削,不易磨损。
2、按刀头分:
平底刀:用于平面及直身侧面,清平面角。球刀:用于各种曲面中光、光刀。
牛鼻刀(有单边、双边及五边):用于钢料开粗(R0.8、R0.3、R0.5、R0.4)。粗皮刀:用于开粗,注意余量的留法(0.3)。
3、按刀杆分:
直杆刀:直杆刀适用各种场合。
斜杆刀:但不适用于直身面及斜度小于杆斜度的面。
4、按刀刃分:
两刃、三刃、四刃,刃数越多,效果越好,但做功越多,转速及进给相应调整,刃数多寿命长。
5、球刀与飞刀光刀的区别:
球刀:凹面尺小于球尺,平面尺小于球R时,光不到(清不到底角)。
飞刀:优点是能清底角。相同参数的比较:V=R*ω转速快许多(飞刀),力大光出的东西亮,飞刀较多地用于等高外形,有时用飞刀不需中光。缺点是凹面尺寸及平面尺小于飞刀直径时光不到。
四、CNC配合电火花加工,铜公的做法:
1、什么情况下需要做铜公:
刀完全下不去要做铜公,在一个铜公中还有下不去的,形状是凸出需再分。刀能下去,但易断刀的也需做铜公,这需根据实际情况而定。要求火花纹的产品需做铜公。铜公做不成的,骨位太薄太高,易损公且易变形,加工中变形与打火花变形,此时需镶件。
铜公加工出的东西表面(特别是曲面会很顺很均匀)能克服精锣中的许多问题与绘图中的许多问题。要求精确外形或余量多时必须做粗铜公。
2、铜公的做法:
选出要做铜公的面,补全该补的面,或延长该延的面,保证铜公的所有边缘大于要打的边缘同时不伤及其它产品的面,去掉不必要的清不到的平面角(与平面角相交处是更深的胶位),补成规则形状;找出铜公最大外形,用一边界然后投影到托面;定出基准框大小,剪掉掉托面,到此铜公图基本完成;备料:长*宽*高,长与宽≥Ymax与Xmax为基准框实际铜料的长宽必须大于图上基准框。高≥铜公的理论尺寸+基准框高+装夹高度。
五、图纸定数问题:
1、在没有现成的加工面下,平面四面分中,中心对原点,顶面对零,顶面不平时(铜公而言)留0.1的余量,即碰数时,实际对(z),图上偏低0.1。
2、当有现成的加工面时,使图上的现成面对0(z),平面能分中则分中,否则以现成边碰数(单边)加工面则要校核实际高度,宽,长与图纸差别,按实际的料来编程。一般情况,先加工成图上的尺寸再加工图上形状。
3、当要多个位加工时,第一个位(标准位),就要把其它几个位的基准锣好,长宽高都要锣,所有下一次加工基准要以上次已加工好的面为准。
4、镶件的定位:放在整体里面,把下面垫起一定高度然后图纸也升高此高度,平面按整体分中,高度按图下面用镙丝锁住;是方方正正的则可直分中;粗略一点可用最大外形分中;割一夹具,按夹具分中,镶件图与夹具的相对位置确定然后把图纸原点放在夹具中心点。
六、开粗的刀路选择:
1、曲面挖槽:
关键是范围的选择与面的选择,刀路加工的区域是以所选范围内所选面为终止面,从最高点到最低点刀具能下得去的所有地方为原则。所选面最好是全体面,边界则只能是所要加工的区域,无面处延伸小于半个刀径的距离,因为其它面留有足够余量所以自动保护;最好延伸最低线,因为最低处有一个R锣不到。
刀的选择:如刀具不能螺旋或斜线进刀时或加工不到的区域进不了刀的区域封起,留待二次开粗。光刀之前,一定要把未开粗的区域全部开粗,特别是小角,其中包括二维角,三维角及封起来的区域,不然则会断刀。
二次开粗:一般用三维挖槽选范围,平底刀,能用平面挖槽与外形刀路的则用。在不伤及其它面的情况下刀具中心到所选边界,一般不精修边界,用快速双向角度视情况而定,螺旋进刀,角度1.5度,高1,当挖槽形状为条形,不能螺旋下刀则用斜线进刀,一般打开过滤,特别是曲面开粗,进刀平面不可低,以免撞刀,安全高度不可低。
退刀:一般不用相对退刀,用绝对退刀,当没有岛屿时则用相对退刀。
2、平面挖槽:铣各种平面,凹平槽,当铣部分开放式平面时,则需定边界,原则能进刀(大于一个刀径),开放处偏外大于半个刀径,封闭外围。
3、外形:当所选平面适合外形分层,则用外形分层提刀(平面外形),提刀点与下刀点为一点时,不须提刀z平面一般提刀,尽量不用相对高度;补正方向一般右补正(顺刀)。
4、机械补正的刀路设置:补正号为21,改电脑补正机械补正,进刀为垂直进刀,刀过不了的地方则改大R不留余量。
5、等高外形:适合于走封闭式的面,走开放式的面若是四圈则要封项面,若是四圈内或非四圈则要选范围与高度(一定弧形进刀开粗),用于开粗的情况:任一平面内的加工距离小于一个刀径,若大于一个刀径则要用更大的刀或两次等高外形。
6、曲面流线:具有最好的均匀性与干脆性,适合光刀很多时候可取代等高外形。
7、放射刀路:适合中间有大孔的情况(少用)。注意事项:弹刀,刀不锋利,刀过长,工件过深时要环绕走不可上下走;工件中的利角两边的面要分两个刀路,不可越过去,光刀时的边缘最好延长(用弧线进退刀)。
七、清角:
1、这里的清角清的是二维死角,是前面工序都未曾走到的部分,如光刀需走到的地方则应先清角再光刀,太小大深的角可分几把刀清,不要用小刀清太多地方。
2、清三维角:开一些小槽,一些三维转角处。
3、易断刀,一定要考虑像细刀、过长,加工量过大(主要是z向,深度方向)的情况。
4、刀路:用二维外形走,只能清小角(R0.8)及二维平面角;用平行刀路;用等高外形;有一种地方刀子去不了的曲面及外形走不到的死角则要先封起来起刀,最后清角,大面中的小缺口一般先封起来。
八、中光:
1、中光:作为曲面的钢料与细公才中光。
2、原则:大刀开粗时层与层间的余量较多,为使光刀时得到更好效果的一道工序,3、特点:快速清除,大刀飞刀亦可,大进给,大间距;不必顾忌表面质量;平面的工件不必中光;等高外形的工件不用中光,等高外形开粗时可细一点把两道工序放在一起,细一点指表面余量与层与层的距离;需不需中光,还有一个重要因素是工作的材料,材料越硬,则考虑中光;中光的加工方向与光刀开粗最好相对这样加工的东西会效果好,均匀。
九、光刀:
光刀是要达到各种产品与模具的装配要求所以要非常慎重,根据不同的要求给予不同的刀路设置与参数设置。
1、光刀的下刀高度与最后高度都改为0,公差设计1个丝以内,不需过滤(工件越小公差越小,公差影响外型)。
2、前模与分型面要达到最好的光洁度,后模可次,其它非配合及避空位可粗糙点。
3、刀路设计由以下因素决定:
具体外形(如平面与其它面),陡峭面与平坦曲面。两面之间是否利角(利角则分开)。两部分是否要求不同(要不要留余量,余量的多少,光洁度的要求不同)。光刀中保护面问题是个大问题,对已加工好的面一定要预到加工中的误差保护起来,按保护面的要求保护起来。范围保护,不计误差的0保护,高度范围与平面范围;保护面保护。
刀路的延长问题:光刀中,刀路加工到边缘时最好作圆弧进退刀否则事先把面稍加延长。
光刀中的提刀问题:提刀浪费时间,所以尽量避免提刀。方法1:设提刀间隙(小缺口)
方法2:封面,把提刀处封起来(小缺口)方法3:避开间隙(大缺口处)
基于VC编程的数字图像几何变换 第3篇
摄影测量与遥感所获取数字影像, 尤其是近景摄影测量采用非量测相机获取的影像, 不能直接应用于测量, 首先需要经过图像处理, 形成满足测量要求的图像。
图像几何变换是图像处理的基础。经过几何变换, 使图像易于处理, 有利于特征提取和对图像信息的理解。
1 原理介绍
1.1 图像平移
平移是指将图像中所有的点都按照指定的平移量水平、垂直移动。设 (x0, y0) 为原图像上的一点, 图像水平平移量tx, 垂直平移量为ty, 则平移后点 (x0, y0) 的坐标变为 (x1, y1) 。
(x0, y0) 与 (x1, y1) 之间的关系为:x1=x0+tx;y1=y0+ty。
平移后图像上的一点是由原图像上某点经过平移得到的, 因此平移后图像中每个像素的颜色是由原图像中对应像素颜色确定的。如新图中的 (0, 0) 点的颜色和其在原图中的对应点 (-tx, -ty) 处的一样。
1.2 图像旋转
图像旋转通常是以图像的中心为圆心, 按顺时针方向旋转。
设旋转前一点坐标 (x0, y0) , 旋转a角度后对应点坐标 (x1, y1) , 则以矩阵的形式表示:
1.3 图像缩放
假设放大因子为ratio, 缩放的变换矩阵为:
由于放大图象时产生了新的象素, 缩小时合并了像素, 变换后图像上点与原图点不存在一一对应的关系, 所以采用的做法是找与之最临近的点。
2 算法设计
2.1 图像平移
图像几何变换都是基于像素处理的。
首先打开原始图像, 获取图像信息。
第二步设置水平平移量和垂直平移量。根据平移量和原图像高度宽度, 计算平移后图像的宽度和高度:
NWidth=l Width+ (long) f XMove;NHeight=l Height+ (long) f YMove。
第三步采用行列循环方式, 计算新图像中每个像素对应于原图像的像素, 将原图像的像素灰度值或RGB颜色值赋值给新图像的像素。对于原图像中没有的对应点的像素, 将其灰度值设为0 (白色) 。以8位图为例, 程序如下:
2.2 图像旋转
首先打开原始图像, 获取图像信息, 包括图像的高度、宽度、调色板或者RGB值等信息。
第二步因为图像旋转采用以图像中心为原点的坐标系, 因此首先进行坐标转换, 计算原图四角点在以图像中心为原点的旋转坐标系中的坐标, 并根据旋转角度计算旋转后图像四角坐标, 利用旋转后图像四角点计算新图像高和宽。
第三步采用行列循环方式, 计算新图像中每个像素对应于原图像的像素, 将原图像的像素灰度值或RGB颜色值赋值给新图像的像素。对于原图像中没有的对应点的像素, 将其灰度值设为0 (白色) 。
2.3 图像缩放
首先打开原始图像, 获取图像信息, 包括图像的高度、宽度、调色板或者RGB值等信息。
第二步设置缩放参数, 并根据原图像宽、高计算经过缩放后的图像的宽、高。
第三步采用行列循环方式, 计算新图像中每个像素对应于原图像的像素, 将原图像的像素灰度值或RGB颜色值赋值给新图像的像素。对于原图像中没有的对应点的像素, 将其灰度值设为0 (白色) 。算法与平移和旋转类似, 在此不在详述。
3 实现方法与过程
(1) 创建一个MFC多文档工程, 并设置滚动视图模式。
(2) 在Doc类中声明一个HDIB类型的的成员变量m_h DIB, 并利用Class Wind类向导为Doc类添加On Open Document和On SaveDocument两个函数, 添加代码, 调用DIB.dll中封装好的open和save函数, 在On Draw函数中调用Draw (p DC, p Doc->m_h DIB) , 实现图像读取和保存功能。
(3) 添加菜单“平移”“旋转”“缩放”, 并为菜单添加相应的对话框资源, 用以设置相关参数。利用Class Wind类向导为各个菜单添加消息处理函数, 为每个对话框添加对话框类。
(4) 在对话框类中添加相应参数变量并初始化。为每个菜单消息处理函数编写函数体, 使之实现相应功能。
摘要:数字图像处理是摄影测量的基础, 图像几何变换是图像处理最基本的内容。文章就利用VC编程实现图像的平移、旋转、缩放的原理、算法和实现过程进行详细论述。
关键词:VC,数字图像,平移,旋转,缩放
参考文献
[1]孙家柄.遥感原理与应用[M].武汉:武汉大学出版社, 2006.
[2]王育坚.Visual C++面向对象编程教程[M].北京:清华大学出版, 2006.
[3]贾永红.数字图像处理[M].武汉:武汉大学出版社, 2004.
VC++编程经验总结 第4篇
关键词 嵌入式SQL 预编译程序 动态连接库
中图分类号:TP312 文献标识码:A
0 引言
在通常的运用中,SQL语言是作为独立语言在终端交互方式下使用的,是非过程性的,其大多数语句都是独立执行,与上下文无关,称作自含式语言;而许多事务处理应用都是过程性的,需要根据不同的条件来执行不同的任务,如果把SQL语言嵌入到诸如C语言这样的过程化的编程语言中,程序开发人员就能设计出更加灵活的应用系统,具有SQL语言和高级编程语言的良好特征,它将比单独使用SQL或C语言具有更强的功能和灵活性,这种方式下使用的SQL语言称为嵌入式SQL语言。
在计算机专业课程《数据库系统概论》中有关于嵌入式SQL语言的内容,其教学手段一般都是理论讲述,教学效果不是十分理想。下面介绍一种在现有条件下都能办到的嵌入式SQL语言实现方法。
1 在VC中使用嵌入式SQL语言访问Microsoft SQL Server 2000
1.1 使用嵌入式SQL语言所采用的系统配置
①操作系统:Windows 2000 Professional
②Microsoft Visual C++ 6.0
③Microsoft SQL Server 2000
在安装Microsoft SQL Server 2000 时要注意选择安装Development Tools,为使用嵌入式SQL语言准备必要的头文件和库文件。
1.2 编辑嵌入式SQL程序
使用文本编辑器如记事本编辑嵌入式SQL程序,其存盘文件的扩展名为"sqc"。在嵌入式SQL程序中嵌入的SQL语句以EXEC SQL作为起始标识,语句的结束以";"作为标识。在嵌入的SQL语句中可以使用C语言的程序变量(即主变量),这时主变量名前加冒号(:)作为标志,以区别于字段名。主变量的声明必须包含在"EXEC SQL BEGIN DECLARE SECTION; "和"EXEC SQL END DECLARE SECTION; "之间。以下是一个嵌入式SQL程序demo.sqc:
#include
void main()
{
EXEC SQL BEGIN DECLARE SECTION;
char first_name[50];
char last_name[] = "White";
EXEC SQL END DECLARE SECTION;
EXEC SQL CONNECT TO my_server.pubs
USER my_login.my_password;
EXEC SQL SELECT au_fname INTO :first_name
FROM authors WHERE au_lname = :last_name;
EXEC SQL DISCONNECT ALL;
printf("first_name: %s\n", first_name);
}
此C语言程序中嵌入了SQL语句,用来访问数据库服务器my_server中的数据库pubs,登录名my_login,口令my_password,在表authors中检索姓"White"的作者的名,并存入主变量first_name,然后通过printf函数输出结果。
1.3 预编译嵌入式SQL程序
Microsoft SQL Server 2000提供的预编译程序nsqlprep.exe,用于对嵌入式SQL程序进行预编译处理,生成C语言源程序。实际上就是将嵌入式SQL程序中的嵌入式SQL语句替换为对运行时库文件Sqlakw32.dll的函数调用,接着运行时库文件调用动态连接库Ntwdblib.dll通过网络来存取Microsoft SQL Server 2000数据库服务器。
预编译程序nsqlprep的常用语法为:
nsqlprep ESQL_File /SQLACCESS /DB server_name.database_name /PASS login.password
其中ESQL_File是要预编译的嵌入式SQL程序;/SQLACCESS通知nsqlprep 自动地为嵌入式SQL程序中的静态SQL语句创建相应的存储过程;/DB server_name.database_name指明要连接的服务器以及数据库名称;/PASS login.password给出登录名及相应的口令。对于demo.sqc的预编译命令为:
nsqlprep demo /SQLACCESS /DB my_server.pubs /PASS my_login.my_password
经预编译处理后即可产生C语言源程序demo.c
1.4 配置VC++ 6.0 中的Project Settings
为了编译、连接nsqlprep生成的C语言源程序,需要增加必要的访问路径到VC++ 6.0 的环境设置中:
①选择菜单Tools中的菜单项Options
②选择Directories标签页
③在"Show directories for"下拉框中选择"Include files",增加Microsoft SQL Server 2000 开发所需头文件的路径:C:\Program Files\Microsoft SQL Server\80\Tools\DevTools\Include
④在"Show directories for"下拉框中选择"Library files",增加Microsoft SQL Server 2000 开发所需库文件的路径:C:\Program Files\Microsoft SQL Server\80\Tools\DevTools\LIB
1.5 生成访问Microsoft SQL Server 2000数据库的可执行程序
在VC++ 6.0 中创建一个"WIN32 Console Application"类型的Project,选择菜单Project中菜单项Add to Project的子项Files,将第三步中生成的C语言源程序demo.c添加到此Project中,然后编译、连接即可生成访问Microsoft SQL Server 2000数据库的可执行程序:demo.exe,运行的输出结果为:Johnson;这与使用交互式查询工具Query Analyzer检索的结果是一致的。至此,一个在VC++ 6.0中使用嵌入式SQL语言访问Microsoft SQL Server 2000数据库的应用已经开发完成。
2 结束语
本文探讨了Microsoft SQL Server 2000中的ESQL/C编程,并介绍了在常用编程软件VC++ 6.0 中嵌入式SQL程序设计的实现方法。在嵌入式SQL语言的课堂教学中,使用该方法,获得了良好的教学效果。
VC图像编程教案 第三章 第5篇
VC图像编程教案 第三章
VC图像编程教案 第三章 3 DIB类的高级应用。 3.1 BMP文件结构 BMP文件头数据结构含有BMP文件的类型、文件大小和位图起始位置等信息。 typedef struct tagBITMAPFILEHEADER { WORDbfType; // 位图文件的类型,必须为BM DWORD bfSize; // 位图文件的大小,以字节为单位 WORDbfReserved1; // 位图文件保留字,必须为0 WORDbfReserved2; // 位图文件保留字,必须为0 DWORD bfOffBits; // 位图数据的起始位置,以相对于位图 // 文件头的.偏移量表示,以字节为单位 } BITMAPFILEHEADER; BMP位图信息头数据用于说明位图的尺寸等信息。 typedef struct tagBITMAPINFOHEADER{ DWORD biSize; // 本结构所占用字节数 LONGbiWidth; // 位图的宽度,以像素为单位 LONGbiHeight; // 位图的高度,以像素为单位 WORD biPlanes; // 目标设备的级别,必须为1 WORD biBitCount// 每个像素所需的位数,必须是1(双色), // 4(16色),8(256色)或24(真彩色)之一 DWORD biCompression; // 位图压缩类型,必须是 0(不压缩), // 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一 DWORD biSizeImage; // 位图的大小,以字节为单位 LONGbiXPelsPerMeter; // 位图水平分辨率,每米像素数 LONGbiYPelsPerMeter; // 位图垂直分辨率,每米像素数 DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数 DWORD biClrImportant;// 位图显示过程中重要的颜色数 } BITMAPINFOHEADER; typedef struct tagRGBQUAD { BYTErgbBlue;// 蓝色的亮度(值范围为0-255) BYTErgbGreen; // 绿色的亮度(值范围为0-255) BYTErgbRed; // 红色的亮度(值范围为0-255) BYTErgbReserved;// 保留,必须为0 } RGBQUAD; 颜色表中RGBQUAD结构数据的个数有biBitCount来确定: 当biBitCount=1,4,8时,分别有2,16,256个表项; 当biBitCount=24时,没有颜色表项。 位图信息头和颜色表组成位图信息,BITMAPINFO结构定义如下: typedef struct tagBITMAPINFO { BITMAPINFOHEADER bmiHeader; // 位图信息头 RGBQUAD bmiColors[1]; // 颜色表 } BITMAPINFO; 3.2 DIB类的Read函数: BOOL CDib::Read(CFile* pFile) { // 1. read file header to get size of info hdr + color table // 2. read info hdr (to get image size) and color table // 3. read image // cant use bfSize in file header Empty; int nCount, nSize; BITMAPFILEHEADER bmfh; try { nCount = pFile->Read((LPVOID) &bmfh, sizeof(BITMAPFILEHEADER)); if(nCount != sizeof(BITMAPFILEHEADER)) { throw new CException; } if(bmfh.bfType != 0x4d42) { throw new CException; } nSize = bmfh.bfOffBits - sizeof(BITMAPFILEHEADER); m_lpBMIH = (LPBITMAPINFOHEADER) new char[nSize]; m_nBmihAlloc = m_nImageAlloc = crtAlloc; nCount = pFile->Read(m_lpBMIH, nSize); // info hdr & color table ComputeMetrics(); ComputePaletteSize(m_lpBMIH->biBitCount); MakePalette(); m_lpImage = (LPBYTE) new char[m_dwSizeImage]; nCount = pFile->Read(m_lpImage, m_dwSizeImage); // image only } catch(CException* pe) { AfxMessageBox(Read error); pe->Delete(); return FALSE; } return TRUE; } 3.3 DIB类的Write函数: BOOL CDib::Write(CFile* pFile) { BITMAPFILEHEADER bmfh; bmfh.bfType = 0x4d42; // BM int nSizeHdr = sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * m_nColorTableEntries; bmfh.bfSize = 0; //bmfh.bfSize = sizeof(BITMAPFILEHEADER) + nSizeHdr + m_dwSizeImage; // meaning of bfSize open to interpretation (bytes, words, dwords?) -- we wont use it bmfh.bfReserved1 = bmfh.bfReserved2 = 0; bmfh.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * m_nColorTableEntries; try { pFile->Write((LPVOID) &bmfh, sizeof(BITMAPFILEHEADER)); pFile->Write((LPVOID) m_lpBMIH, nSizeHdr); pFile->Write((LPVOID) m_lpImage, m_dwSizeImage); } catch(CException* pe) { pe->Delete(); AfxMessageBox(write error); return FALSE; } return TRUE; } 3.4 明确图像文件 CFile CDib类三者之间的关系 3.5 尝试直接用CDib类的m_lpImage成员读取图像数据。 3.6 尝试通过Write保存图像到另一个位置 3.7 尝试通过Write重写原图像文件(注意保存)
浅析VC与Matlab联合编程 第6篇
作者:邓科
在“浅析VC与Matlab联合编程<一>”和“浅析VC与Matlab联合编程<二>”中介绍了matcom,这个工具可以将用matlab写的m文件翻译成C++文件,或者是可执行文件(exe)或库文件(dll),
浅析VC与Matlab联合编程
。但是matcom在很多方面也有限制,比如,对struct等类的支持有缺陷,部分绘图语句无法实现或得不到准确图象,尤其是三维图象。二>一>实际上VC与matlab的接口实现方法有很多种,matcom只是其中一种,本文再介绍一种比较容易实现的方法:COM接口方法。COM(Compponent Object Model组件对象模型)是一项比较复杂的技术,详细讲的话几本书也讲不完,所以在这里不作介绍,本文通过一个例子详细介绍如何在matlab下做COM组件,以及如何在VC中调用COM组件。
首先在Matlab编辑器里编辑m函数文件:启动matlab->File->New->M-file函数内容如图1:该函数无输入输出参数,文件保存为huatu.m。
图1 m函数huatu.m
在matlab下建立COM组件,步骤如下:
1、在matlab command window 输入如下命令:
>>comtool
出现com编辑界面,如图2:
图2 com组件编辑界面
2、新建工程:File->New Project…,如图3。
图2 com组件属性设置
3、设置组件属性,在“Component name”项中填写组件名称“component”,这时候会自动生成类“component”,在“Class name”项中填写类名称“huatu”,如图4,
图4 com组件属性设置1
为了便于区分,选中“Classes”中的“component”,点击“remove”按钮,将类component移除,再点击“Add>>”添加新类huatu,结果如图5,
点击“OK”,接下来出现一个对话框,选择“Yes”.
图5 com组件属性设置2
4. 添加文件:选中左边工作区的“huatu”,点击Project->Add File…,选择已经编辑好的函数文件huatu.m,如图6。需要注意的是m文件必须是m函数,否则会报错,如果是m脚本文件的话,只需要改为无输入输出参数的m函数即可。
图6 添加m文件
5、生成 com组件:点击Build->COM Object…,结果如图7。
图7
com组件已经由matlab做好,默认的保存位置为:matlab安装位置workcomponent。
VC中调用COM组件,步骤如下:
1、在VC中建立名为ComHuaTu的基于对话框的MFC(exe)。
2、面板上添加一个名为“画图”的button按钮,如图8。
图7 工程界面
3、将component_idl.h 和component_idl_i.c文件拷贝到VC建立的工程ComHuaTu目录下。两文件默认目录为
4、将上面两文件加入工程:工程->添加工程->Files,选择刚刚拷到目录下的component_idl.h 和component_idl_i.c文件。
5、将目录
6、为程序添加头文件component_idl.h 、component_idl_i.c和mwcomtypes.h,结果如图9
图9 添加头文件
7、按钮画图函数添加代码:
图10 添加按钮函数代码
VC++编程经验总结
声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。如若本站内容侵犯了原著者的合法权益,可联系本站删除。