VC实用学习记录自己整理的Word文件下载.docx
《VC实用学习记录自己整理的Word文件下载.docx》由会员分享,可在线阅读,更多相关《VC实用学习记录自己整理的Word文件下载.docx(14页珍藏版)》请在冰豆网上搜索。
也就是说,变量要么是真,要么是假。
举个例子:
booldone=false;
while(!
done){
...
}
bool布尔类型,值为ture或false
常用关键字
1关键字typedef:
允许你从一个现有的类型中创建一个新类型.
语法:
typedefexisting-typenew-type
例:
typedefunsignedshortintut;
utm;
上述代码表示将unsignedshortint简化为ut,然后用ut可以定义变量
1.3指针
指针就是用来保存内存地址的变量
—>
:
成员指针运算符,此用来用指针来访问对象的成员的运算符
设有一个Human类,代码解释
Human*per=newHuman;
//定义名为per的Human类型的指针,用new关键字在内存中开辟一块区域,存储Human类的一个匿名对象,然后用per指向这块地址
cout<
<
per->
getdata(6)<
endl;
//per->
可以访问对象中的成员
2函数及常用函数
2.1函数基本知识
函数是被用来调用的,调用前须先定义,定义前须先声明。
函数参数的传递C++有三种参数传递机制:
值传递、指针传递、引用传递
函数调用用堆栈管理——堆栈是先进后出的数据结构
函数调用时入栈操作:
1建立被调用函数的栈空间
2保护调用函数运行状态和返回地址
3传递参数
4控制权交给被调用函数
函数返回时出栈操作:
1返回值保存在临时空间
2恢复调用函数运行状态
3释放栈空间
4根据地址返回调用函数
函数指针指向函数的指针变量简称为函数指针
函数、应用程序是编译器处理的对象
每一个函数模块都有一个首地址,称为函数的入口地址
函数调用:
找到函数入口地址;
传递参数
不带括号的函数名就是函数入口地址
2.2内联函数
内联函数是C++为降低小程序调用开销的一种机制,内联函数机制为编译器在编译时,将内联函数的调用以相应代码代替
inline函数返回值类型函数名()
注:
内联函数仅在函数原型作一次声明。
适用于只有1~5行的小函数
不能含有复杂结构控制语句,不能递归调用
2.3函数重载
函数重载是以同一个名字命名多个函数实现版本
多个同名函数有不同的参数集
编译器根据不同参数的类型和个数产生调用匹配
函数重载用于处理不同数据类型的类似任务
2.4变量存储特性
1).自动存储类
自动存储变量存放在栈区
进入声明的块时生成,在结束块时删除
函数的参数和局部变量都是自动存储类
自动存储是变量的默认状态
2).静态存储类
关键字extern和static(静态)声明静态存储类变量和函数标识符
extern声明全局量(全局量默认为extern),static声明局部量
extern和static说明变量时,程序开始执行时分配和初始化存储空间
extern和static说明函数,表示从程序执行开始就存在这个函数名
book*creat()表明声明一个函数,函数名为creat,返回值为book类的一个指针
2.5关于include编译预处理命令的说明
>
表示从c++编译器指定的目录include查找,而用””括起来的表示先从当前目录查找,若找不到,再到编译器指定的目录include查找。
通常,包含用户自定义的文件用””,而对预定义的文件则用<
3类,对象
1、Cstring:
对字符串进行各种操作的类
2、每个对象在创建的时候都会自动调用该类的构造函数。
3、this指针保存了对象的内存地址
4、所有的MFC实现文件第一条语句都是:
#include"
stdafx.h"
5、一个类只能有一个析构函数,构造函数没有返回值。
析构函数无参数。
构造函数用来创造一个对象,析构函数用来销毁一个对象。
6、->
用法设Com为一个类:
Comc3;
Com*cp1=&
c3;
则访问c3中的成员有:
c3.set()cp1->
set()
7、CDC类:
定义了一类设备环境对象。
详见《VC基础教程》P85页
GDI:
图形设备接口GDI对象的种类:
(1)Cpen类封装了一个windowsGDI画笔
(2)CFont类MFC用CFont类封装了windows字体
(3)Cbitmap类封装了一个GDI位图详见《VC基础教程》P99页
4文件操作
C++中把数据之间的传输操作称作流。
在C++中,流既可以表示数据从内存传送到某个载体或者设备中,即输出流;
也可以表示数据从某个载体或者设备传送到内存缓冲区变量中,即输入流。
5VC软件操作及相关应用
IDE集成开发环境(IntegratedDevelopmentEnvironment,简称IDE)
5.1编译运行及文件类型
编译是对单个文件进行的,作用是检查程序有无错误。
生成*.obj文件供链接使用Ctrl+F7
Build(链接)对程序进行链接生成*.exe文件。
F7
Execute(执行)执行工程查看结果Ctrl+F5
.obj文件目标文件,一般是程序编译后的二进制文件,再通过链接器和资源文件链接就成exe文件了。
5.2控制台应用程序
定义:
没有任何windows程序所需元素的C++程序——实质上就是基于字符的命令行应用程序。
这些程序被称为控制台应用程序,因为用户是在字符模式中通过键盘和屏幕与它们通信的。
6windows编程和MFC基础
COM技术:
是一种通过接口方式进行组件间协作的模型,它提供了一种平台无关性并且不依赖于语言的规范。
Windows操作系统:
多任务,基于窗口。
由此产生事件驱动编程模式。
Windows程序是消息和事件驱动的。
Windows程序只能利用Windows操作系统提供的函数来访问计算机的输入和输出设备,直接访问硬件资源是不允许的。
因为windows下可能同时活动着多个程序,所以Windows必须确定给出的原始输入如单击鼠标或按下键盘上的某个按健是针对哪个应用程序的,然后相应地通知有关程序。
因此,Windows操作系统首先要控制与用户的所有通信。
消息:
是描述事件发生的信息。
Windows应用程序利用Windows消息(Message)与其他的Windows应用程序及Windows系统进行信息交换。
在Windows系统中,消息是一种Windows数据结构,其中包含有消息的名字、消息发生时的一些参数,以及处理这个消息的函数指针。
Windows中消息由三部分组成:
消息号、字参数和长字参数。
分别用于标识消息名和相关的附加参数。
Windows编程中常用的消息有:
窗口管理消息、初始化消息、输入消息、系统消息、剪贴板消息、控制处理消息、控制通知消息、滚动条通知消息、非用户区消息、MDI(多文档界面)消息、DDE(动态数据交换)消息,以及应用程序自定义的消息等。
消息驱动的机制:
Windows消息的种类很多,比如常见的有鼠标消息、键盘消息等。
以鼠标消息为例,当单击鼠标左键时,便会产生标识为WM_LBUTTONDOWN的消息。
Windows程序设计所要做的主要工作就是要对产生的各种消息进行处理。
Windows应用程序运行后都会打开一个窗口,并随时检测有无消息产生(这个过程叫消息循环)。
在Windows中,消息往往用一个结构体MSG来表示
句柄(Handle)是整个Windows编程的基础。
一个句柄是指Windows使用的一个唯一的整数值,是一个4字节长的数值,用于标识应用程序中不同的对象和同类对象中不同的实例,如一个窗口、按钮、图标、滚动条、输出设备、控件或者文件等。
应用程序通过句柄能够访问相应的对象信息。
Windows应用程序运行原理(代码实现)
每一个windows应用程序都可以被理解为一个接受,处理,分发消息的循环。
方法:
创建一个简单的win32应用程序,查看其代码,来理解Windows应用程序运行原理。
一个典型的windows应用具有如下框架:
注册窗口类,创建和显示窗口,处理消息循环
例如在win32应用程序中输出文字:
caseWM_PAINT:
hdc=BeginPaint(hWnd,&
ps);
//TODO:
在¨
²
此ä
?
添¬
¨
ª
加¨
®
任¨
意°
a绘?
图ª
代ä
码?
...
TextOut(hdc,50,50,_T("
海¡
ê
纳¨
¦
百ã
´
川ä
¡
§
,ê
有®
D容¨
Y乃?
大ä
"
),9);
//新?
语®
句?
EndPaint(hWnd,&
break;
——摘录于《工程化程序设计》孙连云,顾夏辉P17
MFC是MicrosoftFoundationClass的缩写,是在MicrosoftWindows操作系统中编程的一个应用程序框架。
是开发windows应用程序的一中工具或方式。
MFC具有如下特性
⑴封装了WindowsAPI(Windows提供给应用程序与操作系统的编程接口,即应用程序可以使用Windows系统的函数)。
程序可以在任何时候调用WindowsAPI函数,最大程度的利用了Windows。
⑵提供了一些通用类的支持,如列表、数组和映射类的集合、字符串类、时间日期类、文件访问类等。
⑶具有丰富的用户界面特性。
支持单文档视图(SDI)结构、多文档视图(MDI)结构、对话框、菜单、常用控件、打印预览和打印。
⑷支持动态链接库DLL,使DLL的编写越来越容易。
⑸支持数据库访问。
提供了多种数据库开发技术,主要包括ODBCAPI、MFCODBC、DAO、OLEDB和ADO。
⑹支持网络和通信。
使用ISAPI(网络服务接口)、WindowsSocket以及封装的Win32Internet接口,使网络通信编程更为轻松。
⑺支持OLE(对象链接和嵌入)。
支持对象嵌入、对象链接和自动化的OLE服务器和容器。
⑻支持ActiveX控件。
可以方便地生成和使用ActiveX控件。
学习MFC,最重要的一点是理解和使用MFC类库,而不是简单的记忆
句柄:
资源的标识,操作系统管理操纵这些资源,都是通过句柄来找到相应的资源,与指针有点类似。
句柄的声明typedefvoid*HANDLE
对话框:
可以添加控件的窗口
7MFC函数
OnCreate(LPCREATESTRUCTlpCreateStruct);
MFC窗口消息处理函数,窗口创建时由MFC框架调用
OnClose();
CMainFrame还有一个成员函数OnCreate(LPCREATESTRUCTlpCreateStruct),
AssertValid成员函数
提供对对象内部状态的运行时检查。
虽然在从CObject派生类时不要求重写AssertValid,但是这样做可以使类更加可靠。
AssertValid应该对所有对象的成员变量执行断言,以验证它们包含的值有效。
例如,它应检查指针成员变量不为NULL。
其它
AfxMessageBox函数作用:
显示一个windows消息框。
uc1601函数用来显示数据
动态链接库
Windows系统提供了一种有效的编程和运行环境,可以把独立的程序模块创建为较小的DLL(DynamicLinkableLibrary,动态链接库)文件,并可对它们进行单独编译和测试。
Windows系统中的核心功能、系统服务、应用程序服务等都是由一组动态链接库来实现的。
动态链接库在使用上有很多优点。
应用程序运行时,只有当EXE程序确定要调用某些DLL模块时,系统才会将它们装载到内存空间中。
这种方式不仅减少了EXE文件的大小和对内存空间的需求,而且使这些DLL模块可以同时被多个应用程序使用。
而且当动态链接库中的函数改变后,只要不是参数改变,调用这个函数的应用程序并不需要重新编译,这在编程时是十分有用的。
动态链接库(dll)就是程序运行时动态调用的函数库,其实它就是一个文件,其中包含了函数或全局变量。
与动态链接库相对应的是静态链接库(LIB)。
其相似之处是它们都是将一部分可执行代码以及数据放在库中供应用程序使用,而且在使用时,这些代码就好像是应用程序本身的一部分。
二者的主要区别在于以下使用方法:
1)使用静态链接库的应用程序从函数库得到所引用函数的执行代码,然后把执行代码放进自身的执行文件中。
这样,应用程序在运行时就可以不再需要静态函数库的支持。
2)使用动态链接库的应用程序只包括了用于从DLL中定位所引用的函数信息,而没有函数的具体实现,要等到程序运行时才从DLL中获得函数的实现代码。
因此,使用DLL的应用程序在运行时必须要有相应DLL的支持。
DLL和EXE都是Windows系统下的可执行模块。
EXE是DLL所提供服务的使用者,调用DLL中的输出函数和变量。
每一个EXE在运行的时候,Windows均为它创建单独的进程环境,包括进程地址空间。
EXE就在它的地址空间中运行,对别的进程是不透明的,也就无法被别的进程调用,因此在许多情况下只能使用DLL来实现某些功能。
用户可能在应用程序中基于如下要求创建和使用DLL。
多个应用程序可以同时使用一个DLL模块
DLL的动态链接方法
在开发DLL时,需要把一些函数或类导出,这些函数或类就被称为导出函数或导出类。
而在使用DLL时,则要把DLL的导出内容导入到应用程序中。
在应用程序中访问DLL,实际上就是应用程序中的导入函数与DLL文件中的导出函数进行链接。
链接方式包括加载时动态链接(也称为隐式链接)和运行时动态链接(也称为显式链接)。
一般而言,发布的动态链接库需要包含3个文件:
包含文件(.h)、导入库文件(.lib)和实际代码文件(.dll)。
进程与线程
现代计算机系统允许将多个程序调入内存并发执行。
进程即执行中的程序,是指可以并发执行的程序在一个数据集合上的运行过程,它是申请系统资源和分配系统资源的基本单位,是系统的调度单位。
线程,也称轻量级进程,它是进程中的一个实体,是被操作系统独立调度和分配的基本单位。
一个进程可以包含一个或多个线程,因此一个进程可以完成多个任务。
常用实例代码
1显示程序背景图片
ClassWizard—>
为C**view类添加一个WM_PAINT消息映射函数然后添加代码如下:
voidCAdView:
OnPaint()
{
CPaintDCdc(this);
//devicecontextforpainting
//TODO:
Addyourmessagehandlercodehere
//DonotcallCView:
OnPaint()forpaintingmessages
RECTrect;
CDC*md=newCDC;
CBitmap*bitmap=newCBitmap;
GetClientRect(&
rect);
md->
CreateCompatibleDC(&
dc);
bitmap->
m_hObject=(HBITMAP):
LoadImage(NULL,"
b.bmp"
IMAGE_BITMAP,rect.right,rect.bottom,LR_LOADFROMFILE);
SelectObject(bitmap);
dc.BitBlt(0,0,rect.right,rect.bottom,md,0,0,SRCCOPY);
deletemd;
deletebitmap;
}
将b.bmp图片拷到工程所在文件夹下(毕业设计例子)
加载背景图
方案一,使用画刷改变视图单调的背景
1我们为CTestView类添加一个变量CBrushm_brushBackground;
这个画刷就是用于画背景的。
2我们在CTestView的构造函数中加入如下代码:
//方案一.1,直接用资源id
CBitmapbmp;
bmp.LoadBitmap(IDB_SPLASH);
///加载位图
m_brushBackground.CreatePatternBrush(&
bmp);
///创建位图画刷
*/
//方案一.2,读图片文件
HBITMAP
hBmp
=
(HBITMAP)LoadImage(AfxGetInstanceHandle(),"
.\\res\\background.bmp"
IMAGE_BITMAP,0,0,LR_LOADFROMFILE);
//
background
bitmap
picture
bmp.Attach(hBmp);
m_brushBackground.CreatePatternBrush(&
//AfxMessageBox("
gouzaohanshu"
);
3接着我们需要在OnDraw函数中画出来,代码如下:
CRectrect;
GetClientRect(rect);
///取得客户区域
pDC->
FillRect(rect,&
m_brushBackground);
///用背景画刷填充区域
4为了避免背景的闪烁,使显示更加完美,我们添加WM_ERASEBKGND消息的处理函数,并取消调用父类的处理函数,代码如下:
BOOLCTestView:
OnEraseBkgnd(CDC*pDC)
returnTRUE;
///////////////////////////////////////////////////////////////////
方案二-五,处理OnEraseBkgnd
BOOLCMPEG4DecoderView:
//dan,2007-6-9,修改为背景图片可随窗口客户区大小伸缩
//TODO:
Addyourmessagehandlercodehereand/orcalldefault
//dan,2007-6-9
//方案二读文件,图形可伸缩
/*
HDC
hMemDC
CreateCompatibleDC(pDC->
m_hDC);
CBitmap
bmp;
BITMAP
bm;
bmp.GetBitmap(&
bm);
SelectObject(hMemDC,hBmp);
CRect
rc;
GetClientRect(rc);
StretchBlt(pDC->
m_hDC,0,0,rc.Width(),rc.Height(),hMemDC,0,0,bm.bmWidth,bm.bmHeight,SRCCOPY);
bmp.DeleteObject();
/*方案三,直接使用资源id,图形可伸缩,修改为背景图片可随窗口客户区大小伸缩,图片偏大,失真
hMemDC=CreateCompatibleDC(pDC->
SelectObject(hMemDC,HBITMAP(bmp));
/*方案四,直接使用资源id,图形不可伸缩
backBmp;
//
backBmp.LoadBitmap(IDB_SPLASH);
CDC
memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap*
oldBmp=memDC.SelectObject(&
backBmp);
if(!
oldBmp)return
false;
cr;
GetClientRect(&
cr);
bmpinfo;
GetObject(backBmp.m_hObject,sizeof(BITMAP),&
bmpinfo);
int
wDelta=bmpinfo.bmWidth;
int
hDelta=bmpinfo.bmHeight;
for(int
w=0;
w<
cr.Width();
w+=wDelta)
for(int
h=0;
h<
cr.Height();
h+=hDelta)
BitBlt(w,h,wDelta,hDelta,&
memDC,0,0,SRCCOPY);
memDC.SelectObject(oldBmp);
memDC.DeleteDC();
//方