计算机专业面试题目_第1页
计算机专业面试题目_第2页
计算机专业面试题目_第3页
计算机专业面试题目_第4页
计算机专业面试题目_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

计算机专业面试题集

计算机随笔2008-05-0519:28:18阅读2083评论0??字号:大中小?订阅

一些面试准备题(包括高质量C++题)

constchar*,charconst*,char*const的区别问题几乎是C++面试中每次都会有的题目。

事实上这个概念谁都有只是三种声明方式非常相似很容易记混。

Bjarne在他的TheC++ProgrammingLanguage里面给出过一个助记的方法:

把一个声明从右向左读。

char*constcp;(*读成pointerto)

constcp指向字符串;即指向字符串的常指针;

constchar*p;

p指向字符串常量,即指向字符串常量的指针;

charconst*p;

这个和上面的事一样的,表达的意思也是指向字符串常量的指针

同上因为C++里面没有const*的运算符,所以const只能属于前面的类型。

下面这个程序执行后会有什么错误或者效果:

#defineMAX255

intmain()

(

unsignedcharA[MAX],i;

for(i=0;i<=MAX;i++)

A[i]=i;

)

解答:

MAX=255

数组A的下标范围为O.MAX-l,这是其一..

其二.当i循环到255时,循环内执行:

A[255]=255;

这句本身没有问题..但是返回for(i=0;i<二MAX;i++)语句时,

由于unsignedchar的取值范围在(0..255),i++以后i又为0了..无限循环下去.

注:char类型为一个字节,取值范围是[-128,127],unsignedchar[0,255]

编写用C语言实现的求n阶阶乘问题的递归算法:*******仅仅只要是一个算法就ok,

不用管那么多,能用就行。

longintfact(intn)

(

intx;

longinty;

if(n<0)

|

printf("enor!u);

if(n==O)

return1;

x=n-l;

y=fact(x);〃这是一个递归调用过程,

return(n*y);

)

Longintfact(intn)

(

If(n<0)

(

Printf("error");

(

If(n==0)

Return1;

Else

Returnn:!:fact(n-l);

)

二分查找算法:〃已经在排好序的情况下进行查找

1、递归方法实现:

intBSearch(elcmtypca[],elemtypcx,intlow,inthigh)

/*在下届为low,上界为high的数组a中折半查找数据元素x*/

(

intmid;

if(low>high)return-1;//error

mid=(low+high)/2;

if(x==a[mid])returnmid;

if(x<a[mid])retum(BSearch(a,x,low,mid-1));

elsereturn(BSearch(a,x,mid+l,high));

)

Intbase(elenitypea[],elemtypex,intlowjnthigh)

(

Intmid;

If(low>high)

Return-1;

Mid=(low+high)/2;

If(x==a[mid])

Returnmid;

If(x<mid)returnbase(a,xJow,mid-l);

Elaereturnbase(a,x,mid+1,high);

)

2、非递归方法实现:

intBSearch(elemtypea1],keytypekey,intn)

intlow,high,mid;

low=0;high=n-l;

while(low<=high)

mid=(lovv+high)/2;

if(a[mid].key==key)returnmid;

elseif(a[mid].kcy<kcy)low=mid+l;

elsehigh=mid-l;

)

return-1;

1

非递归计算如下递归函数的值(斐波拉契):

f(D=l

f(2)=l

f(n)=f(n-l)+f(n-2)n>2

解:

intf(intn)

(

inti,s,sl,s2;

sl=l;/*sl用于保存f(n-l)的值*/

s2=l;/*s2用于保存f(n-2)的值*/

s=l;

for(i=3;i<=n;i++)

{

s=sl+s2;

s2=sl;

sl=s;

)

rcturn(s);

)

交换两个数,不用第三块儿内存:

inta=........;

intb=........;

a=a+b;

b=a-b;

a=a-b;

Qi:请你分别划划OSI的七层网络结构图,和TCP/IP的五层结构图?

1、OSI每层功能及特点

a物理层为数据链路层提供物理连接,在其上串行传送比特流,即所传送数据的单位

是比特。止匕外,该层中还具有确定连接设备的电气特性和物理特性等功能。

b数据链路层负责在网络节点间的线路上通过检测、流量控制和重发等手段,无差错

地传送以帧为单位的数据。为做到这一点,在每一帧中必须同时带有同步、地址、差

错控制及流量控制等控制信息。

C网络层为了将数据分组从源(源端系统)送到目的地(目标端系统),网络层的任

务就是选择合适的路由和交换节点,使源的传输层传下来的分组信息能够正确无误地

按照地址找到目的地,并交付给相应的传输层,即完成网络的寻址功能。

d传输层传输层是高低层之间衔接的接口层。数据传输的单位是报文,当报文较长时

将它分割成若干分组,然后交给网络层进行传输。传输层是计算机网络协议分层中的最

关键一层,该层以上各层将不再管理信息传输问题。

e会话层该层对传输的报文提供同步管理服务。在两个不同系统的互相通信的应用进

程之间建立、组织和协调交互。例如,确定是双工还是半双工工作。

f表示层该层的主要任务是把所传送的数据的抽象语法变换为传送语法,即把不同计

算机内部的不同表示形式转换成网络通信中的标准表示形式。此外,对传送的数据加

密(或解密)、正文压缩(或还原)也是表示层的任务。

g应用层该层直接面向用户,是OSI中的最高层。它的主要任务是为用户提供应用的

接口,即提供不同计算机间的文件传送、访问与管理,电子邮件的内容处理,不同计

算机通过网络交互访问的虚拟终端功能等。

2、TCP/IP

a网络接口层这是TCP/IP协议的最低一层,包括有多种逻辑链路控制和媒体访问协

议。网络接口层的功能是接收IP数据报并通过特定的网络进行传输,或从网络上接收

物理帧,抽取出IP数据报并转交给网际层。

b网际网层(IP层)该层包括以下协议:IP(网际协议)、ICMP(InternetControl

MessageProtocol,因特网控制报文协议)、ARP(AddressResolutionProtocol,地址解析

协议)、RARP(ReverseAddressResolutionProtocol,反向地址解析协议)。该层负责

相同或不同网络中计算机之间的通信,主要处理数据报和路由。在IP层中,ARP协议用

于将IP地址转换成物理地址,RARP协议用于将物理地址转换成IP地址,ICMP协议用

于报告差错和传送控制信息。IP协议在TCP/IP协议组中处于核心地位。

c传输层该层提供TCP(传输控制协议)和UDP(UserDatagramProtocol,用户数

据报协议)两个协议,它们都建立在IP协议的基础上,其中TCP提供可靠的面向连接

服务,UDP提供简单的无连接服务。传输层提供端到端,即应用程序之间的通信,主

要功能是数据格式化、数据确认和丢失重传等。

d应用层TCP/IP协议的应用层相当于OSI模型的会话层、表示层和应用层,它向

用户提供一组常用的应用层协议,其中包括:Telnet.SMTP、DNS等。此外,在应用层

中还包含有用户应用程序,它们均是建立在TCP/IP协议组之上的专用程序。

3、OSI参考模型和TCP/IP参考模型的区别:

aOSI模型有7层,TCP/IP只有4层;

bOSI先于协议出现,因此不会偏向于任何一组特定的协议,通用性更强,但有些功能

不知该放哪一层上,因此不得不加入一些子层;TCP/IP后于协议出现,仅是将己有协

议的一个描述,因此两者配合的非常好;但他不适合其他的协议栈,不容易描述其他

非TCP/IP的网络;

cOSI中网络层同时支持无连接和面向连接的通信,但在传输层上只支持面向连接的通

信;TCP/IP中网络层只支持无连接通信,传输层同时支持两种通信;

d在技术发生变化时,OSI模型比TCP/IP模型中的协议更容易被替换。

Q2:请你详细的解释一下IP协议的定义,在哪个层上面,主要有什么作用?TCP与

UDP呢?

解:与IP协议配套使用的还有三个协议:

ARP-地址解析协议

RARP一逆地址解析协议

ICMP一因特网控制报文协议ICMP

IP协议一网际协议

IP地址、IP包头

Q3:请问交换机和路由器分别的实现原理是什么?分别在哪个层次上面实现的?

将网络互相连接起来要使用一些中间设备(或中间系统),ISO的术语称之为中继

(relay)系统。根据中继系统所在的层次,可以有以下五种中继系统:

1.物理层(即常说的第一层、层L1)中继系统,即转发器(repeater)。

2.数据链路层(即第二层,层L2),即网桥或桥接器(bridge)。

3.网络层(笫三层,层L3)中继系统,即路由器(router)o

4.网桥和路由器的混合物桥路器(brouler)兼有网桥和路由器的功能。

5.在网络层以上的中继系统,即网关(gateway).

当中继系统是转发器时,一般不称之为网络互联,因为这仅仅是把一个网络扩大

了,而这仍然是一个网络。高层网关由于比较复杂,目前使用得较少。因此一般讨论

网络互连时都是指用交换机和路由器进行互联的网络。本文主要阐述交换机和路由器

及其区别。

第二层交换机和路由器的区别:

传统交换机从网桥发展而来,属于OS1第二层即数据链路层设备。它根据MAC地

址寻址,通过站表选择路由,站表的建立和维护由交换机自动进行。路由器属于os

I第三层即网络层设备,它根据IP地址进行寻址,通过路由表路由协议产生。因特

网的路由选择协议:内部网关协议IGP和外部网关协议EGP

第三层交换机和路由器的区别:

第三层交换技术出现之前,几乎没有必要将路由功能器件和路由器区别开来,他们完

全是相同的:提供路由功能正在路由器的工作,然而,现在第三层交换机完全能够执

行传统路由器的大多数功能。

综上所述,交换机一般用于LAN-WAN的连接,交换机归于网桥,是数据链路层

的设备,有些交换机也可实现第三层的交换。路由器用于WAN—WAN之间的连

接,可以解决异性网络之间转发分组,作用于网络层。他们只是从一条线路上接受输

入分组,然后向另一条线路转发。这两条线路可能分属于不同的网络,并采用不同协

议。相比较而言,路由器的功能较交换机要强大,但速度相对也慢,价格昂贵,第三

层交换机既有交换机线速转发报文能力,又有路由器良好的控制功能,因此得以广播

应用。

Q4:请问C++的类和C里面的struct有什么区别?

C++中的类具有成员保护功能,并且具有继承,多态这类。。特点,而c里的struct没有

Q5:请讲一讲析构函数和虚函数的用法和作用?

析构函数也是特殊的类成员函数,它没有返回类型,没有参数,不能随意调用,也没

有重载。知识在类对象生命期结束的时候,由系统自动调用释放在构造函数中分配的

资源。

这种在运行时,能依据其类型确认调用那个函数的能力称为多态性,或称迟后联编。

另:

析构函数一般在对象撤消前做收尾工作,比如回收内存等工作,虚拟函数的功能是使

子类可以用同

名的函数对父类函数进行重载,并且在调用时自动调用子类重载函数,如果是纯虚函

数,则纯粹是为了

在子类重载时有个统一的命名而已。

Q6:全局变量和同部变量有什么区别?实怎么实现的?操作系统和编译器是怎么知道

的?

全局变量的生命周期是整个程序运行的时间,而局部变量的生命周期则是局部函数或

过程调用的时

间段。其实现是由编译器在编译时采用不同内存分配方法。全局变量在main函数调用

后,就开始分配,

如果是静态变量则是在main函数前就已经初始化了。而局部变量则是在用户栈中动态

分配的(还是建议

看编译原理中的活动记录这一块)

Q7:一些寄存器的题目,主要是寻址和内存管理等一些知识。

Q8:8086是多少尉的系统?在数据总线上是怎么实现的?

8086系统是16位系统,其数据总线是2()位

C++

一、请填写BOOL,float,指针变量与“零值”比较的if语句。(10分)

请写出BOOLflag与“零值”比较的if语句。(3分)

标准答案:

if(flag)

if(!flag)

如下写法均属不良风格,不得分。

if(flag==TRUE)

if(flag==1)

if(flag==FALSE)

if(flag==0)

请写出floatx与“零值”比较的if语句。(4分)

标准答案示例:

constfloatEPSINON=0.00001;

if((x>=-EPSINON)&&(x<=EPSINON)

不可将浮点变量用“=="或"!=”与数字

比较,应该设法转化成“>="或“<=”此

类形式。

如下是错误的写法,不得分。

if(x==0.0)

if(x!=0.0)

清写出char与“零值”比较的if语句。(3分)

标准答案:

if(p==NULL)

if(p!=NULL)

如下写法均属不良风格,不得分。

if(p==0)

if(p!=0)

if(P)

if(!)

二、以卜为WindowsNT卜的32位C++程序,请计算sizeof的值(1()分)

voidFunc(charstr[100])

(

请计算

sizeof(str)=4(2分)

)

charstr[]=4tHelloM;

char*p=str;

intn=10;

请计算

sizeof(str)=6(2分)

sizeof(p)=4(2分)

sizeof(n)=4(2分)

void*p=malloc(100);

请计算

sizeof(p)=4(2分)

三、简答题(25分)

1、头文件中的ifndef/define/endif干什么用?(5分)

答:防止该头文件被重复引用。

2、#include<filename.h>和#include“filename.h”有什么区别?(5分)

答:对于#include〈filename.h>,编译器从标准库路径开始搜索filename.h

对于#吊41曲“总招惘010上”,编译器从用户的工作路径开始搜索filename.h

3.const有什么用途?(请至少说明两种)(5分)

答:(1)可以定义const常量

(2)const可以修饰函数的参数、返回值,甚至函数的定义体。被consl修饰的东

西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。

4、在C++程序中调用被C编译器编译后的函数,为什么要加extern“C”?(5分)

答:C++语言支持函数重载,C语言不支持函数重载。函数被C++编译后在座中的名

与C语言的不同。假设某个函数的原型为:voidfoo(intx,inty);

该函数被C编译器编译后在库中的名字为_f。。,而C++编译器则会产生像

_foo_int_int之类的名字。

C++骗戒了C连接交换指定符号cxtcrn“C”来解决名字匹配问题。

5、请简述以下两个for循环的优缺点(5分)

for(i=0;i<N;i++)

(

if(condition)

DoSomethingO;

else

DoOtherthingO;

)

if(condition)

(

for(i=0;i<N;i++)

DoSomethingO;

)

else

(

for(i=0;i<N;i++)

DoOtherthingO;

1

优点:程序简洁

缺点:多执行了N-1次逻辑判断,并且

打断了循环"流水线''作业,使得编译

器不能对循环进行优化处理,降低了效

率。

优点:循环的效率高

缺点:程序不简洁

四、有关内存的思考题(每小题5分,共2()分)

voidGetMemory(char*p)

p=(char*)malloc(100);

voidTest(void)

char*str=NULL;

GelMemory(slr);

strcpy(str,"helloworld");

prinlf(str);

)

请问运行Test函数会有什么样的结果?

答:程序崩溃。

因为GetMemory并不能传递动态内存,

Test函数中的str一直都是NULL。

strcpy(str,"helloworld");将使程序崩

,贝O

char*GetMemory(void)

(

charp[]=''helloworld”;

returnp;

1

voidTest(void)

(

char*str=NULL;

str=GetMemoryO;

printf(str);

}

请问运行Tesi函数会有什么样的结果?

答:可能是乱码。

因为GetMemory返回的是指向“栈内存”

的指针,该指针的地址不是NULL,但其原

现的内容己经被清除,新内容不可知。

voidGetMemory2(char**p,intnum)

(

*p=(char*)malloc(num);

)

voidTest(void)

(

char*str=NULL;

GetMemory(&str,100);

strcpy(str,"hello");

printf(str);

)

请问运行Test函数会有什么样的结果?

答:

(1)能够输出hello

(2)内存泄漏

voidTest(void)

(

char*str=(char*)malloc(lOO);

str叩y(str,"hello");

free(str);

if(str!=NULL)

(

strcpy(str,"world");

printf(str);

1

)

请问运行Test函数会有什么样的结果?

答:篡改动态内存区的内容,后果难以预

料,非常危险。

因为free(str);之后,str成为野指针,

if(sir!=NULL)语句不起作用。

五、编写slrcpy函数(10分)

已知strcpy函数的原型是

char*strcpy(char*strDest,constchar*strSrc);

其中strDest是目的字符串,strSrc是源字符串。

(1)不调用C++/C的字符串库函数,请编写函数strcpy

char*strcpy(char*strDest,constchar*strSrc);

(

assert((strDest!=NULL)&&(strSrc!=NULL));〃2分

char*address=strDest;〃2分

while((*strDest++=*strSrc++)!='\0')〃2分

NULL;

returnaddress;〃2分

)

(2)strcpy能把strSrc的内容复制到strDest,为什么还要char*类型的返回值?

答:为了实现链式表达式。〃2分

例如intlength=strlen(strcpy(strDest,“helloworld"));

六、编写类Siring的构造函数、析构函数和赋值函数(25分)

已知类String的原型为:

classString

(

public:

String(constchar*str=NULL);//普通构造函数

String(constString&other);//拷贝构造函数

-String(void);//析构函数

String&operate=(constString&other);//赋值函数

private:

char*m_data;//用于保存字符串

};

请编写Siring的上述4个函数。

标准答案:

//String的析构函数

String::~String(void)//3分

(

delete[]m_data;

//由于m_data是内部数据类型,也可以写成deletem_data;

)

//String的普通构造函数

String::String(constchar*str)〃6分

(

if(str==NULL)

(

m_data=newchar[1];//若能加NULL判断则更好

*m_data='\0';

)

else

(

intlength=strlen(str);

m_data=newchar[lengths1];//若能加NULL判断则更好

strcpy(m_data,str);

)

}

//拷贝构造函数

String::String(constString&other)〃3分

(

intlength=strlen(other.m_data);

m_data=newchar[length+1];//若能加NULL判断则更好

strcpy(m_data,other.m_data);

)

//赋值函数

String&String::operate=(constString&other)〃13分

(

//(l)检查自赋值〃4分

if(this==&other)

return*this;

//(2)释放原有的内存资源〃3分

delete[]m_data;

//(3)分配新的内存资源,并复制内容〃3分

intlength=strlen(other.m_data);

m_data=newchar[length+l];//若能加NULL判断则更好

strcpy(m_data,other.m_data);

//(4)返回本对象的引用〃3分

return*this;

1

winsocket编程

#include<Winsock2.h>

#include<stdio.h>

voidmain()

(

WORDwVersionRcquestcd;

WSADATAwsaData;

interr;

wVersionRequested=MAKEWORD(1,1);

err=WSAStartup(wVersionRequested,&wsaData);

if(err!=0){

return;

1

if(LOBYTE(wsaData.wVersion)!=1||

HIBYTE(wsaData.wVersion)!=1){

WSACleanupO;

return;

}

SOCKETsockSrv=socket(AFJNET,SOCK_STREAM,0);

SOCKADDRJNaddrSrv;

addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);

addrSrv.sin_family=AF_INET;

addrSrv.sin_port=htons(6000);

bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));

listen(sockSrv,5);

SOCKADDR」NaddrClient;

intlen=sizeof(SOCKADDR);

while(l)

(

SOCKETsockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);

charsendBuf[100];

sprintCsendBuf/1Welcome%sto",

inet_ntoa(addrClieni.sin_addr));

send(sockConn,sendBuf,strlen(sendBuf)+1,0);

charrecvBufflOOl;

recv(sockConn,recvBuf);

printf(M%s\n",recvBuf);

closesocket(sockConn);

WSACleanupO;

1

)

注:这是Server端;File->New->Win32ConsoleApplication,工程名:TcpSrv;然后,

File->Ncw->C++SourceFile,文件名:TcpSrv;在该工程的Setting的Link的

Objcct/librarymodules项要加入ws2_32.lib

#include<Winsock2.h>

#include<stdio.h>

voidmain()

(

WORDwVersionRequested;

WSADATAwsaData;

inierr;

wVersionRequested=MAKEWORD(1,1);

err=WSAStartup(wVersionRequested,&wsaData);

if(err!=0){

return;

}

if(LOBYTE(wsaData.wVersion)!=1||

HIBYTE(wsaData.wVersion)!=1){

WSACleanupO;

return;

)

SOCKETsockClient=socket(AF_INET,SOCK_STREAM,0);

closesocket(sockClient);

WSACleanupO;

)

注:这是Client端;File->New->Win32ConsoleApplication,工程名:TcpClient;然

后,File->New->C++SourceFile,文件名:TcpClient;同理,在该工程的Setting的

Link的Objcct/librarymodules项要加入ws2_32.1ib

C++

#include<iostream.h>

classhuman

public:

human(){human_num4-+;};

staticinthuman_num;

〜human。{

human_num—;

print。;

)

voidprint()

(

cout«"humannumis:n«human_num«endl;

)

protected:

private:

};

inthuman::human_num=0;

humanfl(humanx)

(

x.print();

returnx;

I

intmain(intargc,char*argv[])

(

humanhl;

hl.print();

humanh2=fl(hl);

h2.print。;

return0;

)

输Hi:

0

0

-1

-2

分析:

humanhl;〃调用构造函数,一hum_num=1;

h1.print();〃输出:"humanis1"

humanh2=fl(hl);

〃再调用fl(hl)的过程中,由于函数参数是按值传递对象,调用默认的复制构造

函数,它并没有对hum_num++,所以hum_num仍=1,所以x.prinl。输出:"humanis1”;在

推出fl函数时,要销毁X,调用析构函数(human_num--),输出:"humanis0”(,由于该函数返

回一个human对象,所以又调用默认构造函数,创建一个临时对象(human_num=0;),把

临时对象赋给h2,又调用默认构造函数(human_num=0);

h2.print();〃输出:humanis0;

〃在退出main。函数是洗销毁h2,调用析构函数(human_num--),输出nhuman_numis-1"

然后销毁hl后用析构函数(-),输出"human_numis-2'

冒泡排序:

voidBubbleSort(elemtypex[],intn)

(

inti,j;

elemtypctemp;

for(i=l;i<n;i++)

for(j=0;j<n-i;j++)

{

if(xfj].key>xfj+l].key)

(

temp=x[j];

xUJ=xU+U;

x[j+ll=iemp;

)

)

)

c语言文件读写

#include"stdio.h"

main()

(

FILE*fp;

charch,filename!10];

scanf("%s",filename);

if((fp=fopen(filename/"w")==NULL)

(

printfC'cann'topenfile\n");

exit(0);

1

ch=getchar();

while(ch!='#')

(

fputc(ch?fp);

putchar(ch);

ch=getchar();

)

fciose(fp);

I

C指针

int*p[n];--指针数组,每个元素均为指向整型数据的指针。

int(*)pln];--p为指向一维数组的指针,这个一维数组有n个整型数据。

int*p();----------函数带回指针,指针指向返回的值。

int(*)p();------p为指向函数的指针。

Windows的消息机制1

Windows是一个消息(Message)驱动系统。Windows的消息提供了应用程序之间、应

用程序与Windows系统之间进行通信的于段。应用程序想要实现的功能由消息来触

发,并且靠对消息的响应和处理来完成。

Windows系统中有两种消息队列:系统消息队列和应用程序消息队列。计算机的所

有输入设备由Windows监控。当一个事件发生时,Windows先将输入的消息放入系统

消息队列中,再将消息拷贝到相应的应用程序消息队列中。应用程序的消息处理程序

将反复检测消息队列,并把检测到的每个消息发送到相应的窗口函数中。这便是一个

事件从发生至到达窗口函数必须经历的过程。

必须注意的是,消息并非是抢占性的,无论事件的缓急,总是按照到达的先后派

对,依次处理(一些系统消息除外),这样可能使一些实时外部事件得不到及时处理。

Windows的消息机制2

Windows中的消息是放在对应的进程的消息队列里的。可以通过GetMessage取得,并

且对于一般的消息,此函数返回非零值,但是对于WM_QUIT消息,返回零。可以通

过这个特征,结束程序。当取得消息之后,应该先转换消息,再分发消息。所谓转

换,就是把键盘码的转换,所谓分发,就是把消息分发给对应的窗口,由对应的窗口

处理消息,这样对应窗体的消息处理函数就会被调用。两个函数可以实现这两个功

能:TranslaleMessage和DispatchMessage<)

另外,需要注意,当我们点击窗口的关闭按钮关闭窗口时,程序并没有自动退出,面

是向程序发送了一个WM_DESTROY消息(其实过程是这样的,首先向程序发送

WM-CLOSE消息,默认的处理程序是调用DestroyWindow销毁窗体,从而引发

WM_DESTROY消息),此时在窗体中我们要响应这个消息,如果需要退出程序,那

么羲向程序发送WM_QUIT消息(通过PostQuitMcssagc实现)。

一个窗体如果想要调用自己的消息处理函数,可以使用SendMessage向自己发消息。

如上所述,大部分(注意是大部分)的消息是这样传递的:首先放到进程的消息队列

中,之后由GetMessage取出,转换后,分发给对应的窗口。这种消息成为存储式消

息。存储式消息基本上是使用者输入的结果,以击键(如WM_KEYDOWN和

WM_KEYUP讯息)、击键产生的字符(WMJ2HAR)、鼠标移动(WM_MOUSEMOVE)

和鼠标按钮(WM_LBUTTONDOWN)的形式给出。存储式消息还包含时钟消息

(WM_TIMER)、更新消息(W

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论