計算機專業面試題目_第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

提交評論