vc编程总结

2024-06-02

vc编程总结(精选6篇)

篇1:vc编程总结

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)。当自动完成功能出问题时可以删除此文件。编译工程后会自动生成。

篇2:vc编程总结

5.对于绘制文字TextOut(),在SetMapMode(MM_LOMETRIC)后,需要重新选择字体,否则打印预览时候会出现字体乱码现象。

6.赋值型条件语句需要加括号,否则先执行运算符,再执行条件语句,如int a=b+c>0 ? 1 :-1,时,将先执行(b+c)。

MFC的消息处理函数

1.AfxWndProc()该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc

2.AfxCallWndProc()该函数负责保存消息(保存的内容主要是消息标识符和消息参数)供应用程序以后使用,然后调用WindowProc()函数

3.WindowProc()该函数负责发送消息到OnWndMsg()函数,如果未被处理,则调用DefWindowProc()函数

4.OnWndMsg()该函数的功能首先按字节对消息进行排序,对于WM_COMMAND消息,调用OnCommand()消息响应函数,对于WM_NOTIFY消息调用OnNotify()消息响应函数。任何被遗漏的消息将是一个窗口消息。OnWndMsg()函数搜索类的消息映像,以找到一个能处理任何窗口消息的处理函数。如果OnWndMsg()函数不能找到这样的处理函数的话,则把消息返回到WindowProc()函数,由它将消息发送给DefWindowProc()函数

5.OnCommand()该函数查看这是不是一个控件通知(lParam参数不为NULL,如果lParam参数为空的话,说明该消息不是控件通知),如果它是,OnCommand()函数会试图将消息映射到制造通知的控件;如果他不是一个控件通知(或者如果控件拒绝映射的消息)OnCommand()就会调用OnCmdMsg()函数

6.OnCmdMsg()根据接收消息的类,OnCmdMsg()函数将在一个称为命令传递(Command Routing)的过程中潜在的传递命令消息和控件通知。例如:如果拥有该窗口的类是一个框架类,则命令和通知消息也被传递到视图和文档类,并为该类寻找一个消息处理函数

MFC应用程序创建窗口的过程

1.PreCreateWindow()该函数是一个重载函数,在窗口被创建前,可以在该重载函数中改变创建参数(可以设置窗口风格等等)

2.PreSubclassWindow()这也是一个重载函数,允许首先子分类一个窗口

3.OnGetMinMaxInfo()该函数为消息响应函数,响应的是WM_GETMINMAXINFO消息,允许设置窗口的最大或者最小尺寸

4.OnNcCreate()该函数也是一个消息响应函数,响应WM_NCCREATE消息,发送消息以告诉窗口的客户区即将被创建

5.OnNcCalcSize()该函数也是消息响应函数,响应WM_NCCALCSIZE消息,作用是允许改变窗口客户区大小

6.OnCreate()该函数也是一个消息响应函数,响应WM_CREATE消息,发送消息告诉一个窗口已经被创建

7.OnSize()该函数也是一个消息响应函数,响应WM_SIZE消息,发送该消息以告诉该窗口大小已经发生变化

8.OnMove()消息响应函数,响应WM_MOVE消息,发送此消息说明窗口在移动

9.OnChildNotify()该函数为重载函数,作为部分消息映射被调用,告诉父窗口即将被告知一个窗口刚刚被创建

MFC应用程序关闭窗口的顺序(非模态窗口)

1.OnClose()消息响应函数,响应窗口的WM_CLOSE消息,当关闭按钮被单击的时候发送此消息

2.OnDestroy()消息响应函数,响应窗口的WM_DESTROY消息,当一个窗口将被销毁时,发送此消息

3.OnNcDestroy()消息响应函数,响应窗口的WM_NCDESTROY消息,当一个窗口被销毁后发送此消息

4.PostNcDestroy()重载函数,作为处理OnNcDestroy()函数的最后动作,被CWnd调用

MFC应用程序中打开模式对话框的函数调用顺序

1.DoModal()重载函数,重载DoModal()成员函数 2.PreSubclassWindow()重载函数,允许首先子分类一个窗口

3.OnCreate()消息响应函数,响应WM_CREATE消息,发送此消息以告诉一个窗口已经被创建

4.OnSize()消息响应函数,响应WM_SIZE消息,发送此消息以告诉窗口大小发生变化

5.OnMove()消息响应函数,响应WM_MOVE消息,发送此消息,以告诉窗口正在移动

6.OnSetFont()消息响应函数,响应WM_SETFONT消息,发送此消息,以允许改变对话框中控件的字体

7.OnInitDialog()消息响应函数,响应WM_INITDIALOG消息,发送此消息以允许初始化对话框中的控件,或者是创建新控件

8.OnShowWindow()消息响应函数,响应WM_SHOWWINDOW消息,该函数被ShowWindow()函数调用

9.OnCtlColor()消息响应函数,响应WM_CTLCOLOR消息,被父窗口发送已改变对话框或对话框上面控件的颜色

10.OnChildNotify()重载函数,作为WM_CTLCOLOR消息的结果发送

MFC应用程序中关闭模式对话框的顺序

1.OnClose()消息响应函数,响应WM_CLOSE消息,当“关闭”按钮被单击的时候,该函数被调用

2.OnKillFocus()消息响应函数,响应WM_KILLFOCUS消息,当一个窗口即将失去键盘输入焦点以前被发送

3.OnDestroy()消息响应函数,响应WM_DESTROY消息,当一个窗口即将被销毁时,被发送

4.OnNcDestroy()消息响应函数,响应WM_NCDESTROY消息,当一个窗口被销毁以后被发送

5.PostNcDestroy()重载函数,作为处理OnNcDestroy()函数的最后动作被CWnd调用

打开无模式对话框的顺序

1.PreSubclassWindow()重载函数,允许用户首先子分类一个窗口 2.OnCreate()消息响应函数,响应WM_CREATE消息,发送此消息以告诉一个窗口已经被创建

3.OnSize()消息响应函数,响应WM_SIZE消息,发送此消息以告诉窗口大小发生变化

4.OnMove()消息响应函数,响应WM_MOVE消息,发送此消息以告诉窗口正在移动

5.OnSetFont()消息响应函数,响应WM_SETFONT消息,发送此消息以允许改变对话框中控件的字体

以上这些的执行都是按给定的顺序执行!

只有清楚的了解应用程序的执行顺序,才能在编写代码的时候知道,在什么时候应该执行什么,以及在什么地方该处理什么!

这只是本人总结的一点小小的经验,希望能对MFC的初学者有所帮助!MFC应用程序中处理消息的顺序

1.AfxWndProc()该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc

2.AfxCallWndProc()该函数负责保存消息(保存的内容主要是消息标识符和消息参数)供应用程序以后使用,然后调用WindowProc()函数

3.WindowProc()该函数负责发送消息到OnWndMsg()函数,如果未被处理,则调用DefWindowProc()函数

4.OnWndMsg()该函数的功能首先按字节对消息进行排序,对于WM_COMMAND消息,调用OnCommand()消息响应函数,对于WM_NOTIFY消息调用OnNotify()消息响应函数。任何被遗漏的消息将是一个窗口消息。OnWndMsg()函数搜索类的消息映像,以找到一个能处理任何窗口消息的处理函数。如果OnWndMsg()函数不能找到这样的处理函数的话,则把消息返回到WindowProc()函数,由它将消息发送给DefWindowProc()函数

5.OnCommand()该函数查看这是不是一个控件通知(lParam参数不为NULL,如果lParam参数为空的话,说明该消息不是控件通知),如果它是,OnCommand()函数会试图将消息映射到制造通知的控件;如果他不是一个控件通知(或者如果控件拒绝映射的消息)OnCommand()就会调用OnCmdMsg()函数

6.OnCmdMsg()根据接收消息的类,OnCmdMsg()函数将在一个称为命令传递(Command Routing)的过程中潜在的传递命令消息和控件通知。例如:如果拥有该窗口的类是一个框架类,则命令和通知消息也被传递到视图和文档类,并为该类寻找一个消息处理函数

MFC应用程序创建窗口的过程

1.PreCreateWindow()该函数是一个重载函数,在窗口被创建前,可以在该重载函数中改变创建参数(可以设置窗口风格等等)

2.PreSubclassWindow()这也是一个重载函数,允许首先子分类一个窗口

3.OnGetMinMaxInfo()该函数为消息响应函数,响应的是WM_GETMINMAXINFO消息,允许设置窗口的最大或者最小尺寸

4.OnNcCreate()该函数也是一个消息响应函数,响应WM_NCCREATE消息,发送消息以告诉窗口的客户区即将被创建

5.OnNcCalcSize()该函数也是消息响应函数,响应WM_NCCALCSIZE消息,作用是允许改变窗口客户区大小

6.OnCreate()该函数也是一个消息响应函数,响应WM_CREATE消息,发送消息告诉一个窗口已经被创建

7.OnSize()该函数也是一个消息响应函数,响应WM_SIZE消息,发送该消息以告诉该窗口大小已经发生变化

8.OnMove()消息响应函数,响应WM_MOVE消息,发送此消息说明窗口在移动

9.OnChildNotify()该函数为重载函数,作为部分消息映射被调用,告诉父窗口即将被告知一个窗口刚刚被创建

MFC应用程序关闭窗口的顺序(非模态窗口)

1.OnClose()消息响应函数,响应窗口的WM_CLOSE消息,当关闭按钮被单击的时候发送此消息

2.OnDestroy()消息响应函数,响应窗口的WM_DESTROY消息,当一个窗口将被销毁时,发送此消息

3.OnNcDestroy()消息响应函数,响应窗口的WM_NCDESTROY消息,当一个窗口被销毁后发送此消息

4.PostNcDestroy()重载函数,作为处理OnNcDestroy()函数的最后动作,被CWnd调用

MFC应用程序中打开模式对话框的函数调用顺序

1.DoModal()重载函数,重载DoModal()成员函数 2.PreSubclassWindow()重载函数,允许首先子分类一个窗口

3.OnCreate()消息响应函数,响应WM_CREATE消息,发送此消息以告诉一个窗口已经被创建

4.OnSize()消息响应函数,响应WM_SIZE消息,发送此消息以告诉窗口大小发生变化

5.OnMove()消息响应函数,响应WM_MOVE消息,发送此消息,以告诉窗口正在移动

6.OnSetFont()消息响应函数,响应WM_SETFONT消息,发送此消息,以允许改变对话框中控件的字体

7.OnInitDialog()消息响应函数,响应WM_INITDIALOG消息,发送此消息以允许初始化对话框中的控件,或者是创建新控件

8.OnShowWindow()消息响应函数,响应WM_SHOWWINDOW消息,该函数被ShowWindow()函数调用

9.OnCtlColor()消息响应函数,响应WM_CTLCOLOR消息,被父窗口发送已改变对话框或对话框上面控件的颜色

10.OnChildNotify()重载函数,作为WM_CTLCOLOR消息的结果发送

MFC应用程序中关闭模式对话框的顺序

1.OnClose()消息响应函数,响应WM_CLOSE消息,当“关闭”按钮被单击的时候,该函数被调用

2.OnKillFocus()消息响应函数,响应WM_KILLFOCUS消息,当一个窗口即将失去键盘输入焦点以前被发送 3.OnDestroy()消息响应函数,响应WM_DESTROY消息,当一个窗口即将被销毁时,被发送

4.OnNcDestroy()消息响应函数,响应WM_NCDESTROY消息,当一个窗口被销毁以后被发送

5.PostNcDestroy()重载函数,作为处理OnNcDestroy()函数的最后动作被CWnd调用

打开无模式对话框的顺序

1.PreSubclassWindow()重载函数,允许用户首先子分类一个窗口

2.OnCreate()消息响应函数,响应WM_CREATE消息,发送此消息以告诉一个窗口已经被创建

3.OnSize()消息响应函数,响应WM_SIZE消息,发送此消息以告诉窗口大小发生变化

4.OnMove()消息响应函数,响应WM_MOVE消息,发送此消息以告诉窗口正在移动

5.OnSetFont()消息响应函数,响应WM_SETFONT消息,发送此消息以允许改变对话框中控件的字体

MFC的一些主要成员函数

CWinThread::m_pMainWnd:保存指向应用程序的主窗口指针。CWinThread::GetMainWnd:查询指向线程主窗口的指针。CWinThread::InitInstance:重载以实现线程实例的初始化。AfxGetApp:获得指向CWinApp对象的指针。

AfxGetInstanceHandle:获得当前应用程序实例的句柄。AfxGetResourceHandle:获得应用程序资源的句柄。

AfxGetAppName:获得一个字符串指针,其中包含了应用程序的名字。另外,如果你拥有一个指向CWinApp对象的指针,可以通过m_pszExename来获得应用程序的名字。

CDocument::IsModified:标识文档从最近一次保存以来是否被修改过。CDocument::UpdateAllViews:通知所有视图文档已被修改的消息。CWnd::m_hWnd:指明与这个CWnd对象相关联的HWND句柄。CWnd::Create:创建并初始化与CWnd对象相关联的子窗口。

CWnd::PreCreateWindow:在与CWnd对象相关联的窗口被创建之前调用。CWnd::IsWindowEnabled:确定一个窗口是否允许鼠标和键盘输入。CWnd::EnableWindow:允许或禁止鼠标和键盘输入。CWnd::SetWindowPos:改变子窗口、弹出窗口和顶层窗口的大小、位置以及顺序。CWnd::GetDlgItem:获得指定的对话框中具有指定ID的控件。CWnd::UpdateData:初始化对话框或获得对话框中的数据。CWnd::GetWindowRect:获得CWnd的屏幕坐标。CWnd::GetDC:获得客户区的设备环境。

CWnd::RedrawWindow:更新客户区中的指定矩形或区域。CWnd::UpdateWindow:更新客户区。

CWnd::Invalidate:使整个客户区无效。CWnd::ShowWindow:显示或隐藏窗口。

CWnd::ClientToScreen:将给定点或显示器上矩形的客户区坐标转换为屏幕坐标。

CWnd::ScreenToClient:将给定点或显示器上矩形的屏幕坐标转换为客户坐标。CWnd::SetWindowText:将窗口的文本或标题文字(如果有)设为指定的文本。CWnd::SetFont:设置当前字体。

CWnd::GetDlgItemInt:将给定对话框中控件的文本转换为整数。

CWnd::SetTimer:安装一个系统定时器,当它被激活时,发送一个WM_TIMER消息。

篇3:基于VC++的仿真训练系统编程

关键词:仿真训练,半实物仿真,硬件设计,编程

为解决部队装备使用维护人员岗前训练时间受装备数量的限制、院校学员无实装的专业实习等问题,提出研制某型飞机照相专业仿真训练系统。半实物仿真是工程领域内一种应用较为广泛的仿真技术,是计算机仿真回路中接入一些实物进行的试验,因而更接近实际情况[1];同时具有提高系统研制质量、缩短研制周期、节约研制经费等优点已成为仿真领域研究的重要方向[2]。为此某型飞机照相专业仿真训练系统采用以计算机仿真技术为核心的半实物仿真训练平台。半实物仿真系统又称硬件在回路[3]仿真系统,在综合考虑部件的使用频率和系统成本的情况下,采用实物仿真器件与和计算机图形仿真器件相结合的方式仿真飞机座舱内的硬件,再利用软件编程驱动图形仿真器件及仿真照相专业通电检测程序,简要介绍仿真训练系统,在此基础上主要研究其编程方法。

1 仿真训练系统

某型飞机照相专业仿真训练系统是由主机、显示器、控制面板构成的立式仿真训练平台。仿真训练系统硬件结构如图1所示,主机选用具有PCI插槽的工业控制计算机,内插有PCI-I64IOT型I/O卡;控制面板上有侦察专业训练常用的硬件如侦察控制盒、火控盒、配电盘、DTC卡(数据传输卡)和主机电源开关;显示器为触摸显示屏。PCI-I64IOT型I/O卡为32路输入、32路输出通道的光隔离开关量I/O卡,用以实现主机与控制面板间的信息交换,训练系统界面操作利用触摸屏来实现,通过USB接口给主机输入信息,主机通过显卡更新界面。照相专业训练常用的硬件用实物仿真器件安装在控制面板上,其他相关硬件如LMFD(左多功能显示器)、RMFD(右多功能显示器)、ICP(综合控制面板)等设计在仿真训练系统软件操作界面上,采用图形化设计,通过软件编程驱动。控制面板上的侦察控制盒、火控盒及配电盘组件,由按键、指示灯和断路器等组成,采用实物进行仿真,即用真实的民品器件替代,其大小、功能和操作方法与飞机座舱内部的器件完全相同;而DTC卡则采用仿制件,其外观与飞机座舱内部的DTC卡相同,操纵方法也相同,其功能通过软件编程来实现。

2 软件设计

该仿真训练系统软件开发平台选用Windows XP操作系统,应用软件开发环境为Microsoft Visual C++6.0,界面采用对话框方式,采用模块化设计,主要由主控模块、虚拟挂装模块、数据采集与驱动模块、故障设置模块、通电检查模块、操作演示模块组成,其中主控模块、数据采集与驱动模块及通电检查模块是软件的核心部分,是实现全部训练科目的关键。

2.1 主控模块

主控模块负责仿真训练系统界面的图形化器件的静态显示和动态显示。主要包括飞机座舱内的两个多功能显示器的外观模拟,亮度调节旋钮、对比度调节旋钮、周边键和显示区的功能模拟;座舱内侦察专业用到的驾驶杆和油门杆等的部分按键、断路器及ICP上旋钮、开关的静态显示和操作时的动态实时更新。

2.2 虚拟挂装模块

虚拟挂装模块负责模拟通电检查前各种配挂方案的配挂过程。

2.3 数据采集与驱动模块

数据采集模块包括PCI-I64IOT型I/O卡的初始化、数据采集、指示灯驱动程序,主要负责通过I/O卡的输入端口获取控制面板上按键、开关等的状态,进行数据分析后,通过输出端口驱动按键上指示灯。

2.4 故障设置模块

故障设置模块是对侦察设备进行虚拟故障设置,以便受训者可以看到侦察设备发生故障时故障清单的查验画面。

2.5 通电检查模块

通电检查模块包括地面通电检查和空中通电检查程序两个部分,地面通电检查包括侦察任务加载、参数匹配、故障清单的查验和系统时间查询或修改、操纵员启动自检测等操作;空中通电检查包括侦察设备参数设置,相机准备、工作、传输等命令操作。系统通过数据采集与驱动模块获取仿真器件的状态、通过主控模块获取触屏对图形化器件的操作,由通电检查模块进行数据分析、逻辑判断后由数据采集与驱动模块驱动按键上指示灯、主控模块更新仿真软件操作界面的图形化器件的状态和模拟显示器的显示内容。

2.6 操作演示模块

系统操作演示模块为了帮助受训人员尽快学会使用该仿真训练系统设置的。主要利用Photo Shop处理图片、桌面录像精灵录制屏幕操作再利用绘声绘影处理各种素材形成视频流,编程时插入Media Player播放控件,即可播放。

3 编程

仿真训练系统软件设计比较复杂,现将涉及的编程方法与技巧进行总结,供相关人员参考。

3.1 定时器的使用

为了保证仿真系统操作界面实时刷新及控制面板信息的动态输入,仿真软件中使用了多个定时器,定时器设定使用Windows API函数Set Timer(UINT n IDEvent,UINT u Elapse,TIMERPROC lp Timer Func)函数[4],n IDEvent为定时器的标识符,u Elapse为指定超时值,以毫秒为单位,lp Timer Func为指向函数的指针,赋值为NULL,在Class Wizard窗口将WM_TIMER消息与添加的定时器成员函数On Timer(UINT n IDEvent)关联,这样当某一定时器超时就产生WM_TIMER时,在On Timer中根据n IDEvent值转向不同程序分支。

3.2 模拟显示器的亮度和对比度调整

仿真训练系统的界面中要模拟飞机座舱内的多功能显示器,显示器有亮度旋钮和对比度旋钮,因而当对这两个旋钮调整时,模拟显示器显示区内的显示内容应能动态调整,为方便起见,将亮度和对比度的调整用一个自定义函数来实现,定义为DBD-LD_Vary(float color,int bright,float contract),形参分别为打开显示器开关时颜色分量的初始值、当前亮度档位和对比度档位。调用该函数时,初始颜色分量由模拟显示器开关的初始位置(日或夜)决定;当前亮度档位和对比度档位是两个全局变量,当调整这两个旋钮时,由于使用了定时器事件全局变量同步改变;返回值为当前颜色分量调整后的数值。

3.3 播放视频文件

播放视频具体编程步骤包括:在对话框中右击,在弹出的快捷菜单中选择Insert Active X Control命令,打开Insert Active X Control窗口;在窗口中,滑动垂直滚动条选择Windows Media Control控件,单击OK按钮将其添加到对话框中;打开Class Wizard窗口为添加的控件命名成员变量如“m_avi”;向对话框中添加“操作演示”按钮,处理按钮的单击事件,利用m_avi.Set Url播放制定的AVI文件。

3.4 显示JPEG图像

在VC++中显示JPEG图像并不像显示BMP图像那么简单,它通过流操作来实现[5]。具体思路是将JPEG文件加载到堆中,然后在堆中创建一个数据流,接着调用Ole Load Picture函数加载流中的数据到IPicture接口中,最后调用IPicture接口的Render方法输出图像信息。程序代码如下:

加载图片时,调用函数Add JPG(char*filename,int x,int y)时,只需用包含路径在内的文件名作为参数的第一项,x、y方向的坐标值替代第二项、第三项参数即可。仿真系统的界面通常根据操作情况实时更新,但其状态只限于几种,因而可将Add JPG函数放入定时器响应函数内,先判断当前的操作情况,然后加载不同的图片即可。

4 结语

某型飞机侦察专业模拟训练系统是基于部队使用维护人员和院校培训需要而研制的,已配备于院校专业实习室,目前已培训学员两期,使用结果表明:其具有很强的实用性,受训人员毕业到部队后,很快能胜任岗位需要;系统操作简单,只需触摸显示屏和手动操作控制面板即可完成;由于采用了定时器,界面的模拟显示器、图形化器件和控制面板的仿真器件动态更新速度与真实情况一致;软件采用模块化设计,可以用于开发其他型号的仿真训练系统。当然也具有一定的局限性:图形化仿真器件视觉效果较好,操作时缺乏真实感。

参考文献

[1]单家元,孟秀云.半实物仿真.北京:国防工业出版社,2008.

[2]高江林,吴晓燕,李勇君,等.半实物仿真系统VV&A研究.航天控制,2011,29(1):67-71.

[3]康凤举.现代仿真技术与应用.北京:国防工业出版社,2001.

[4]朱友芹.新编Windows API参考大全.北京:电子工业出版社,2001.

篇4:vc编程总结

关键词 嵌入式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语言的课堂教学中,使用该方法,获得了良好的教学效果。

篇5:VC图像编程教案 第三章

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重写原图像文件(注意保存)

篇6:浅析VC与MATLAB联合编程

作者:邓科

在浅析VC与MATLAB联合编程<一>、浅析VC与MATLAB联合编程<二>和浅析VC与MATLAB联合编程<三>中简单介绍了VC和MATLAB接口的两种方法,初学者可能会问为什么要用VC和MATLAB接口,接口的实质又是什么,本文就通过一个例子来回答这两个问题,

浅析VC与MATLAB联合编程

首先来介绍一下MATLAB。MATLAB名字由MATrix和 LABoratory 两词的前三个字母组合而成。那是20世纪七十年代后期的事:时任美国新墨西哥大学计算机科学系主任的Cleve Moler教授出于减轻学生编程负担的动机,为学生设计了一组调用LINPACK和EISPACK库程序的“通俗易用”的接口,此即用FORTRAN编写的萌芽状态的MATLAB。

经几年的校际流传,在Little的推动下,由Little、Moler、Steve Bangert合作,于1984年成立了MathWorks公司,并把MATLAB正式推向市场。从这时起,MATLAB的内核采用C语言编写,而且除原有的数值计算能力外,还新增了数据图视功能。

MATLAB以商品形式出现后,仅短短几年,就以其良好的开放性和运行的可靠性,使原先控制领域里的封闭式软件包(如英国的UMIST,瑞典的LUND和SIMNON,德国的KEDDC)纷纷淘汰,而改以MATLAB为平台加以重建。在时间进入20世纪九十年代的时候,MATLAB已经成为国际控制界公认的标准计算软件。

MATLAB已经成为目前国际上最流行、应用最广泛的科学工程计算软件,它广泛的应用于自动控制、数学运算、信号分析、图象处理、财务分析等各行各业。由于它具有强大的计算和绘图功能、大量稳定可靠的算法库和简洁高效的编程语言,已成为数学计算工具方面事实上的标准。

在欧美大学里,诸如应用代数、数理统计、自动控制、数字信号处理、模拟与数字通信、时间序列分析、动态系统仿真等课程的教科书都把MATLAB作为内容。这几乎成了九十年代教科书与旧版书籍的区别性标志。在那里,MATLAB是攻读学位的大学生、硕士生、博士生必须掌握的基本工具,

在国际学术界,MATLAB已经被确认为准确、可靠的科学计算标准软件。在许多国际一流学术刊物上(尤其是信息科学刊物)都可以看到MATLAB的应用。 在设计研究单位和工业部门,MATLAB被认作进行高效研究、开发的首选软件工具。如美国National Instruments公司信号测量、分析软件LabVIEW,Cadence公司信号和通信分析设计软件SPW等,或者直接建筑在MATLAB之上,或者以MATLAB为主要支撑。又如HP公司的VXI硬件,TM公司的DSP,Gage公司的各种硬卡、仪器等都接受MATLAB的支持。

为了说明问题,我们举个例子:解下列线形方程组:(如图1):

图1

用C语言(VC环境中)编写的代码为:(图2)

图2

编译、连接,运行结果为:(图3):

图3

而该方程在MATLAB中只需要一个命令“”就可以解决:

在MATLAB中建立一个新的m文件,在MATLAB菜单中:File->New->M file(如图4):

图4

在M文件中输入代码,并保存为QJFCZ.m。(如图5)

图5

在MATLAB Command命令窗口中输入以下命令:

>>QJFCZ

然后回车,结果如下:

x =

-0.1429

2.7857

0

>>

可以看出用MATLAB写出的代码十分简单,对于上面的方程,如果矩阵A和b的维数发生变化的话,C代码还要重新编写,而用MATLAB书写的代码几乎不用改动,只需改变数据即可。

上一篇:鞋店销售不好总结范文下一篇:全体高一教师会上的讲话