null第1章 Windows编程基础第1章 Windows编程基础C++语言基础知识
Windows编程的重要概念
Windows编程基本方法
Windows编程的主要特点C++语言基础C++语言基础数据类型
常量、变量与指针
控制语句
函数
类与对象
类继承(派生C++类)
函数与操作符重载
多态性与虚拟函数
I/O流结构数据类型(1)数据类型(1)基本数据类型
char、int、float、double、bool
复合数据类型
数组(一维/二维)
结构体(struct)
共用体(union)
枚举类型(enum)数据类型(2)数据类型(2)自定义数据类型(Win32数据类型)常量常量整型常量
十进制
示(20)
八进制表示(024)
十六进制表示(0x24)
浮点型常量
科学表示法(3e1)
字符型常量
转义字符(\r、\n、\t、\0)变量变量匈牙利表示法(前缀)指针与引用指针与引用指针
指针变量中存储的是对象地址
初始化时需要分配空间
指针可被同类对象的左值初始化
引用
引用是被引用对象的别名
对引用的修改是对被引用对象的修改控制语句(1)控制语句(1)条件语句
if…else语句
if(expression) { statement;}
else { statement;}
switch语句
switch(expression)
{ case constant:statement;break;
……
default:statement;}
?条件操作符
expression1 ? expression2 : expression3控制语句(2)控制语句(2)循环语句
for语句
for(expression1;expression2;expression3)
{ statement;}
while语句
while(expression) { statement;}
do…while语句
do{ statement;}while(expression) 控制语句(3)控制语句(3)转移语句
break - 强制退出循环或switch
continue - 中止最内层循环
goto - 跳转到指定位置函数函数函数定义
类型标识符 函数名(形参列表)
{ 函数体 }
函数调用
函数名(实参列表)
or 变量名=函数名(实参列表)面向对象和Windows编程(1)面向对象和Windows编程(1)面向过程编程
传统结构化语言采用的方法
面向对象编程
将数据与处理函数封装在类中,使用类的变量称为对象
可维护性、易修改性、可重用性好面向对象和Windows编程(2)面向对象和Windows编程(2)封装(encapsulation)
封装将逻辑上相关的数据联系起来,数据访问只能通过已定义的界面
继承(inheritance)
继承是一种联系类的层次关系模型,通过类的添加、修改等操作实现类重用
多态性(polymorphism)
多态性是指允许不同类对象对同一消息作出响应,实现“一种接口、多种方法”类与对象(1)类与对象(1)类(class)将数据和函数封装起来,像单个元素一样使用。类可以嵌套定义
类中包含2种类成员:数据成员和成员函数,成员函数可以访问类数据成员 class 类名称
{
type variables;//数据成员
public:
type functions;//成员函数
}类与对象(2)类与对象(2)类成员可定义为3种类型:
私有类型(private):只允许类本身声明的函数对其进行存取
公有类型(public):任何外部函数都能访问公有类型数据
保护类型(protected):只有派生类中的函数能访问保护类型数据类与对象(3)类与对象(3)对象(object)是类的实例,通过对象可以访问类成员
对象的定义方法:
类名称 对象名
类名称 *p=new 类名称
对象的使用方法:
对象名.成员函数名(数据成员名)
对象名->成员函数名(数据成员名)类与对象(4)类与对象(4)类与对象举例//声明类example
class example
{
int i;
public:
int j;
void fun();
};
void example::fun()
{
i=10;
}//声明类对象
example obj;
example *pp=new example;//使用类对象
obj.j=12;
pp->j=12;
obj.fun();
pp->fun();
obj.i=100; //错误例1-1类与对象(5)类与对象(5)构造函数(constructor)
特殊的成员函数,初始化对象或分配内存;构造函数名与类名相同,可以有多个构造函数,编译器通过参数识别;如果类中没指定构造函数,编译器产生缺省构造函数
析构函数(destructor)
特殊的成员函数,用来释放已分配的内存;析构函数名是类名前加“~”;每个类只有一个析构函数,不带任何参数,不返回任何值类与对象(6)类与对象(6)类中定义的函数是内联函数,类外定义的函数是非内联函数
编译器在调用内联函数的地方装入函数代码。内联函数影响代码大小和执行速度
Inline可用于强制定义内联函数
通常将较短函数定义在类中,将较长函数定义在类外类与对象(7)类与对象(7)静态数据成员用static声明,它的一个拷贝被类中所有对象维护
class test{ public: static int count;}
静态数据成员必须像全局变量一样,在类外定义和初始化
int test::count=0;类与对象(8)类与对象(8)静态成员函数用static声明,它的一个拷贝被类中所有对象维护
class test{ public: static int getcount();}
在类外可用类名和作用域调用静态成员函数
int count=test::getcount();
静态成员函数只能调用属于该类的静态数据成员和静态成员函数类与对象(9)类与对象(9)友元函数可访问类的私有和保护型数据
class 类名称
{
type variables; //数据成员
public:
friend type functions;//友元函数
}C++源文件的组织C++源文件的组织如果一个程序由多个C++源文件组成,通常将类定义单独放在头文件中,其中要包括在类外定义的内联函数的定义,并将头文件纳入用该类的C++源文件中
通常将非内联函数的定义放在单独的C++源文件中,称为类实现文件。最后将编译过的实现文件版本和主程序相链接类继承(1)类继承(1)C++提供类继承的机制,通过增加、修改类中的方法来扩充类
被继承的类称为基类(base)或父类(parent),继承的类称为派生类(derived)或子类(child)
派生类的声明方式:
class 派生类名称:派生方式 基类名称
派生方式有public、protected与private, 默认方式为public类继承(2)类继承(2)无论哪种派生方式,基类的私有成员不能被派生类继承,基类的保护成员和公有成员可继承为派生类成员类继承(3)类继承(3)基类与派生类举例 class parent //基类
{
int i;
protected:int x;
public:void change() {i++;x++;}
};
class son:public parent //派生类
{
public:void modify() {x++;}
};类继承(4)类继承(4)多重派生Student
输入学生姓名、英语和数学成绩,并输出相应内容Computer
输入并输出计算机成绩Physics
输入并输出物理成绩例1-2类继承(5)类继承(5)多重继承Price
输入起点、终点、距离和价格,并输出相应内容Station
输入并输出起点和终点Mile
输入并输出距离例1-3类继承(6)类继承(6)类的多继承性、多层性举例MathAndComputer
输入并输出数学系、计算机系学生成绩Math
输入并输出数学系学生成绩Computer
输入并输出计算机系学生成绩Physics
输入并输出物理系学生成绩ComputerAndPhysics
输入并输出计算机系、物理系学生成绩StudentScore
输入学生姓名、英语成绩,并输出相应的内容例1-4函数重载函数重载函数重载允许程序中声明多个同名函数,这些函数完成不同功能,并带有不同类型、数量的参数及返回值//函数重载定义
int doubleFun(int i)
{ return(2*i);}
float doubleFun(float f)
{ return(2*f);}//函数重载使用
int a=1;
float b=1.0;
isum=doubleFun(a);
fsum=doubleFun(b);操作符重载(1)操作符重载(1)操作符重载将已有操作符赋予新功能,并与该操作符的本来含义不冲突
操作符重载的声明方式:
函数类型 operator#(形参)
重载的操作符在使用时,根据操作符位置来判断其具体执行的运算例1-5操作符重载(2)操作符重载(2)前置操作符重载
operator++()
后置操作符重载
operator++(int)
双目操作符重载
OperClass operator+(OperClass)多态性与虚拟函数(1)多态性与虚拟函数(1)多态性(polymorphism)是面向对象程序
的重要特性
虚拟函数是基类中声明为virtual,派生类中重新定义的函数。不修改基类的源代码,可以修改基类的行为
等于的零虚函数称为纯虚拟函数。有纯虚函数的类称为抽象类。抽象类不能声明属于此类的对象,并要有其它派生类存在例1-6多态性与虚拟函数(2)多态性与虚拟函数(2)在函数重载中,函数名称相同,各函数的返回值类型与传递的参数类型不同
在虚拟函数中,各函数的类型和传递的参数类型相同,否则不能称为虚拟函数I/O流结构I/O流结构iostream
istream:输入流
cin>>、get、getline、read
ostream:输出流
cout<<、put、writeWindows应用程序、操作系统与计算机硬件的关系Windows应用程序、操作系统与计算机硬件的关系面向对象的程序设计面向对象的程序设计Visual C++是面向对象(Object-Oriented)的程序设计工具
对象是指Windows
部件,包括各种窗口、菜单、按钮、对话框等
大部分工作是对象创建与对象属性赋值窗口的概念(1)窗口的概念(1)窗口(Window)是程序用户界面,负责应用程序与用户的交互菜单栏边框标
栏客户区窗口的概念(2)窗口的概念(2)客户区与非客户区客户区非客户区事件驱动 (1)事件驱动 (1)Windows程序围绕事件产生,进而引发相应处理函数运行,称为事件驱动
消息是描述事件发生的信息,例如用户按下鼠标键,Windows系统产生鼠标消息
程序执行顺序取决于事件发生顺序,即是由顺序产生的消息驱动事件驱动 (2)事件驱动 (2)事件1→事件2→事件3句柄的概念句柄的概念句柄(Handle)是Windows标识不同对象或实例而使用的整数值消息的概念(1)消息的概念(1)Windows程序用消息(Message)交换信息,消息结构为MSG typedef struct tagMSG {
HWND hwnd; //窗口句柄
UINT message; //消息的值
WPARAM wParam; //消息的附加信息
LPARAM lParam; //消息的附加信息
DWORD time; //消息送至队列的时间
POINT pt; //发送消息时光标位置
}MSG;消息的概念(2)消息的概念(2)系统定义的消息分类消息的概念(3)消息的概念(3)常用的Window系统消息
Windows程序组成Windows程序组成主要文件类型Windows程序框架(1)Windows程序框架(1)创建一个窗口
设计一个窗口类
注册窗口类
创建窗口
显示及更新窗口
进行消息循环
编写窗口处理函数Windows程序框架(2)Windows程序框架(2)WinMain函数
所有Windows程序的入口函数
WinMain函数功能
注册窗口类、建立窗口并初始化
进入消息循环,根据消息队列接收的消息,调用相应的处理过程
接收WM_QUIT消息时,终止程序运行Windows程序框架(3)Windows程序框架(3)WinMain函数声明 int WINAPI WinMain
(
HINSTANCE hInstance, //当前实例
HINSTANCE hPrevInstance,//前一个实例
LPSTR lpCmdLine, //命令行指针
int nCmdShow //窗口显示方式
)Windows程序框架(4)Windows程序框架(4)WinMain函数初始化
注册窗口 - RegisterClass()
创建窗口 - CreateWindow()
显示窗口 - ShowWindow()
更新窗口 - UpdateWindow()
加载图标 - LoadIcon()
加载光标 - LoadCursor()Windows程序框架(5)Windows程序框架(5)设计窗口类 typedef struct _WNDCLASS {
UINT style; //窗口样式
WNDPROC lpfnWndProc; //窗口处理函数
int cbClsExtra; //类附加内存
int cbWndExtra; //窗口附加内存
HANDLE hInstance; //程序实例句柄
HICON hIcon; //图标句柄
HCURSOR hCursor; //光标句柄
HBRUSH hbrBackground; //背景画刷句柄
LPCTSTR lpszMenuName; //菜单资源名
LPCTSTR lpszClassName; //窗口类名
} WNDCLASS;Windows程序框架(6)Windows程序框架(6)在窗口类WNDCLASS中,lpfnWndProc成员指定窗口处理函数,又称回调函数
当程序收到给窗口的消息,它应该调用某个函数处理该消息。调用过程由操作系统完成,但回调函数代码由应用程序完成
操作系统对消息调用的函数,由接收消息的窗口的lpfnWndProc成员指定Windows程序框架(7)Windows程序框架(7)CreateWindow函数 HWND CreateWindow (
LPCTSTR lpszClassName, //窗口类名
LPCTSTR lpszTitle, //窗口标题
DWORD dwStyle, //窗口样式
int X,int Y, //窗口左上角坐标
int nWidth,int nHeight,//窗口宽度高度
HWND hwndParent, //父窗口句柄
HMENU hMenu, //主菜单句柄
HINSTANCE hInstance, //当前程序实例
LPVOID lpParam ) //传递参数指针Windows程序框架(8)Windows程序框架(8)窗口样式Windows程序框架(9)Windows程序框架(9)消息循环
GetMessage()从消息队列取消息
DispatchMessage()向消息队列存消息 MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}Windows程序框架(10)Windows程序框架(10)窗口处理函数LRESULT CALLBACK WndProc(HWND hwnd,UINT message,
WPARAM wParam,LPARAM lParam)
{
switch (message) //消息循环
{
case WM_LBUTTONDOWN: //鼠标左键消息
……
case WM_DESTROY: //退出程序消息
PostQuitMessage(0);
default:
return DefWindowsProc(hwnd,message,wParam,lParam)
}
}Windows数据结构Windows数据结构POINT:点坐标结构
RECT:矩形区域结构 typedef struct tagPOINT
{
LONG x; LONG y;
} POINT; typedef struct tagRECT
{
POINT x; POINT y;
} RECT;编写Windows应用程序编写Windows应用程序调用Windows提供的Win32 API
大量程序代码由用户自己编写
使用MFC(微软基础类库)直接编写
提供大量预先编好的类和支持代码
使用MFC和向导(Wizards)编写
生成Windows应用程序的框架结构Windows API简介Windows API简介Windows API是应用编程接口(Application Programming Interface)
API提供Windows系统的各种处理函数,主要函数在Windows.h中定义
Windows提供1000多种API,基本上是按功能来命名,例如CreateWindow、LoadIcon等
MSDN是为开发人员提供的,包含大量的开发文档与示例代码调用Win32 API编程(1)调用Win32 API编程(1)#include
#include
int WINAPI WinMain(
HINSTANCE hInstance, //handle to current instance
HINSTANCE hPrevInstance, //handle to previous instance
LPSTR lpCmdLine, //command line
int nCmdShow) //show state
{
WNDCLASS wndcls;
wndcls.cbClsExtra=0;
wndcls.cbWndExtra=0;
wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);
wndcls.hCursor=LoadCursor(NULL,IDC_CROSS);
wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);
wndcls.hInstance=hInstance;
wndcls.lpfnWndProc=WinSunProc;
wndcls.lpszClassName="wuy";
wndcls.lpszMenuName=NULL;
wndcls.style=CS_HREDRAW|CS_VREDRAW;
RegisterClass(&wndcls);
HWND hwnd;
hwnd=CreateWindow("wuy","南开大学信息学院",WS_OVERLAPPEDWINDOW, 400,300,500,400,NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd);
MSG msg;
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}LRESULT CALLBACK WinSunProc(
HWND hwnd, //handle to window
UINT uMsg, //message identifier
WPARAM wParam, //first message parameter
LPARAM lParam) //second message parameter
{
switch(uMsg)
{
case WM_LBUTTONDOWN:
MessageBox(hwnd,"单击鼠标左键!","窗口事件1",0);
HDC hdc;
hdc=GetDC(hwnd);
TextOut(hdc,0,0,"单击鼠标左键!",strlen("单击鼠标左键!"));
ReleaseDC(hwnd,hdc);
break;
case WM_CLOSE:
if(IDYES==MessageBox(hwnd,"是否关闭窗口?","窗口事件2", MB_YESNO))
{
DestroyWindow(hwnd);
}
break;
case WM_DESTROY:
PostQuitMessage(0);
break;
default:
return DefWindowProc(hwnd,uMsg,wParam,lParam);
}
return 0;
}
例1-7调用Win32 API编程(2)调用Win32 API编程(2)程序执行过程
第1步:鼠标左键事件 第2步:窗口关闭事件MFC简介MFC简介微软基础类库(MFC,Microsoft Foundation Class)的所有类形成应用程序框架,充分支持Windows程序的开发
MFC的优点:
MFC完整地封装Windows API
MFC减少大量需编写的代码
MFC使开发者摆脱句柄困扰使用MFC和Wizards编程使用MFC和Wizards编程例1-9Windows SDK简介Windows SDK简介SDK是软件开发包(Software Development Kit),由厂商提供的开发所需资源
Windows SDK是Windows平台的软件开发包,包括:API函数库、帮助文档、使用、辅助开发工具等Windows程序设计特点(1)Windows程序设计特点(1)事件驱动的程序设计Windows程序设计特点(2)Windows程序设计特点(2)消息循环与输入
输入消息:包括键盘和鼠标输入
控制消息:与Windows控件双向通信,例如列表框、按钮等
系统消息:响应事件或时钟中断
用户消息:由程序员自定义、在程序中主动发出,由程序某个部分处理Windows程序设计特点(3)Windows程序设计特点(3)图形化输出
Windows是多窗口操作系统,操作系统对屏幕进行统一管理,程序只处理部分屏幕
Windows程序输出是图形,提供丰富的图形函数用于图形输出
Windows输出与设备无关,使用图形设备接口(GDI)Windows程序设计特点(4)Windows程序设计特点(4)用户界面对象
Windows支持丰富的接口对象,主要包括:窗口、图标、菜单、对话框等。程序员只需简短的代码,可以设计图形用户界面。在DOS环境下,需大量代码完成同样工作,效果不如WindowsWindows程序设计特点(5)Windows程序设计特点(5)资源共享模式
Windows是多任务操作系统,应用程序共享系统提供的资源,主要包括:设备上下文、画刷、画笔、字体、对话框、图标、定时器、符号、端口等
Windows程序以共享资源方式设计,基本模式为请求、使用与释放资源Windows程序设计特点(6)Windows程序设计特点(6)Windows程序构成第1次作业第1次作业利用类继承设计三个类,分别求 A(n)=n!、B(m,n)=m!/(m-n)!、C(m,n)=m!/(n!*(m-n)!)
设计学生类(CStudent),数据成员是学号、姓名与成绩(数学、外语与计算机),对类对象数组进行输入;设计以学号n为参数的函数,在数组中搜索学号为n的学生,返回该学生的全部信息
定义一个二维方阵类,通过重载二元运算符“-、+、”,求任意二维方阵的加法、减法和乘法谢谢大家谢谢大家