孙鑫视频教程VC++学习笔记(转载) 一个相对很粗糙的汇总
孙鑫视频教程VC,,学习笔记(转载)
VC第一课
如果想把窗口中的样式去掉一个。可以先把要去掉的样式名称去反,再与原来样式做&运算。
函数名字可以作为首地址来调用。相当于一个函数指针。
设置画刷getstockobject获取调色板句柄就是背景的颜色。
updatewindow窗口的更新,可有可无。
translatemessage把消息转换为wchar消息进行处理
dspatchemessage把消息交给系统处理
windows的消息驱动机制
releaseDC系统占用资源,如果不及时释放,会造成内存泄漏问
编程的小技巧:在if判断语句之中,我们将常量写在前面
distroywindow将窗口销毁了所以退出窗口要在WM_CLOSE下设置
VC第二课
在c语言中的结构体中不可以定义成员函数
但是在c,,中可以在结构体中定义成员函数
在c,,中结构体和类除了在访问控制方面是可以通用的。结构体的成员是默认可以访问的为public
构造函数对所在的类进行初始化工作,防止对象的初始所带来的未分配问题,每个类都必须有一个构造函数,否则不能创建对象。如果没有设置构造函数,编译器自动创建一个缺省的构造函数,此函数不带任何参数
析构函数,当函数的声明周期结束以后,就去自动调用析构函数,析构函数不可以带参数,而且一个类只允许设置一个析构函数
所以说析构函数和构造函数是系统自动调用的。
函数的重载函数的参数类型和参数个数不同时,才可以重载
类的继承 对于子类来说,可以访问父类保护的成员。
先调用父类的构造函数,再调用子类的构造函数
但是对于析构函数来说,情况正好相反,子类先析构,父类再析构 函数的覆盖灯概念是发生再父类和子类之间
::作用域标识符
virtual关键字,定义函数为虚函数,和c,,中的多态性有关,依据对象的类型来确定调用哪一个函数。当传递子类的对象地址时,子类有的,调用子类的;子类没有的,调用父类的
含有【纯虚函数】的类不能实例化对象
引用的概念&b=a;当b的值赋为5,a的值为5。指的是一个同一块内存 通常引用用在函数传参
通常把类的定义和函数的声明定义在一个头文件之中,而把类的函数的具体实现定义在程序文件的正文之中
通常用预编译来防止类的重复定义ifndef,define,endif这个定义符,通常都加上预编符。编译过程,头文件是不参与的
VC第三课
点击相对应的基类,就是在MFC中所定义的类。
CWnd跟窗口操作相关的类
_tWinMain实际上就是WinMain,它只是一个宏
在WinMian函数调用之前,就已经把全局变量分配了内存空间,所以WinMain函数能直接调用这些值。
CDocument文档类,视类结构
当一个窗口销毁以后,c,,的对象没有销毁,对象此时是可以用的;当一个对象销毁以后,窗口销毁。框架窗口创建之后来创建其中的控件 加上m_习惯上
示一个成员变量getparpent得到父窗口的指针
VC第四课windows应用程序的消息机制
前面的窗口会覆盖后面的窗口,从而造成消息反应没有进行 MFC采用的消息机制叫做消息映射
afx{{}}afx中的灰色代码由vc编译器使用,不属于正常的c,,代码
WindowProc是一个虚函数,由其中的onwndmsg函数完成消息函数处理,查找函数映射,即
在头文件中的afx{{
在源文件中的afx{{
在源文件中的函数声明
dc
cdc
cclineddc
cwindowdc概念理解
cpen
cbrush
cbitmap
位图画刷,各种画笔的创建。以及得到透明的画刷
加上static关键词,在程序初始化时,已经装入内存。静态区域的变量声明,要在函数外部以及类的外变量行常量初始化
,,和,的区别,比较和赋值
setROp2绘画模式
第五课
创建一个插入符:createsolidcaret strlen是获得的一个字符串的个数而不是宽度。获取字符串宽度,使用gettextextent函数,返回csize对象
路径区
定时器的创建和drawtext的显示setTimer()1000代表一秒钟??
第六课popup勾选,不能响应命令
菜单一般用IDM_ 表示
view视图类,>doc文档类,>mainfram主框架窗口,>app应用程序类 除了WM_COMMAND以外,所有以WM开头的消息,从cwnd派生的类都可以接收到这些消息
app和doc不能接收系统消息
通告消息,由控检产生的消息
首先由框架类接收相应的命令函数,接着框架类把函数处理的权利交给自己的子窗口;如果视图类没有相应的函数响应,视图类把函数处理的权利交给文档类;文档类交给视图类;视图类交给框架类;框架类交给应用程序类 计算菜单索引,不要把分割兰忽略
缺省菜单只有一个缺省菜单,以最后显示的为主
图形标记的一般尺寸:用getsystemetrics得到
在 这一节里,得到了一个不小的教训,当
一个带有图像的菜单时,需要载入一副存在的位图。声明存储的图片IDB_时应该注意。如果声明的是一个指针变量即 *bitmap需要预先初始化,否则编译时候虽然不会出现错误,但是在运行期间,会造成内存的泄不过在漏,程序出现错误误。不过在 setmenuitembitmaps函数中,要引用一副图像,必须加上引用操作符即&这样才能确保万无一失。
menu的局部设置变量引起问题,可以在setmenu之后设置一个detach函数来将句柄交给上一层操作。这样在对象销毁的时候,可以保留此析构函数继续执行的权利。
菜单状态的维护是依赖于cn_update_command_ui消息,谁捕获了它,mfc就在其中创建一个ccmdui对象,通过id索引菜单时的和工具栏的不对应性 如果要在工具栏上实现一个和菜单响应相应的函数,则将菜单的id号码和工具栏的id号设置为相同的。这样在调用时就可以实现相同的功能 在窗口中实现右键菜单trackpopupmenu函数,指针的指向this或者时getparent()函数
增加资源和相应的函数相应,从而达到相应的效果(所经过的三个过程)
第七课模态对话框的销毁使用cdialog::enddialog()来关闭
要解决在别的类之中函数执行完毕自动销毁的问题。除了声明一个成员变量以外,可以声明一个指针变量,将指针变量指向需要处理的数据。可以有效而且高效的解决这个问题
非模态对话框点击ok以后,窗口并没有被销毁,只是被隐藏罢了。不要调用基类的onok它是专门用在模态对话框的函数。要在类之中覆盖ok虚函数 getdlgitem(id)得到相应标签的caption
非零为零,否则为假
在MFC中,一般用关联变量的
来关联相关的text控检,由DDX_来关联 UpdateData函数在模态对话框初始化时,自动调用
DDX_表示数据交换
DDV_表示数据校验
这些都是在MFC框架之中才有的
WM_GETTEXT
EM_SETSEL
EM_SETTEXT
GetWindowRect()来获取窗口的矩形区域
SetWindowPos来重新设置窗口的尺寸
WM_INITDIALOG消息
GetNextWindow函数来设置下一个窗口
GetWindow比GetNextWindow更高效
GeNextDlgTabltem
ctrl+D出现tab序号
Onok函数不仅仅在ok函数出现的时候才有用
初始默认ok按钮的缺省名称为ID_OK而不是IDC_OK
第八章 对话框第二部分
操纵一个cpropertysheet几乎和操纵一个cdialog对话框基本上是一样的 属性页编程向导页是用SetWizardMode函数
单选按钮没有选中时的值默认设为,1
第九章
PreCreateWindow是个虚函数,在修改窗口样式时使用.只需要修改CREATERSTRUCT的引用值cs即可.要想在但文档窗口中通过cs.lpszname来修改窗口函数,则在窗口样式中必须调用这个参数
SetWindowLong在创建窗口之后来改变窗口外观,它有三个参数 先使用GetWindowLong来得到要修改的值
通过全局函数AfxGetInstanceHandle可以得到一个当前应用程序的句柄 如果不想改变窗口过程,那么调用: efWindowProc来默认窗口的过程调用函数.注意不是DefWindowProc()
要修改图标的话,只能在框架窗口中声明;如果要在视图框架中声明,则在视图窗口中声明
高效函数:LPCTSTR AFXAPI AfxRegisterWndClass( UINT nClassStyle, HCURSOR
hCursor = 0, HBRUSH hbrBackground = 0, HICON hIcon = 0 );
setclasslong函数在窗口创建以后在改变其中的值,一般在oncreate函数中使用
MAKEINTRESOURCE宏用来取得资源指针
一个资源名称可以表示不同的资源EnableDocaking可以改变窗口样式.但是fram框架中也有一个EnableDocaking函数,主要设置窗口可以被停靠,避免混淆 创建工具栏的两种方法,几个步骤
RecalcLayout函数用于在工具栏变动之后重新调整窗口位置
ShowControlBar()也是一个高效的函数
状态栏的编程:提示行,状态指示器
CToolBar工具栏
CStatusBar状态栏
SetPaneText是cstatusbar里的函数
【CClientDC dc(this);CSize sz=dc.GetTextExtent(str1);】经典代码 CProgressCtrl类表示进度条
关于用户自定义函数WM_USER的定义是加上一个正数
用户自定义函数SendMessage函数要写在正确的位置。就像写在了PreCreateWindow函数中一样,由于函数抛出了消息,所以程序编译通过,但消息是在窗口准备形成过程中抛出,所以执行会产生错误.
setMessage和postMessage也不同,区别很大
运行时候产生的警告信息很多是由于已经创建了相关指针指向的区域。而后来的指针有一次声明指向另一个对象。解决的办法通常是先判断这个指针是否已经指向其他对象。调用object.m_hWnd判断之
MoveWindow可以移动从CWnd继承而来的窗口
SetMessageText函数直接在状态栏上改变文字
GetMessageBar可以得到一个状态栏的指针
许多常用的控检,系统已经给我们定义好了
让程序实现启动时画面
第十章COLORREF SetPixel( int x, int y, COLORREF crColor );函数也是CDC的成员函数.在一个制定的点设置一个象素
Ellipse函数控制画椭圆
ctrl和tab键是在两个窗口之间相互切换
当一个对象有了一个缺省的值,而我们又需要改变这个对象的这个属性,则用|操作符来勾践一个复合对象属性
很多时候,由于已经设置了一个关于对象的属性,当再次设置这个属性时,可能会发生异常。所以在将一个指针或者对象分配方法和资源的时候,先判断对象的属性是否已经被赋值调用deleteobject函数释放对象。然后再将新的值付给窗口资源
OnCtlColor函数是响应WM_CTLCOLOR消息的
GetDlgCtrlID的使用得到窗口或者控检的句柄
第十一章
保持功能
The CPtrArray class supports arrays of void pointers.
窗口重会的时候保存图像再次输出
比如集合类CStringArray类
这里也有一个集合类CPtrArray,保存的只是对象的地址,当对象不存在的时候,指针荏苒保存了对象的地址
对象的生命周期问题
凡是用new分配的对象都是在堆种分配的???????如果不去显示的调用delete函数去释放对象,那么对象的声明周期将持续在程序开始到程序结束 ondraw是个虚函数当在函数中调用onpaint函数,如果不去在onpaint函数中调用ondraw函数,那么函数就不可能执行到ondraw函数,ondraw函数根本不起作用
如果该程序中使用了setworldtransform函数,那么就从应用程序的世界坐标系空间开始;否则,映射在应用空间进行
OnInitialUpdate() 是在窗口创建之后第一个调用的函数,在ondraw函数之前.也就是说,在窗口创建之后,我们可以通过此函数来改变相关的参数
第十二章 文件操作
注意字符数组的这个号码
指向常量的指针类型*pStr='W'错误,pStr="wangyu"正确,也就是说对于常量字符串
我们只能修改其指向的常量,而不能改变常量的值。而对于这样的声明(char ch[5]="lisi";char *const pstr=ch)则声明此指针为常量,这样,不能改变指针所指向的量,但是可以通过*pStr来改变指向量的值
size_t指示一个无符号整型
windows采用缓冲技术来保存数据,即先给正在使用的文件分配一个内存区域,当存入其中的数据量达到缓冲溢出量的时候,一起把缓冲区中的数据存入文件,这就是fclose函数的作用fflush函数的作用是刷新缓冲区,让数据先保存 memset是用一个指定的字符来设置一块buff
fseek和ftell函数的配合使用
当我们按照文本方式往文件中写入数据时,一旦遇到换行符(ASCII为10),则转换为回车,所以我们在保存文件的时候要保持一直
0的acsII码为48
char,远不如string类型好用哎,文件有ofstream()它老人家就行了 outstream和ifstream函数
createfile API中的函数其中的lpSecurityattributes是关于安全性的设置,只有在WINNT系统中才起作用writefile用closehandle来关闭函数 一般在文件编程之中,我们都用CFile类
打开与保存对话框的过滤功能。结束
可能产生病毒:::getprofilestring与::writeprofilestring函数在win.ini中操作数据
操作注册表:SetRegistryKey(_T(http )来在user分支来创建总菜单,用WriteProfileString来设置子项的内容这些前面都没有全局操作符,是WinApp的成员函数,常常用在init函数中间来设置相关的值。
函数:HKEY 变量 RegCreateKey(创建)/RegCloseKey RegSetValue危险!!!
读取注册表数据:RegQueryValue函数
RegOpenKey
第十三章 文档与串行化
文件读取类,CArchive它没有基类。数据持久化的过程就叫做串行化。和文件相关,带缓冲写入和读出数据。在创建之前必须有一个Cfile对象,而且只能对应一个对象。保存和提取的顺序应该相同。真他妈天才
OnNewDocument在点击新建菜单时调用的函数如settile 上一步就是在app类的init函数中调用的文档类字符串资源关联 CPRLIST是一个指针链表。
每当有一个文档的时候,必定有一个文档的对象,框架类对象,视类的对象
内 部机制:CWinApp::OnFileNew()--->CDocManger::OnFileNew()--->
OpenDocumentFile()--->CSingleDocTemplate::OpenDocumentFile()--->Creat
eNewDocument()--->CreateNewFrame()--->OnNewDocument()--->END
Serialize函数提供加载和保存
如此复杂的MFC是怎么设计的啊…………变态!!!!!!! 当打开一个文档对象时,如果打开的是一个新的文档对象,那么先将原来的对象销毁,然后再打开新的对象。对比与office Word的保存打开功能来理解这个过程。在过程中,一直是一个文档文件指针。在但文档中,指针并不销毁,而是晴空,专指的过程
有五个步骤来使一个类串行化
CObArray类的集合类,也支持串行化
getfirstviewposition可以在一个文档类中得到一个视类的指针 getdocument可以在一个view视图类得到一个文档类指针
OnDeleteContents函数响应来销毁和释放内存,必须注意这里的内存释放,否则容易造成内存泄漏
第十四章 网络编程
用IP地址来标识主机,为了不同的通信设置一个端口号。全球唯一性。 应用层,,,,处理网络应用
表示层,,,,数据表示
会话层,,,,主机奸通信
传输层,,,,端到端的链接
网络层,,,,寻址和最短路径
数据链路层,,介质访问
物理层,,,,二进制传输
TCP/IP模型包括四个层次
应用层
传输层
网络层
网络接口
基于TCP.UDP的应用程序可以使用相同的端口号
scoket最先在Unix上面实现,后来才引用到windows等操作系统 基于TCP(面向连接的套接字编程)
WSAStartup
MAKEWOED宏
在加载WSAStartup函数后,一般都调用WSACleanUp销毁使用 socket创建套接字bind绑定套接字listen监听accept接收recv接收 htonl