首页 VC++深入详解学习笔记(非常全面)

VC++深入详解学习笔记(非常全面)

举报
开通vip

VC++深入详解学习笔记(非常全面)VC++深入详解学习笔记(非常全面)VC++深入详解学习笔记(非常全面)VC++深入详解学习笔记(非常全面)VC++深入详解学习笔记(非常全面)编制仅供参考审核批准生效日期地址:电话:传真:邮编:孙鑫孙鑫VC++视频笔记列表(全)简介第一课Windows程序内部运行机制第二课MFC程序框架的剖析第三课MFC消息映射机制和DC的获取第四课简单字处理软件第五课菜单编程第六课对话框编程1第七课对话框编程2第八课MFC中各类指针的获取第九课应用程序外观修改第十课图形绘制与通用对话框第...

VC++深入详解学习笔记(非常全面)
VC++深入详解学习笔记(非常全面)VC++深入详解学习笔记(非常全面)VC++深入详解学习笔记(非常全面)VC++深入详解学习笔记(非常全面)编制仅供参考审核批准生效日期地址:电话:传真:邮编:孙鑫孙鑫VC++视频笔记列表(全)简介第一课Windows程序内部运行机制第二课MFC程序框架的剖析第三课MFC消息映射机制和DC的获取第四课简单字处理软件第五课菜单编程第六课对话框编程1第七课对话框编程2第八课MFC中各类指针的获取第九课应用程序外观修改第十课图形绘制与通用对话框第十一课图形保存和重绘第十二课文件操作第十三课文档和串行化第十四课网络编程第十五课多线程和简单聊天室制作第十六课线程同步与异步套接字编程第十七课进程间通信第十八课ActiveX控件第十九课动态链接库第二十课Hook钩子函数第0章简介Lesson1:Windows程序运行原理及程序编写流程,窗口产生过程,句柄原理,消息队列,回调函数,窗口关闭与应用程序退出的工作关系,使用VC++的若干小技巧,stdcall与cdecl调用规范的比较,初学者常犯错误及注意事项。Lesson2:C++经典语法与应用,类的编写与应用,构造与析构函数,函数的重载,类的继承,函数覆盖,基类与派生类的构造函数、析构函数先后调用顺序,如何在派生类构造函数中向基类的构造函数传递参数,this成员变量,类型转换的内幕,虚拟函数与多态性,引用和指针变量的区别与共同处。VC工程的编译原理与过程,将工程中不同的类拆分到不同的文件中,每一个类由一个.h和.cpp文件共同完成,头文件重复定义问 快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题 的解决,培养了学员良好的编程习惯,也为以后分析MFCAppWizard生成的工程奠定了良好基础。Lesson3:讲述MFCAppWizard的原理与MFC程序框架的剖析。AppWizard是一个源代码生成工具,是计算机辅助程序设计工具,WinMain在MFC程序中是如何从源程序中被隐藏的,theApp全局变量是如何被分配的,MFC框架中的几个类的作用与相互关系,MFC框架窗口是如何产生和销毁的,对窗口类的PreCreateWidow和OnCreate两个函数的着重分析,Windows窗口与C++中的CWnd类的关系。Lesson4:MFC消息映射机制的剖析,讲述如何运用ClassWizard,,理解发送给窗口的消息是如何被MFC框架通过窗口句柄映射表和消息映射表来用窗口类的函数进行响应的。掌握设备描述表及其封装类CDC的使用,CDC是如何与具体的设备发生关联的,融合具体的画图程序进行分析。如何设置封闭图形的填充刷子(位图画刷与透明画刷的使用)。Lesson5:掌握CDC的文字处理程序的编写,如何产生自定义字体和自定义插入符,熟悉对CString类的使用。通过对卡拉OK程序的编写,讲解定时器的使用和DrawText函数的巧妙运用。讲解如何使用CDC的裁减功能。Lesson6:菜单的工作原理及编写应用,菜单命令消息在MFC框架程序的几个类中的传递顺序和处理过程。标记菜单、缺省菜单的实现原理、图形菜单的实现及常犯错误的分析,GetSystemMetrics的应用,快捷弹出菜单的实现方式及其命令响应函数有效范围(与弹出菜单时所指定的父窗口有密切的关系,最底层的子窗口具有最优先的处理机会)。动态菜单的编写,如何让程序在运行时产生新的菜单项及如何手工为这些新产生的菜单命令安排处理函数,如何在顶层窗口中截获对菜单命令的处理,更进一步掌握CString类的应用。Lesson7:对话框用户界面程序的编写,如何向对话框控件关联数据成员及其实现机理,如何利用对话框类的成员函数向控件发送消息和获取对话框控件的类指针,如何直接利用对话框控件类操纵对话框控件(发送消息和直接调用成员函数)。如何在程序运行时产生和销毁控件。对话框控件的几种操作方式的优劣比较分析。如何实现对话框的部分收缩和展开。如何让对话框上的文本框在程序启动后立即获得焦点,如何利用SetWindowLong改变窗口的回调函数,通过改变文本框的默认回车处理方式进行演示。实现多个输入文本框间通过回车逐一向下传递焦点的另一种巧妙 方法 快递客服问题件处理详细方法山木方法pdf计算方法pdf华与华方法下载八字理论方法下载 (用缺省按钮来处理)。Lesson8:逃跑按钮的巧妙实现。如何制作属性页对话框和向导对话框,融合讲解组合框(如何调整组合框的大小)、列表框、单选按钮、复选按钮等常用对话框控件的多种使用方法。如何限制用户在不满足设定的条件时切换到其他属性页和向导页。Lesson9:如何修改MFCAppWizard向导生成的框架程序的外观和大小,修改图标、光标、背景的三种方法。如何增加和删除工具栏按钮,如何给应用程序增加工具栏,如何显示和隐藏工具栏。定制状态栏,在状态栏中添加时钟显示,CTime类及其用法。在状态栏中添加进度条(主窗口产生后立即产生进度条的巧妙思想,不能在OnCreate函数中直接处理,要用到自定义消息的方法)。鼠标坐标显示,在CView中获取状态栏对象的几种方式。如何为应用程序添加启动画面。Lesson10:图形的绘制,如何使用自定义画笔(颜色,线宽,线型)。如何为程序中添加选项菜单和选项设置对话框,如何使用 标准 excel标准偏差excel标准偏差函数exl标准差函数国标检验抽样标准表免费下载红头文件格式标准下载 颜色对话框,如何使用字体对话框,在选项对话框中实现预览功能。实现选项对话框和窗口类中的数据交换。如何改变对话框和控件的背景色,如何改变控件的文本颜色,对按钮控件的特殊处理。如何在窗口中显示一幅位图。Lesson11:如何让CDC上输出的文字、图形具有保持功能,集合类CPtrArray的使用,CPaintDC与CClientDC的区别与应用,OnPaint与OnDraw在CView中的关系及实现内幕,滚动窗口的实现,坐标空间,映射方式,设备坐标与逻辑坐标的转换。元文件设备描述表的使用,如何利用兼容DC实现图形的保存和再现。Lesson12:constchar*与char*const的区别。C语言对文件读写的支持,FILE指针;文本文件和二进制文件的区别。用文本方式读写文件和以二进制方式读写文件的注意事项。C++对文件读写的支持,ofstream和ifstream的用法。Win32SDK对文件读写的支持,CreateFile函数、WriteFile函数、ReadFile函数的使用;MFC对文件读写的支持,CFile类和CFileDialog的使用,文件过滤器的设置。文件和注册表的读写方式及相关 知识点 高中化学知识点免费下载体育概论知识点下载名人传知识点免费下载线性代数知识点汇总下载高中化学知识点免费下载 。Lesson13:使用CArchive类对文件进行操作。MFC框架程序提供的文件新建与打开功能内部的实现机制。如何利用CDocument类的串行化存储功能保存与加载数据。如何实现类对串行化的支持,CObArray的串行化实现内幕。删除文档数据时常犯的错误。MFC框架程序的文档类和视类的关系,以及如何获得相互的指针引用。Lesson14:网络的相关知识,网络程序的编写,Socket是连接应用程序与网络驱动程序的桥梁,Socket在应用程序中创建,通过bind与驱动程序建立关系。此后,应用程序送给Socket的数据,由Socket交给驱动程序向网络上发送出去。计算机从网络上收到与该Socket绑定的IP+Port相关的数据后,由驱动程序交给Socket,应用程序便可从该Socket中提取接收到的数据。网络应用程序就是这样通过socket进行数据的发送与接收的。TCP与UDP的工作原理与编写过程,如何在程序中链接库文件。一个字符界面的聊天程序。Lesson15:多线程程序的编写,多线程应用中容易出现的问题。互斥对象的讲解,如何使用互斥对象来实现多线程的同步。如何利用命名互斥对象保证应用程序只有一个实例运行。应用多线程编写网络聊天室程序。Lesson16:事件内核对象、关键代码段(临界区)的讲解,以及在多线程同步中的应用。在Windows下编写基于消息的网络应用程序,掌握阻塞与非阻塞网络程序的编写,理解在Windows平台下,采用异步选择机制可以提高网络应用程序的性能。Lesson17:详细讲解进程间通讯的四种方式:剪贴板、匿名管道、命名管道和邮槽。并比较分析这几种进程间通信的优点和缺点。Lesson18:ActiveX控件的应用与工作原理。ActiveX控件的编写,如何为控件安排属性,方法,事件,属性页,持久性存储,控件如何通知容器自身属性的改变。如何注册控件与取消控件注册。在VB和VC中访问ActiveX控件。Lesson19:动态链接库程序的编写。静态库与动态库的区别,以及调用程序在链接静态库和动态库时的区别。如何利用工具查看动态链接库输出的函数,Depends工具的使用,C++编译器名字改编技术对动态链接库输出函数的影响,extern"C"的用法,利用模块定义文件来解决C++名字改编的问题。用typedef定义指向函数的指针类型,如何获得动态连接库里的函数的指针。Lesson20:Hook编程。如何安装钩子过程,如何编写全局钩子,动态连接库里的全局变量数据共享问题分析。ADO数据库编程。在VB中利用ADO控件和ADO对象访问数据库,在VC中利用ADO技术访问数据库。第一章Windows程序内部运行机制这一章比较零散,笔记也很零散一、windows是事件驱动方式的程序设计windows程序设计是种事件驱动方式的程序设计,主要基于消息的。当用户需要完成某种功能时,需要调用OS某种支持,然后OS将用户的需要包装成消息,并投入到消息队列中,最后应用程序从消息队列中取走消息并进行响应。二、消息队列每个应用程序OS都为它建立一个消息队列,消息队列是个先进先出的缓冲区,其中每个元素都是一个消息,OS将生成的每个消息按先后顺序放进消息队列中,应用程序总是取走当前消息队列中的第一条消息,应用程序取走消息后便知道用户的操作和程序的状态,然后对其处理即消息响应,消息响应通过编码实现。三、Window程序入口WinMain函数是Windows程序入口点函数,由OS调用,当OS启动应用程序的时候,winmain函数的参数由OS传递的。四、创建一个完整的窗口需要经过下面四个操作步骤1,设计一个窗口类。如:WNDCLASSwndcls。2,注册窗口类。如:RegisterClass(&wndcls)。3,创建窗口。如:CreateWindow(),CreateWindowEX();显示及更新窗口。如:ShowWindow(),UpdateWindow();其他值得注意的地方1,消息结构typedefstructtagMSG{.))第二章MFC程序框架的剖析说明:本课对应教学视频的第三课,第二课是C++,被我跳过去。C++我打算另外在用多点的篇幅来讨论。重点:MFC运行机制提示:对于不想理解内部运行过程的,可以不看这一章,可以看了后面的界面设计再回头来看这一章,可能感觉更深刻。这一次课和上一次的课的重点就是MFC的窗口类创建过程,而要反复说明的就是:MFC的程序和C语言的程序,从执行原理上说,是完全一致的。抓住这一点,那么对于理解MFC程序的运行机制也就相对于简单了。C中的main函数就相当于MFC中的WinMain函数。感兴趣的可以利用VC的断点设置自己跟踪下面讲述的各个函数,就明白它的执行顺序了。一、C语言程序执行步骤在C语言中,大约的步骤如下:1,全局变量内存分配2,进入main函数二、MFC程序的运行步骤(主要是初始化)打开一个MFCAPPWizard(exe)工程,跟踪其执行步骤,可以发现,是以下顺序:1)CXXApp中的全局变量定义CXXApptheApp;2)调用CXXApp构造函数CXXApp::CXXApp(){}3)进入Winmain函数(_tWinMain为宏,值为WinMain)_tWinMain(){}4)完成初始化工作:包括窗口类注册、窗口产生、显示和更新pThread->InitInstance()对于MFC程序,MainFrame,View,ToolBar,Controlbar等都是窗口,所以下面的窗口注册与创建、显示等要反复调用多次,一次对应一个窗口(1)注册窗口类AfxEndDeferRegisterClass(2)创建窗口CMainFrame::PreCreateWindow()..)....END_MESSAGE_MAP()之间寻找),最终找到对应的消息处理函数。当然,如果子类中没有对消息进行处理,则消息交由基类处理。说明:virtualLRESULTWindowProc(UINTmessage,WPARAMwParam,LPARAMlParam);virtualBOOLOnWndMsg(UINTmessage,WPARAMwParam,LPARAMlParam,LRESULT*pResult);二、绘图DC的获取说明:在View类添加WM_LBUTTONDOWN和WM_LBUTTONUP的消息处理函数,我们将用来演示各种DC的获取,以及显示效果。View类添加全局变量CPointm_ptOrigin用来存储左键按下点坐标。下面集中来关注OnLButtonUp中的绘图程序和效果。以下语句添加于OnLButtonUp函数中,可以查看不同的效果。1,使用SDK获取DC句柄:HDChdc;hdc=::GetDc(m_hWnd);孙鑫BOOLSetDefaultItem();BOOLSetMenuItemBitmaps();获取菜单的宽和高:GetSystemMetrics(SM_CXMENUCHECK),GetSystemMetrics(SM_CYMENUCHECK)例子:1,给菜单项打上标记GetMenu()->GetSubMenu(0)->CheckMenuItem(0,MF_BYPOSITION|MF_CHECKED);GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_FILE_NEW,MF_BYCOMMAND|MF_CHECKED);2,设置缺省菜单项GetMenu()->GetSubMenu(0)->SetDefaultItem(1,TRUE);GetMenu()->GetSubMenu(0)->SetDefaultItem(ID_FILE_OPEN);3,图形标记菜单先创建图形,注意底色不要是白色(IDB_BITMAP1);GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(0,MF_BYPOSITION,&m_bitmap,&m_bitmap);4,屏蔽菜单,使之不能用(需要在CMainFrame::CMainFrame()中设置m_bAutoMenuEnable=FALSE;)GetMenu()->GetSubMenu(0)->EnableMenuItem(1,MF_BYPOSITION|MF_DISABLED|MF_GRAYED);5,取消和加载菜单用此功能,可以动态的修改菜单SetMenu(NULL);5)利用WM_GETTEXT消息处理获取文本charch1[10];可以用以下四种方法(m_edit1为关联的控制型变量)::SendMessage(GetDlgItem(IDC_EDIT1)->m_hWnd,WM_GETTEXT,10,(LPARAM)ch1);::SendMessage,WM_GETTEXT,10,(LPARAM)ch1);GetDlgItem(IDC_EDIT1)->SendMessage(WM_GETTEXT,10,(LPARAM)ch1);(WM_GETTEXT,10,(LPARAM)ch1);利用WM_SETTEXT消息处理设置文本(WM_SETTEXT,0,(LPARAM)ch3);6)直接对对话框控件进行消息发送SendDlgItemMessage(IDC_EDIT1,WM_GETTEXT,10,(LPARAM)ch1);3)在OnOK(defaultbutton对应的函数)GetFocus()->GetNextWindow()->SetFocus();注意看属性页资源的属性:类型-Child,Border-Thin,Systemmenu不复选,Morestyle中复选了Disabled也可以通过修改普通对话框,而成为属性页。3,创建类给属性页对话框添加类的时候,基类选为CPropertyPage,而不是CDialog4,创建属性表单利用Classwizard插入一个新的类,基类选为CPropertySheet5,给属性表单添加三个public变量CProp1m_prop1;CProp2m_prop2;CProp3m_prop3;6,在属性表单的两个构造函数增加表单AddPage(&m_prop1);AddPage(&m_prop2);AddPage(&m_prop3);7,在View类添加一个菜单项,添加响应函数,添加下列语句CPropSheetpropSheet("维新属性表单程序");行完几句后,变量pos=NULL,因为没有下一个视图类,自然也没有下一个视图类的POSITION.但是这几条语句太简单,不具有太强的通用性和安全特征;当象前面说的那样,当要在多个视图为中返回某个指定类的指针时,我们需要遍历所有视图类,直到找到指定类为止。判断一个类指针指向的是否某个类的实例时,可用IsKindOf()成员函数时行检查,如:pView->IsKindOf(RUNTIME_CLASS(CTestView));即可检查pView所指是否是CTestView类。有了以上基础,我们已经可以从文档类取得任何类的指针。为了方便,我们将其作为一个文档类的成员函数,它有一个参数,表示要获得哪个类的指针。实现如下:CView*CTestDoc::GetView(CRuntimeClass*pClass){CView*pView;POSITIONpos=GetFirstViewPosition();while(pos!=NULL){pView=GetNextView(pos);if(!pView->IsKindOf(pClass))break;}if(!pView->IsKindOf(pClass)){AfxMessageBox("ConntLocatetheView.\r\n");returnNULL;}returnpView;}其中用了两次视图类的成员函数IsKindOf()来判断,是因为退出while循环有三种可能:为NULL,即已经不存在下一个视图类供操作;已符合要求。1和2同是满足。这是因为GetNextView()的功能是将当前视图指针改变成一个视图的位置同时返回当前视图指针,因此pos是pView的下一个视图类的POSITION,完全有可能既是pos==NULL又是pView符合需要。当所需的视图是最后一个视图是最后一个视图类时就如引。因此需采用两次判断。使用该函数应遵循如下格式(以取得CTestView指针为例):CTestView*pTestView=(CTestView*)GetView(RUNTIME_CLASS(CTestView));RUNTIME_CLASS是一个宏,可以简单地理解它的作用:将类的名字转化为CRuntimeClass为指针。至于强制类型转换也是为了安全特性考虑的,因为从同一个基类之间的指针类型是互相兼容的。这种强制类型转换也许并不必要,但能避免一些可能出现的麻烦。3.从一个视图类取得另一视图类的指针综合1和2,很容易得出视图类之间互相获得指针的方法:就是用文档类作中转,先用1的方法得到文档类的指针,再用2的方法,以文档类的视图定位函数取得另一个视图类。同样,可以实现成一个函数:(假设要从CTestAView中取得指向其它视图类的指针)CView*CTestAView::GetView(CRuntimeClass*pClass){CTestDoc*pDoc=(CTestDoc*)GetDocument();CView*pView;POSITIONpos=pDoc->GetFirstViewPosition();while(pos!=NULL){pView=pDoc->GetNextView(pos);if(!pView->IsKindOf(pClass))break;}if(!pView->IsKindOf(pClass)){AfxMessageBox("ConntLocatetheView.");returnNULL;}returnpView;}这个函数和2中的GetView()相比,一是多了第一句以取得文档类指针,二是在GetFirstViewPosition()和GetNextView()前加上了文档类指针,以表示它们是文档类成员函数。有了此函数;当要从CTestAView中取得CTestBView的指针时,只需如下:CTestBView*pTestbView=(CTestView*)GetView(RUNTIME_CLASS(CTestBView)); 11)对于单文档中也可以加入多个文档模板,但是一般的就使用MDI方式开发多文档模板,其方法与上述视图的获取方法很接近,这里稍做解释,如果不清楚,请查阅MSDN,(以下四个内容(11、12、13、14)来源:)可以用CWinApp::GetFirstDocTemplatePostion获得应用程序注册的第一个文档模板的位置;利用该值来调用CWinApp::GetNextDocTemplate函数,获得第一个CDocTemplate对象指针。POSITIONGetFirstDocTemplate()const;CDocTemplate*GetNextDocTemplate(POSITION&pos)const;第二个函数返回由pos 标识 采样口标识规范化 下载危险废物标识 下载医疗器械外包装标识图下载科目一标识图大全免费下载产品包装标识下载 的文档模板。POSITION是MFC定义的一个用于迭代或对象指针检索的值。通过这两个函数,应用程序可以遍历整个文档模板列表。如果被检索的文档模板是模板列表中的最后一个,则pos参数被置为NULL。12)一个文档模板可以有多个文档,每个文档模板都保留并维护了一个所有对应文档的指针列表。用CDocTemplate::GetFirstDocPosition函数获得与文档模板相关的文档集合中第一个文档的位置,并用POSITION值作为CDocTemplate::GetNextDoc的参数来重复遍历与模板相关的文档列表。函数原形为:viaualPOSITIONGetFirstDocPosition()const=0;visualCDocument*GetNextDoc(POSITION&rPos)const=0;如果列表为空,则rPos被置为NULL.13)在文档中可以调用CDocument::GetDocTemplate获得指向该文档模板的指针。函数原形如下:CDocTemplate*GetDocTemplate()const;如果该文档不属于文档模板管理,则返回值为NULL。14)一个文档可以有多个视。每一个文档都保留并维护一个所有相关视的列表。CDocument::AddView将一个视连接到文档上,将该视加入到文档相联系的视的列表中,并将视的文档指针指向该文档。当有File/New、File/Open、Windows/New或Window/Split的命令而将一个新创建的视的对象连接到文档上时,MFC会自动调用该函数,框架通过文档/视的结构将文档和视联系起来。当然,程序员也可以根据自己的需要调用该函数。VirtualPOSITIONGetFirstViewPosition()const;VirtualCView*GetNextView(POSITION&rPosition)cosnt;应用程序可以调用CDocument::GetFirstViewPosition返回与调用文档相联系的视的列表中的第一个视的位置,并调用CDocument::GetNextView返回指定位置的视,并将rPositon的值置为列表中下一个视的POSITION值。如果找到的视为列表中的最后一个视,则将rPosition置为NULL.15)从一个视图类取得另一视图类的指针这个应用在多视的应用程序中很多见,一般如果自己在主程序或者主框架中做好变量记号,也可以获得,还有比较通用的就是用文档类作中转,以文档类的视图遍历定位,取得另一个视图类。这个功能从本文第10项中可以得到。 _______________________________________________________________访问应用程序的其它类获得CWinApp:-在CMainFrame,CChildFrame,CDocument,CView中直接调用AfxGetApp()或用theApp-在其它类中只能用AfxGetApp()获得CMainFrame:-在CMinApp中用AfxGetMainWnd()或者m_pMainWnd-在CChildFrame中可用GetParentFrame()-在其它类中用AfxGetMainWnd()获得CChildFrame:-在CView中用GetParentFrame()-在CMainFrame中用MDIGetActive()或GetActiveFrame()-在其它类中用AfxGetMainWnd()->MDIGetActive()或AfxGetMainWnd()->GetActiveFrame()获得CDocument:-在CView中用GetDocument()-在CChildFrame中用GetActiveView()->GetDocument()-在CMainFrame中用-ifSDI:GetActiveView()->GetDocument()-ifMDI:MDIGetActive()->GetActiveView()->GetDocument()-在其它类中-ifSDI:AfxGetMainWnd()->GetActiveView()->GetDocument()-ifMDI:AfxGetMainWnd()->MDIGetActive()->GetActiveView()->GetDocument()获得CView:-在CDocument中POSITIONpos=GetFirstViewPosition();GetNextView(pos)-在CChildFrame中GetActiveView()-在CMainFrame中-ifSDI:GetActiveView()-ifMDI:MDIGetActive()->GetActiveView()-在其它类中-ifSDI:AfxGetMainWnd()->GetActiveView()-ifMDI:AfxGetMainWnd()->MDIGetActive()->GetActiveView()访问应用程序的其它类获得CWinApp:-在CMainFrame,CChildFrame,CDocument,CView中直接调用AfxGetApp()或用theApp-在其它类中只能用AfxGetApp()获得CMainFrame:-在CMinApp中用AfxGetMainWnd()或者m_pMainWnd-在CChildFrame中可用GetParentFrame()-在其它类中用AfxGetMainWnd()获得CChildFrame:-在CView中用GetParentFrame()-在CMainFrame中用MDIGetActive()或GetActiveFrame()-在其它类中用AfxGetMainWnd()->MDIGetActive()或AfxGetMainWnd()->GetActiveFrame()获得CDocument:-在CView中用GetDocument()-在CChildFrame中用GetActiveView()->GetDocument()-在CMainFrame中用-ifSDI:GetActiveView()->GetDocument()-ifMDI:MDIGetActive()->GetActiveView()->GetDocument()-在其它类中-ifSDI:AfxGetMainWnd()->GetActiveView()->GetDocument()-ifMDI:AfxGetMainWnd()->MDIGetActive()->GetActiveView()->GetDocument()获得CView:-在CDocument中POSITIONpos=GetFirstViewPosition();GetNextView(pos)-在CChildFrame中GetActiveView()-在CMainFrame中-ifSDI:GetActiveView()-ifMDI:MDIGetActive()->GetActiveView()-在其它类中-ifSDI:AfxGetMainWnd()->GetActiveView()-ifMDI:AfxGetMainWnd()->MDIGetActive()->GetActiveView()不过要注意在doc中要取得view的指针C*View要注意类C*View声明的问题,因为默认情况下,mfc在*中已经包含了*,如果在*中包含*,就会引起嵌套包含问题,这样要在*中加入classC*View;而在*中加入#include"*"首先添加OnPaint()消息函数窗口改变重绘会发送WM_PAINT消息,所以只要在OnPaint函数中处理即可.以下代码添加到OnPaint()中CRectr;(2,&r);if(!(WS_CHILD|WS_VISIBLE,r,&m_wndStatusBar,123);lw文件,重编译即可一、绘制图形CClientDCdc(this);CPenpen(PS_SOLID,1,RGB(255,0,0));(&pen);and.cpp文件中CView统统用CScrollView替换,注意类定义继承的地方2,添加OnInitialUpdate,在其中添加滚动条的初始化。不做这一步的话,将运行出错SetScrollSizes(MM_TEXT,CSize(800,600));第十二章文件操作我们假设您已经:1,知道如何创建一个单文档的AppWizard2,知道C++类、函数重载等简单知识3,知道如何给View类或者Doc文档添加成员变量4,会用MFC的IDE调试工具最好,那么本文的程序您可以copy去调试5,知道如何为某个框架类添加虚函数或消息处理函数1,指向常量的指针&&指针常量Charch[5]=”lisi”;Constchar*pStr=ch;constchar*等同charconst*Char*const*pStr=ch;指针是常量,指针不可更改,其内容可更改2,读写文件读取操作FILE*pFile=fopen("","r");charch[100]="0";of()){xt)\0*.txt\0AllFiles(*.*)\0*.*\0\0";xt)\0*.txt\0AllFiles(*.*)\0*.*\0\0";if(IDOK==()){CFilefile(),CFile::modeRead);char*pbuf;DWORDi=();pbuf=newchar[i+1];Thisletsanapplicationdeterminethebestwaytoallocateabufferforthevalue'sdata.所以,我们要调用两次RegQueryValue,第一次查询键值长度,第二次获得键值HKEYhkey;RegOpenKey(HKEY_LOCAL_MACHINE,"Software\\MyItem\\Name",&hkey);1.3fVoidCwinApp::OnFIleNew(){If(m_pDocManager!=NULL)m_pDocManager->OnFileNew();}OnNewDocument()函数内部调用过程:1,voidCWinApp::OnFileNew()中调用CDocManager*类型的成员变量m_pDicManager的OnFileNew函数:m_pDicManager->OnFileNew()2,在CDocManager::OnFileNew()中从文档链表取出文档指针。(在这个OnFileNew中调用OpenDocumentFile(),以下两步都是本函数内语句)pTemplate=(CDocTemplate*)();执行pTemplate->OpenDocumentFile(NULL);语句分为五步:1.DerivingyourclassfromCObject(orfromsomeclassderivedfromCObject).(即生成可串行化的类)2.OverridingtheSerializememberfunction.3.UsingtheDECLARE_SERIALmacrointheclassdeclaration.4.Definingaconstructorthattakesnoarguments.5.UsingtheIMPLEMENT_SERIALmacrointheimplementationfileforyourclass.IMPLEMENT_SERIAL(CGraph,CObject,1),1为版本号,保存和读取时版本号必须相同一个文档类对象能和多个视类对象相关,一个视类对象只和一个文档类对象相关.CPtr类和CObArray类很相似,只是CObArray类的add增加的是CObject*指针类型。类存入文件的例子voidCGraphicDoc::Serialize(CArchive&ar){POSITIONpos=GetFirstViewPosition();两个类型转换函数:(1)htonl把一个u_long类型从主机字节序转换为网络字节序(2)htons把一个u_short类型从主机字节序转换为网络字节序四、TCP聊天程序服务器端程序#include<>#include<>main(){WORDwVersionRequested;WSADATAwsaData;wVersionRequested=MAKEWORD(1,1);interr=WSAStartup(wVersionRequested,&wsaData);if(err!=0){return;}if(LOBYTE()!=1||HIBYTE()!=1){WSACleanup();return;}SOCKETsockSrv=socket(AF_INET,SOCK_STREAM,0);//第三个参数为零表示自动选择协议SOCKADDR_INaddrSrv;//定义一个地址结构体的变量=AF_INET;=htons(6000);//htons把一个u_short类型从主机字节序转换为网络字节序bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));listen(sockSrv,5);SOCKADDR_INaddrClient;intlen=sizeof(SOCKADDR);while(1){SOCKETsockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);charsendBuf[100];sprintf(sendBuf,"Welcome%stohere",inet_ntoa);send(sockConn,sendBuf,strlen(sendBuf)+1,0);charrecvBuf[100];recv(sockConn,recvBuf,100,0);printf("%s\n",recvBuf);closesocket(sockConn);}}要在控制台使用套接字,需要加入头文件#include<>和库函数要链接一个动态链接库,我们要在VC++菜单栏中选择Project--->Settings--->Link,在其中的Object/Librarymodules中先打入一个空格,再添加库函数五、TCP聊天程序客户端程序#include<>#include<>main(){WORDwVersionRequested;WSADATAwsaData;wVersionRequested=MAKEWORD(1,1);interr=WSAStartup(wVersionRequested,&wsaData);if(err!=0){return;}if(LOBYTE()!=1||HIBYTE()!=1){WSACleanup();return}SOCKETsockClient=socket(AF_INET,SOCK_STREAM,0);SOCKADDR_INaddrSrv;"";//本地回路地址,不管本地主机上有没有网卡,都可以测试网络TCP和UDP编程代码大致相同,不同之处在于,TCP使用send/recv;UDP使用sendto/recvfrom;sendto(sockClient,"Hello!",strlen("Hello!")+1,0,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClient,&len);六、UDP的聊天程序服务器版:#include<>#include<>voidmain(){WORDwVersionRequested;WSADATAwsaData;wVersionRequested=MAKEWORD(1,1);interr;=WSAStartup(wVersionRequested,&wsaData);if(err!=0){return;}if(LOBYTE()!=1||HIBYTE()!=1){WSACleanup();return;}SOCKETsockSrv=socket(AF_INET,SOCK_DGRAM,0);SOCKADDR_INaddrSrv;&addrSrv,sizeof(SOCKADDR));charsendBuf[100],recvBuf[100],temp[200];SOCKADDR_INaddrClent;intlen=sizeof(SOCKADDR);while(1){recvfrom(sockSrv,recvBuf,100,0,(SOCKADDR*)&addrClent,&len);if('q'==recvBuf[0]){sendto(sockSrv,"q",strlen("q")+1,0,(SOCKADDR*)&addrClent,len);printf("chatend!\n");break;}sprintf(temp,"%s:%s",inet_ntoa,recvBuf);printf("%s\n",temp);printf("pleaseinputdata:\n");gets(sendBuf);sendto(sockSrv,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrClent,len);}closesocket(sockSrv);WSACleanup();}七、UDP聊天程序客户机版:#include<>#include<>voidmain(){WORDwVersionRequested;WSADATAwsaData;interr;wVersionRequested=MAKEWORD(1,1);err=WSAStartup(wVersionRequested,&wsaData);if(err!=0){return;}if(LOBYTE()!=1||HIBYTE()!=1){WSACleanup();return;}SOCKETsockClient=socket(AF_INET,SOCK_DGRAM,0);SOCKADDR_INaddrSrv;"");=AF_INET;=htons(6000);charsendBuf[100];charrecvBuf[100];chartemp[200];intlen=sizeof(SOCKADDR);while(1){printf("pleaseinputdata\n");gets(sendBuf);sendto(sockClient,sendBuf,strlen(sendBuf)+1,0,(SOCKADDR*)&addrSrv,len);recvfrom(sockClient,recvBuf,100,0,(SOCKADDR*)&addrSrv,&len);if('q'==recvBuf[0]){sendto(sockClient,"q",strlen("q")+1,0,(SOCKADDR*)&addrSrv,len);printf("chatend!\n");break;}sprintf(temp,"%s:%s",inet_ntoa,recvBuf);printf("%s\n",temp);}closesocket(sockClient);WSACleanup();}记着要加载库函数启动顺序应遵循先服务器后客户机,否则容易出错。发送字符时应该多加一个空字符作为结束字符。孙鑫VC++视频笔记(15)多线程与聊天室的创建收藏收藏孙鑫教学视频笔记(16)线程同步与异步套接字编程收藏新一篇:孙鑫教学视频笔记(17)进程间通信|旧一篇:孙鑫VC++视频笔记(15)多线程与聊天室的创建
本文档为【VC++深入详解学习笔记(非常全面)】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
该文档来自用户分享,如有侵权行为请发邮件ishare@vip.sina.com联系网站客服,我们会及时删除。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
下载需要: 免费 已有0 人下载
最新资料
资料动态
专题动态
个人认证用户
海花的蓝
目前担任HR一职
格式:doc
大小:262KB
软件:Word
页数:29
分类:高中其他
上传时间:2022-11-10
浏览量:1