![Windows編程全套課件_第1頁](http://file4.renrendoc.com/view/567fe50ff24d32d2833197765c88649e/567fe50ff24d32d2833197765c88649e1.gif)
![Windows編程全套課件_第2頁](http://file4.renrendoc.com/view/567fe50ff24d32d2833197765c88649e/567fe50ff24d32d2833197765c88649e2.gif)
![Windows編程全套課件_第3頁](http://file4.renrendoc.com/view/567fe50ff24d32d2833197765c88649e/567fe50ff24d32d2833197765c88649e3.gif)
![Windows編程全套課件_第4頁](http://file4.renrendoc.com/view/567fe50ff24d32d2833197765c88649e/567fe50ff24d32d2833197765c88649e4.gif)
![Windows編程全套課件_第5頁](http://file4.renrendoc.com/view/567fe50ff24d32d2833197765c88649e/567fe50ff24d32d2833197765c88649e5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
Windows編程
第一章語言基礎(chǔ)知識C++的發(fā)展歷程C++是既適合于開發(fā)操作系統(tǒng),也適合于編寫應(yīng)用軟件。它是一種既面向?qū)ο笥置嫦蜻^程的混合型程序設(shè)計語言,它是在C語言的基礎(chǔ)之上發(fā)展起來的。開發(fā)語言的發(fā)展:匯編語言、C語言、C++語言、很多其它語言各種C++編譯系統(tǒng):Apple,Sun,Borland和Microsoft等C++語言的類庫:標準類庫、非標準類庫#include<iostream.h> //包含頭文件voidmain() //main函數(shù),程序入口,{
char
str_greet[]="Welcome!";//定義數(shù)組并初始化
cout<<str_greet<<endl;//在屏幕上輸出并換行}//同樣功能的C程序:#include<stdio.h>//包含頭文件voidmain() //main函數(shù),程序入口{
char
str_greet[]="Welcome!";//定義數(shù)組并初始化
printf("%s\n",str_greet);//在屏幕上輸出并換行}用C++編寫的程序和用C編寫的程序在程序結(jié)構(gòu)上基本是相同的,都是以main函數(shù)作為程序的入口;兩者都是以一對{}把函數(shù)中的語句括起來;兩者都是以分號作為語句的結(jié)束標志。但是,兩者也有一些不同之處,C++中是以iostream.h文件作為標準輸入輸出頭文件,C中是以stdio.h作為標準輸入輸出頭文件;C++中采用符號“<<”作為標準輸出,而不是通過printf函數(shù)來實現(xiàn)。通過上面的例子,可以看出,C++語言和C語言兩者之間既有緊密的聯(lián)系,又各有自己的特點。C++中提供了幾種復(fù)合數(shù)據(jù)類型,這些復(fù)合數(shù)據(jù)類型包括數(shù)組、結(jié)構(gòu)體、共用體、枚舉、類和用戶自定義類型。數(shù)組數(shù)組是具有統(tǒng)一數(shù)據(jù)類型的對象的集合。每一個單獨的對象并沒有名字,但是它們可以通過其在數(shù)據(jù)中的位置來確定。例如:下面的語句定義了一個名為Array的數(shù)組,該數(shù)組共有10個元素。程序中通過數(shù)據(jù)元素在數(shù)組中的索引值來訪問數(shù)組元素。
inti,Array[10];
//定義數(shù)組,注意,在
//數(shù)組中元素的下標是從0開始Array[2]=30;
//為數(shù)組元素賦值i=Array[2];
//讀取數(shù)組元素中的值,
//把它賦給變量i二維數(shù)組下面的語句定義了二維數(shù)組,該數(shù)組的第一維共有10個元素,第二維共有20個元素。intArray[10][20];在二維數(shù)組中第一個下標稱為行下標,第二個下標稱為列下標,上面定義的數(shù)組Array相當于是一個具有10行20列的矩陣。數(shù)組在定義時,系統(tǒng)將自動為它分配一塊連續(xù)的內(nèi)存空間。此時,數(shù)組名指向這塊空間的起始點,并且在程序中不可改變。也就是說,一個數(shù)組名相當于一個常量。結(jié)構(gòu)體在程序設(shè)計中,有時需要將某些相關(guān)的具有不同類型的數(shù)據(jù)組織到一個數(shù)據(jù)類型中。為此,C++中提供了這樣一種復(fù)合數(shù)據(jù)類型,它被稱為結(jié)構(gòu)體。定義一個結(jié)構(gòu)體類型的一般形式為:
struct結(jié)構(gòu)體名
{
成員表列;
};下面的語句中定義了一個有關(guān)學生的名為student的結(jié)構(gòu)體,它包括學生的學號、姓名、性別和年齡等不同數(shù)據(jù)類型的信息。structstudent{ intStuNo;
//學生學號
charStuName[20];
//學生姓名
charGender;
//學生性別
intAge;
//學生年齡};應(yīng)當注意:structstudent是程序設(shè)計者自己定義的類型名。它和系統(tǒng)已定義的標準類型(如int,char,float和double等)一樣可以用來作為定義變量的類型。定義了結(jié)構(gòu)體類型后,還必須定義該結(jié)構(gòu)體類型的變量,才能使用該結(jié)構(gòu)體。定義結(jié)構(gòu)體變量的方法有以下三種先定義結(jié)構(gòu)體類型再定義變量名(普遍使用)例如,上面已定義一個結(jié)構(gòu)體類型struct
student,可以用它來定義結(jié)構(gòu)體student的兩個變量stu1,stu2。structstudentstu1,stu2;變量stu1、stu2為structstudent類型變量,即它們具有structstudent類型的結(jié)構(gòu)。在定義類型的同時定義變量下面的語句在定義結(jié)構(gòu)體類型student的同時定義了stu1、stu2兩個變量。structstudent{ intStuNo; charStuName[20]; charGender; intAge;}stu1,stu2;直接定義結(jié)構(gòu)體變量下面的語句中直接定義了兩個結(jié)構(gòu)體變量stu1和stu2但沒有出現(xiàn)結(jié)構(gòu)體類型名。(很少使用)struct
//此處省略了結(jié)構(gòu)體名{ intStuNo; charStuName[20]; charGender; intAge;}stu1,stu2;結(jié)構(gòu)體成員可以嵌套,即結(jié)構(gòu)體可以包含另一個結(jié)構(gòu)體變量。共用體在程序設(shè)計中,有時需要使幾種不同類型的變量存放在同一內(nèi)存單元中。這種使幾種不同的數(shù)據(jù)類型的變量共占同一段內(nèi)存的結(jié)構(gòu),稱為“共用體”(有時也稱“聯(lián)合體”)類型的結(jié)構(gòu)。“共用體”類型變量的定義形式為:
union共用體名
{
成員列表;
};下面的語句中定義一個名為data的共用體,并定義了i和ch兩個data共用體的成員及u1和u2兩個共用體變量。
uniondata { inti; charch; };
datau1,u2;
可以看出,共用體和結(jié)構(gòu)體的定義相似。但它們的含義是不同的,二者區(qū)別:結(jié)構(gòu)體變量所占內(nèi)存長度是各成員占內(nèi)存長度之和。每個成員分別有其自己的內(nèi)存單元。共用體變量所占內(nèi)存等于最長成員的長度。枚舉如果一個變量只有幾種可能的值,可以定義為枚舉類型。枚舉是指將變量的值一一列舉出來,變量的值只限于在列舉出來的值的范圍內(nèi)。下面的語句定義一個名為color的枚舉類型,并定義了一個枚舉類型的變量My_color。enumcolor{Red,Green,Blue,Yellow};enumcolor
My_color;定義的枚舉變量My_color是枚舉變量,它的值只能是Red到Y(jié)ellow之一。例如:下面的語句給枚舉變量My_color賦值。My_color=Red;用戶自定義數(shù)據(jù)類型在C++中可以用typedef定義新的類型名來代替已有的類型名。用typedef來重新定義數(shù)據(jù)類型可以提高程序的可靠性和可移植性。習慣上常把typedef定義的類型名用大寫字母表示,以便與系統(tǒng)提供的標準類型標識符相區(qū)別。以下選自windef.htypedefunsignedlongDWORD;typedefint BOOL;typedefunsignedcharBYTE;typedefunsignedshortWORD;typedefstructtagPOINT{LONGx;LONGy;}POINT,*PPOINT;typedefstructtagRECT{LONGleft;LONGtop;LONGright;LONGbottom;}RECT,*PRECT;常量及其定義常量是指用以表達有固定數(shù)值或字符值的單詞符號,在程序中不允許修改。通過使用關(guān)鍵字const,將能使一個變量定義為一個常量。例如:下面的語句中定義了一個表示緩沖區(qū)大小的常量。
constintbufSize=1024;
上面這一語句將使bufSize被定義為一個符號常量并初始化為1024,如果在程序中試圖改變bufSize的值,則將引起一個錯誤。由于一個const類型的量一經(jīng)定義后就不能改變它的值,因此在定義時必須同時初始化。變量為了使不同的程序員設(shè)計的程序能構(gòu)很好地互相交流,在基于Windows的VC程序中廣泛采用匈牙利記法來標識變量。匈牙利表示法用小寫字母作為變量名的前綴,以說明變量的數(shù)據(jù)類型,其余部分描述該變量的意義與功能。例如:HANDLEhWnd;常用匈牙利表示法前綴的類型及其說明前綴類型說明chchar字符bBOOL布爾值n(I)int整數(shù)wWORD16位無符號數(shù)lLONG32位有符號數(shù)dwDWORD32位無符號數(shù)lpszLPTSTR指向字符串的32位指針hHANDLE窗口對象句柄指針與引用一個指針變量所存儲的信息是一個對象在內(nèi)存中的地址。通過指針,可以間接地訪問對象。每一個指針都有一個相應(yīng)的類型。該類型用以說明指針所指地址中存放的數(shù)據(jù)類型。一個指針所占的內(nèi)存空間大小與一個內(nèi)存地址所占空間相等。也就是說,一個int指針與一個double型指針占用同樣大小的內(nèi)存空間。在定義指針時,應(yīng)在指針變量名前冠以星號“*”。下面的語句定義一個整型變量,并用該整型變量的地址初始化一個指針變量。intStu_No=6002;int*ipStu_No=&Stu_No;
//使指針變量
//ipStu_No取得變量Stu_No的地址*ipStu_No=6003;//使用指針修改了變量
//Stu_No的值最常用的指針類型是char*。這是因為C++中,所有有關(guān)字符串的操作都是通過字符指針來完成的。
字符串常量的類型是一指向該字符串中第一個字符的字符指針。也就是說所有字符串常量都是類型char*的對象。程序員可以說明一個char*型的變量,并用一個字符串給它初始化。例如:下面就是一個定義字符串指針并加以初始化的例子。char*stExample=“Theexampleofstring!”;指針的運算指針可以讓它的地址值增加或減少一個整數(shù)值,這類指針操作被稱為指針的算術(shù)運算(pointerarithmetic),指針加2意味著給指針持有的地址值增加了該類型兩個對象的長度,例如假設(shè)一個char是一個字節(jié),一個int是4個字節(jié)。指向同一個數(shù)組的指針可以進行比較運算。voidmain(){
int
array[5]={1,2,3,4,5};
int*pArrayBegin=array;
int*pArrayEnd=array+5;
for(;pArrayBegin<pArrayEnd;pArrayBegin++){
cout<<*pArrayBegin<<"的地址是:";
cout<<pArrayBegin<<endl;}}某次運行的結(jié)果如下:1的地址是:0x0012FF6C2的地址是:0x0012FF703的地址是:0x0012FF744的地址是:0x0012FF78
的地址是:0x0012FF7CPressanykeytocontinue引用引用是變量的一個別名,當建立引用時,程序用另一個變量或?qū)ο蟮拿殖跏蓟?,對引用的改動,實際上是對目標的改動。引用類型是指對給定類型對象的引用。定義格式如下:
T&標識符=左值表達式它建立了標識符與左值表達式所標識的對象之間的映射關(guān)系,值得注意的是,對引用對象的定義必須初始化。下面的語句中定義了兩個引用類型合法定義
intvalue; int&Value1=value;//合法定義引用類型
//聲明value1是對整數(shù)的引用
//初始化為引用value非法的定義
int&Value2;
//非法定義引用類型一個引用類型通常被認為是另一變量的別名,在使用時當作某個對象的第二個名字。所有在引用變量上施加的操作實際上都作用到被引用變量的身上。例如:
inta; int&r1=a; int&r2=r1; r2=10;
//這里r2也引用對象a,對象a被更新為10函數(shù)一個程序可以分成一系列“單一功能模塊”的集合。在C++中,“單一功能模塊”就是函數(shù)。一個完整的C++程序一般包含一個主函數(shù)和若干個子函數(shù),主函數(shù)可以調(diào)用其它的子函數(shù),子函數(shù)之間也可以互相調(diào)用。函數(shù)定義的一般形式如下:
類型標識符函數(shù)名(形參列表)
{
函數(shù)體;
}在形參列表中,程序員必須指定每一個參數(shù)的數(shù)據(jù)類型。在調(diào)用函數(shù)時,大多數(shù)情況下,主調(diào)函數(shù)和被調(diào)函數(shù)之間有參數(shù)傳遞的關(guān)系。因此,程序中廣泛使用的函數(shù)還是有參數(shù)的函數(shù)。在有參數(shù)的函數(shù)中,在定義函數(shù)時的函數(shù)名后的括號中的變量名被稱為“形式參數(shù)”(簡稱“形參”),在調(diào)用函數(shù)時,函數(shù)名后面括號中的表達式稱為“實際參數(shù)”(簡稱“實參”)。struct
student
{
int
No;
char
Name[20];
int
Age;};bool
print1(student
st){
cout<<"學號:"<<st.No<<endl;
cout<<"姓名:"<<st.Name<<endl;
cout<<"年齡:"<<st.Age<<endl;
return
true;}bool
print2(student*st){
cout<<"學號:"<<(*st).No<<endl;
cout<<"姓名:"<<(*st).Name<<endl;
cout<<"年齡:"<<(*st).Age<<endl;
return
true;}bool
print3(student*st){
cout<<"學號:"<<st->No<<endl;
cout<<"姓名:"<<st->Name<<endl;
cout<<"年齡:"<<st->Age<<endl;
return
true;}bool
set(student&st){
cout<<"學號:"<<endl;cin>>st.No;
cout<<"姓名:"<<endl;cin>>st.Name;
cout<<"年齡:"<<endl;cin>>st.Age;
return
true;}void
add(int
x,int
y,int*z){ *z=x+y;}void
setname(struct
student*p,char*p1){
strcpy(p->Name,p1);}void
main(){
int
i=100,j=200,k=500,l=10;
int*p;
void(*p1)(int
x,int
y,int*z);
p=&k;
add(i,j,p);
p1=add;
p1(400,500,&l);
int
index;
struct
student
st[sum];
for(index=begin;index<sum;index++) {
cout<<"學號:"<<endl;cin>>st[index].No;
cout<<"姓名:"<<endl;cin>>st[index].Name;
cout<<"年齡:"<<endl;cin>>st[index].Age; }
for(index=begin;index<sum;index++) {
print1(st[index]); }
set(st[2]);
print2(&st[2]);
struct
student
st1,st2;
st1.Age=18;
st1.No=1;
strcpy(st1.Name,"nana");
struct
student*ps;
ps=&st2;
ps->Age=20;
ps->No=2;
setname(ps,"mingming");
print3(ps);
print3(&st1);}401VisualC++簡介是Windows環(huán)境下最主要的應(yīng)用開發(fā)系統(tǒng)之一是C++語言的集成開發(fā)環(huán)境與Win32緊密相連強大的調(diào)試功能為大型復(fù)雜軟件的開發(fā)提供了有效的排錯手段2可視化指軟件開發(fā)階段的可視化利用計算機圖形技術(shù)和方法一、VisualC++6.0簡介及開發(fā)環(huán)境的構(gòu)成413開發(fā)環(huán)境開發(fā)環(huán)境是程序員同VC++的交互界面通過它,可以創(chuàng)建工程文件訪問資源編輯器使用內(nèi)部調(diào)試器訪問程序源代碼424菜單簡介Edit菜單File菜單View菜單Insert菜單43Project菜單Build菜單Tools菜單Windows菜單44File->New->Files(1)VC++的菜單欄File菜單45File->New->Projects46斷點作用:中斷程序的執(zhí)行過程,以便檢查程序代碼、變量和寄存器值位置斷點數(shù)據(jù)斷點消息斷點用來設(shè)置刪除和查看斷點(a)Breakpoints選項(2)VC++的菜單欄Edit菜單47位置斷點通常在源代碼的指定行、函數(shù)的開始或指定的內(nèi)存地址處設(shè)置,當程序執(zhí)行到指定位置時,位置斷點將中斷程序的執(zhí)行在位置斷點中還可以設(shè)置斷點條件,此時必須先指定位置,然后再設(shè)置條件斷點數(shù)據(jù)斷點是在變量或表達式上設(shè)置,當變量或表達式的值改變時,數(shù)據(jù)斷點將中斷程序的執(zhí)行消息斷點是在窗口函數(shù)WndProc上設(shè)置,當接收到指定的消息時,消息斷點將中斷程序的執(zhí)行48(b)ListMembers選項利用此選項,可減輕輸入代碼的工作量。如在變量名之后鍵入“.”或“->”,系統(tǒng)就會自動顯示所有有效的成員名供選擇(c)TypeInfo選項
如果在源代碼中將鼠標指針停在某一變量或函數(shù)上,那么系統(tǒng)將顯示所指變量或函數(shù)等的語法提供有效的成員名49(d)ParameterInfo選項
當輸入代碼時,若在輸入函數(shù)名之后鍵入左括號,系統(tǒng)將顯示該函數(shù)的完整原型,并用黑體顯示其第一個參數(shù)。輸入第一個參數(shù)之后,接著就會出現(xiàn)第二個參數(shù),依此類推(e)CompleteWord選項
系統(tǒng)自動完成當前語句其余部分的輸入。如果不能自動完成,則給出適當?shù)奶崾据o助用戶完成50在View菜單中可以:改變窗口改變工具欄的顯示方式檢查源代碼激活調(diào)試等View->ClassWizard選項(a)ClassWizard選項(3)VC++的菜單欄View菜單51(a-1)ClassWizard中的MessageMaps選項卡為窗口、對話框、控件、菜單選項和加速鍵等對象映射消息創(chuàng)建或刪除消息處理函數(shù)查看消息處理函數(shù)的代碼52(a-2)MemberVariables選項卡:定義成員變量用于自動初始化其中:
ControlIDs是映射到成員變量的控件ID值
Type是成員變量的類型
Member是成員變量名53(a-3)Automation選項卡:
此選項卡主要將在創(chuàng)建新類時,添加自動化方法和屬性列出已經(jīng)添加到當前類中的方法和屬性的名稱Externalnames中的方法和屬性的實現(xiàn)方法54(a-4)ClassInfo選項卡:提供有關(guān)類的信息55(b)ResourceSymbols選項該選項將打開資源符號瀏覽器,從中可以瀏覽資源編輯符號資源編輯符號是映射到整數(shù)值上的一串字符,相當于資源的一個代號,在同一個程序中,資源編輯符號不能重復(fù)56(c)ResourceIncludes選項
該對話框包含資源符號頭文件名和預(yù)處理指令。57(d)Workspace選項
如果工作區(qū)沒有顯示或者不是處于當前狀態(tài),則選擇該項將顯示工作區(qū)窗口。(e)Output選項
在輸出窗口中顯示程序建立過程(如編譯、鏈接等)的有關(guān)信息或錯誤信息,并且顯示調(diào)試運行時的輸出結(jié)果。58(a)NewClass選項該選項用來創(chuàng)建新類并添加到項目中(4)VC++的菜單欄Insert菜單59(b)NewForm選項該選項用來創(chuàng)建新的表單并添加到項目中(c)Resource選項該選項將打開InsertResource對話框,用以創(chuàng)建新的資源或插入資源文件中(d)ResourceCopy選項要選中該選項必須先選中某個資源,否則呈灰色。該選項用于復(fù)制選定的資源60(e)NewATLObject選項該選項將啟動ATLObjectWizard,以便添加新的ATL對象61使用Project可以創(chuàng)建、修改和存儲正在編輯的工程文件
工程文件組合了一個應(yīng)用程序的所有源文件的組成部分。工程文件包含在擴展名為.MAK的文件中。(5)VC++的菜單欄Project菜單62(b)AddToProject選項
選擇該選項將打開一個級聯(lián)子菜單通過級連子菜單,可以把文件、文件夾、數(shù)據(jù)鏈接以及VC組件或控件添加到當前工程文件中在該子菜單中可以進行如下操作:(1)New:創(chuàng)建新的文件;(2)NewFolder:插入新的文件夾;(3)Files:插入已有文件;(4)DataConnection:添加數(shù)據(jù)鏈接;(5)ComponentandControls:通過該項將可以插入VC組件或者已注冊的ActiveX控件。插入時相當于插入相關(guān)的頭文件(.h文件)和實現(xiàn)文件(.cpp文件),并且更新工作區(qū)窗口的信息。(a)SetActiveProject選項設(shè)定指定的項目為工作區(qū)的活動項目63(c)Settings選項選擇該選項將彈出ProjectSettings對話框,其中General選項卡用來設(shè)置基礎(chǔ)類用法和目錄指出應(yīng)用程序與MFC的鏈接方式指出所建立的應(yīng)用程序的缺省位置為Debug目錄輸出文件的位置64Build菜單用于編譯、建立和執(zhí)行應(yīng)用程序(b)Build選項對最后修改過的源文件進行編譯和鏈接(a)Compile選項只編譯當前文件而不調(diào)用鏈接器或其它工具。輸出窗口將顯示編譯過程檢查出的錯誤或警告信息,在錯誤信息處單擊鼠標右鍵,可以得到錯誤代碼的位置(c)
RebuildAll選項該選項允許用戶編譯所有的源文件,而不管它們何時曾經(jīng)被修改過(6)VC++的菜單欄Build菜單65(d)BatchBuild選項
該選項能單步重新建立多個工程文件,并允許用戶指定要建立的項目類型Win32Release(發(fā)行版)、Win32Debug(調(diào)試版)。VC提供了兩種應(yīng)用程序類型66(e)
StartDebug選項從當前語句開始執(zhí)行程序直到遇到斷點或遇到程序結(jié)束單步執(zhí)行程序,并在遇到函數(shù)調(diào)用時進入函數(shù)內(nèi)部再從頭單步執(zhí)行使程序在運行到當前光標所在位置時停止(相當于設(shè)置一個臨時斷點)調(diào)試過程中直接進入到正在運行的進程中67(a)SourceBrowse選項
編譯器在建立項目時會創(chuàng)建與項目中每一程序文件信息有關(guān)的.SBR文件。BSCMAKE程序?qū)⑦@些.SBR文件匯編為單個瀏覽信息數(shù)據(jù)庫
選擇SourceBrowse將彈出瀏覽窗口,它顯示與程序中所有符號(類、函數(shù)、數(shù)據(jù)、宏和類型)有關(guān)的信息Tools菜單允許用戶快速地訪問多個不同的開發(fā)工具(7)VC++的菜單欄Tools菜單68(b)VisualComponentManager選項
該工具可以在某個工程中組織、尋找和插入相關(guān)組件,而且還可以識別已存在的且可利用的對象。選擇該選項將彈出如圖所示的窗口69在工作區(qū)中添加項目:
用File->Open選項可打開已存在的項目;通過New對話框的Projects選項卡創(chuàng)建新的項目,并選擇Addtocurrentworkspace復(fù)選框。
VC以項目工作區(qū)的形式來組織文件、項目和項目配置1.創(chuàng)建新的項目工作區(qū)創(chuàng)建新的空工作區(qū)步驟:(a)File->New->Workspaces->輸入工作區(qū)名字并指定工作區(qū)目錄二、項目與項目工作區(qū)702.項目工作區(qū)窗口簡介
VC項目工作區(qū)由ClassView、ResourceView及FileView三個面板組成71在VC中,源代碼或資源編輯器為了引用資源和用戶自定義的其它對象,于是就引入了一種與資源一一對應(yīng)的符號即資源符號,使之能夠以字符串的方式被引用。
資源符號是映射到整數(shù)值上的一串字符,是一種標識符。每當創(chuàng)建一個新的資源或資源對象時,系統(tǒng)就會為其提供一個缺省的資源符號名稱并賦一個整數(shù)值,該定義保存在resource.h文件中。資源圖標光標菜單位圖對話框資源是一種界面元素,用戶可以從中獲得信息并在其中執(zhí)行某個動作三、資源及資源編輯器72單擊New按鈕新建資源符號輸入新資源符號的名稱由于資源符號不能重復(fù),因此應(yīng)按照一種標準來定義資源符號進行符號定義View->ResourceSymbols(1)資源的建立73資源符號的取值范圍一般為0~32767(2)資源符號定義的常用前綴
74程序調(diào)試工具包括源程序語法檢查、可執(zhí)行程序修改和運行監(jiān)視等應(yīng)用程序Help和Setup開發(fā)工具包系統(tǒng)函數(shù)庫和系統(tǒng)函數(shù)開發(fā)工具資源管理器包括圖形化窗口及組成元素的多種對象的編輯器可選擇并構(gòu)成具體語句或源程序結(jié)構(gòu)的例程庫及Help源程序編輯器和編譯器可視化開發(fā)系統(tǒng)集成了一系列系統(tǒng)可用資源和開發(fā)工具一、Windows編程基礎(chǔ)75采用交互式方法時,可視化開發(fā)平臺給出了許多選用的對象,程序員可選擇所需對象并確定其屬性,由此搭建起應(yīng)用程序的“大框架”,并可根據(jù)需要進一步編寫必要的細節(jié)代碼段,最后構(gòu)成完整的應(yīng)用程序Windows的程序設(shè)計語言VCVBVJ都是“面向?qū)ο蟆钡某绦蛟O(shè)計語言對象是Windows的規(guī)范部件窗口菜單按鈕對話框程序模塊編寫Windows程序相當一部分工作是在創(chuàng)建對象和為對象屬性賦值對象特征:具有規(guī)范形態(tài)和操作模式編程方法傳統(tǒng)編寫法-->API交互式方法-->MFC76APIAPI函數(shù)的功能為應(yīng)用程序提供Windows系統(tǒng)特殊函數(shù)及數(shù)據(jù)結(jié)構(gòu)Win應(yīng)用程序可以利用標準大量API函數(shù)調(diào)用系統(tǒng)功能是Win系統(tǒng)與Win應(yīng)用程序間的標準程序接口窗口管理函數(shù)實現(xiàn)窗口的創(chuàng)建、移動和修改功能系統(tǒng)服務(wù)函數(shù):實現(xiàn)與操作系統(tǒng)有關(guān)的多種功能圖形設(shè)備(GDI)函數(shù):實現(xiàn)與設(shè)備無關(guān)的圖形操作功能77
利用Windows
API函數(shù)編寫Windows應(yīng)用程序必須首先了解以下內(nèi)容:(1)窗口的概念(2)事件驅(qū)動的概念(3)句柄(4)消息78(1)窗口 一個應(yīng)用程序的窗口一般包含下列成分:窗口邊界工作區(qū)控制菜單框下拉菜單水平滾動條垂直滾動條最大化按鈕最小化按鈕標題欄79編寫一個Windows應(yīng)用程序首先應(yīng)創(chuàng)建一個或多個窗口,隨后應(yīng)用程序的運行過程即是窗口內(nèi)部、窗口與窗口之間、窗口與系統(tǒng)之間進行數(shù)據(jù)處理與數(shù)據(jù)交換的過程。應(yīng)用程序與用戶之間交互的接口環(huán)境系統(tǒng)管理應(yīng)用程序的基本單位Win應(yīng)用程序基本的操作單元80Windows程序設(shè)計是針對事件或消息的處理進行
消息是描述事件發(fā)生的信息(如按下鼠標或鍵盤)事件驅(qū)動編程方法對于編寫交互式程序很有用處,它避免了死板的操作模式Windows程序的執(zhí)行順序取決于事件發(fā)生的順序,程序的執(zhí)行順序是由順序產(chǎn)生的消息驅(qū)動的,但是消息的產(chǎn)生往往并不要求有次序之分。(2)事件驅(qū)動
81常用句柄類型及其說明句柄是一個4字節(jié)長的數(shù)值,用于標識應(yīng)用程序中不同的對象和同類對象中不同的實例窗口按鈕圖標滾動條輸出設(shè)備控制文件(3)句柄應(yīng)用程序通過句柄訪問相應(yīng)的對象信息HWND 窗口句柄 HDC 設(shè)備環(huán)境句柄HBITMAP 位圖句柄 HCURSOR 光標句柄HICON 圖標句柄 HFONT 字體句柄HMENU 菜單句柄 HPEN 畫筆句柄HFILE 文件句柄 HBRUSH 畫刷句柄
HINSTANCE 當前實例句柄82
Windows應(yīng)用程序利用Windows消息(Message)與應(yīng)用程序及系統(tǒng)進行信息交換。typedefstructtagMSG
{HWNDhwnd; 窗口句柄,為null,則可檢索所有駐留在消息隊列中的消息
UINTmessage;消息值,由Windows.h頭文件中的宏定義來標識
WPARAMwParam;包含有關(guān)消息的附加信息,不同消息其值有所不同
LPARAMlParam;
DWORDtime;指定消息送至隊列的時間
POINTpt;指定消息發(fā)送時屏幕光標的位置,其數(shù)據(jù)類型POINT也是一個結(jié)構(gòu)體}MSG;消息號:由事先定義好的消息名標識字參數(shù)(wParam):用于提供消息的附加信息長字參數(shù)(lParam):用于提供消息的附加信息消息附加信息與具體消息號的值有關(guān),在Win中消息用結(jié)構(gòu)體MSG表示typedefstructtagPOINT{LONGx;
LONGy;}POINT;(4)消息83(4)消息
VC中存在幾種系統(tǒng)定義的消息分類,不同的前綴符號經(jīng)常用于消息宏識別消息附屬的分類,系統(tǒng)定義的消息宏前綴如下:BM 表示按鈕控制消息CB 表示組合框控制消息DM 表示默認下壓式按鈕控制消息EM 表示編輯控制消息LB 表示列表框控制消息SBM 表示滾動條控制消息WM 表示窗口消息窗口管理消息初始化消息輸入消息系統(tǒng)消息剪貼板消息控制處理消息控制通知消息滾動條通知消息非用戶區(qū)消息MDI消息DDE消息應(yīng)用程序自定義的消息Windows編程常用消息84二、Windows應(yīng)用程序常用消息1.WM_LBUTTONDOWN:產(chǎn)生單擊鼠標左鍵的消息此外,相似的消息還有:WM_LBUTTONUP:放開鼠標左鍵時產(chǎn)生;WM_RBUTTONDOWN:單擊鼠標右鍵時產(chǎn)生;WM_RBUTTONUP:放開鼠標右鍵時產(chǎn)生;WM_LBUTTONDBLCLK:雙擊鼠標左鍵時產(chǎn)生;WM_RBUTTONDBLCLK:雙擊鼠標右鍵時產(chǎn)生。1Param高字節(jié)包含當前光標的Y坐標值低字節(jié)包含當前光標的X坐標值wParam包含一整數(shù)值以標識鼠標鍵的按下狀態(tài)MK_LBUTTON 按下鼠標左鍵MK_MBUTTON 按下鼠標中鍵MK_RBUTTON 按下鼠標右鍵852.WM_KEYDOWN:按下一個非系統(tǒng)鍵時產(chǎn)生的消息
系統(tǒng)鍵是指實現(xiàn)系統(tǒng)操作的組合鍵,例如Alt與某個功能鍵的組合以實現(xiàn)系統(tǒng)菜單操作等。3.WM_CHAR:按下一個非系統(tǒng)鍵時產(chǎn)生的消息wParam為按鍵的ASCII碼1Param與WM_KEYDOWN的相同wParam:按下鍵的虛擬鍵碼,用以標識按下或釋放的鍵1Param:記錄了按鍵的重復(fù)次數(shù)、掃描碼、轉(zhuǎn)移代碼、先前鍵的狀態(tài)等信息。相似的消息還有WM_KEYUP,在放開非系統(tǒng)鍵時產(chǎn)生如F1的虛擬鍵碼在Windows.h文件中定義為VK_F186系統(tǒng)鍵的消息經(jīng)常由與Alt相組合的按鍵產(chǎn)生,這些按鍵啟動程序菜單或者系統(tǒng)菜單上的選項,或者用于切換活動窗口等系統(tǒng)功能(Alt-Tab或者Alt-Esc),也可以用作系統(tǒng)菜單加速鍵(Alt鍵與一個功能鍵相結(jié)合,例如Alt-F4用于關(guān)閉應(yīng)用程序)。應(yīng)用程序通常忽略這些消息,并將它們傳送到DefWindowProc。由于Windows要處理所有Alt鍵的功能,一般無需攔截這些消息。87這里特別提醒要注意WM_KEYDOWN,WM_KEYUP與WM_CHAR消息在使用上是有區(qū)別的。在前兩個消息中,伴隨消息傳遞的是按鍵的虛擬鍵碼,所以這兩個消息可以處理非打印字符,如方向鍵,功能鍵等。而伴隨WM_CHAR消息的參數(shù)是所按的鍵的ASCII碼,ASCII碼是可以區(qū)分字母的大小寫的。而虛擬鍵碼是不能區(qū)分大小寫的。884.WM_CREATE:由CreateWindow函數(shù)發(fā)出的消息wParam:未用1Param:包含一個指向CREATESTRUCT數(shù)據(jù)結(jié)構(gòu)的指針5.WM_CLOSE:關(guān)閉窗口時產(chǎn)生的消息wParam和1Param均未用。6.WM_DESTROY:由DestroyWiodow函數(shù)發(fā)出的消息wParam和1Param均未用。897.WM_QUIT:由PostQuitMessage函數(shù)發(fā)出的消息退出應(yīng)用程序時發(fā)出的消息wParam:含退出代碼,標識程序退出運行時的有關(guān)信息1Param:未用8.WM_PAINT用戶區(qū)移動或顯示用戶窗口改變大小程序通過滾動條滾動窗口下拉式菜單關(guān)閉并需要恢復(fù)被覆蓋的部分Windows清除對話框等對象,并需要恢復(fù)被覆蓋的部分均產(chǎn)生WM_PAINT消息909.WM_MOVE,WM_SIZE
當窗口移動的時候產(chǎn)生WM_MOVE消息,窗口的大小改變的時候產(chǎn)生WM_SIZE消息。
91三、Windows中的事件驅(qū)動程序設(shè)計啟動輸入姓名輸入第一次測試成績輸入第二次測試成績輸入第三次測試成績計算平均成績結(jié)束過程驅(qū)動方法計算平均成績啟動消息處理結(jié)束輸入姓名輸入第一次成績輸入第二次成績輸入第三次成績計算平均成績事件驅(qū)動方法計算平均成績92四、Windows應(yīng)用程序組成及編程步驟
1.
應(yīng)用程序的組成一個完整的Windows應(yīng)用程序通常由五種類型的文件組成。1.C語言源程序文件2.頭文件 3.模塊定義文件 4.資源描述文件 5.項目文件 932.源程序組成結(jié)構(gòu)入口函數(shù)WinMain窗口函數(shù)WndProcWindows應(yīng)用程序構(gòu)成基本框架包含各種數(shù)據(jù)類型、數(shù)據(jù)結(jié)構(gòu)與函數(shù)等1.所有應(yīng)用程序的入口,類似Main函數(shù),2.完成一系列的定義和初始化,并產(chǎn)生消息循環(huán)WinMain和WinProc是Windows應(yīng)用程序的主體94(1)WinMain函數(shù)三個基本的組成部分:函數(shù)說明、初始化和消息循環(huán)功能注冊窗口類,建立窗口及執(zhí)行必要的初始化進入消息循環(huán),據(jù)接受的消息調(diào)用相應(yīng)的處理過程當消息循環(huán)檢索到WM_QUIT時終止程序運行WinMain函數(shù)WinMain函數(shù)說明WinMain函數(shù)的說明如下:intWINAPIWinMain(
HINSTANCEhThisInst, ∥應(yīng)用程序當前實例句柄
HINSTANCehPrevInst, ∥應(yīng)用程序其他實例句柄
LPSTRlpszCmdLine, ∥指向程序命令行參數(shù)的指針
IntnCmdShow ∥應(yīng)用程序開始執(zhí)行時窗口顯示方式的整數(shù)值標識)注意!Win是多任務(wù)管理的,同一應(yīng)用程序的多個窗口可能會同時存在,系統(tǒng)對每個窗口的執(zhí)行稱為一個實例,并用一個實例句柄來唯一標識95(2)初始化(a)窗口類定義
通過給窗口類數(shù)據(jù)結(jié)構(gòu)WNDCLASS賦值完成,該數(shù)據(jù)結(jié)構(gòu)中包含窗口類的各種屬性。窗口類定義常用以下函數(shù):LoadIcon的作用是在應(yīng)用程序中加載一個窗口圖標。其原型為:HICONLoadIcon(HINSTANCEhInstance,LPCTSTRlpIconName)圖標資源名或系統(tǒng)預(yù)定義圖標標識名圖標資源所在的模塊句柄,NULL則使用系統(tǒng)預(yù)定義圖標初始化顯示窗口創(chuàng)建窗口實例窗口類的注冊:窗口類必須先注冊后使用窗口類的定義:定義窗口的形式與功能LoadIconLoadCursorGetStockObjectRegisterClassCreateWindow
ShowWindow,UpdateWindow96LoadCursor的作用是在應(yīng)用程序中加載一個窗口光標HCURSORLoadCursor(HINSTANCEhInstance, LPCTSTRlpCursorName)光標資源所在的模塊句柄,NULL則使用系統(tǒng)預(yù)定義光標光標資源名或系統(tǒng)預(yù)定義光標標識名應(yīng)用程序調(diào)用函數(shù)GetStockObject獲取系統(tǒng)提供的背景刷HBRUSHGetStockObject(intnBrush);97(b)注冊窗口類Win系統(tǒng)本身提供部分預(yù)定義的窗口類,程序員也可以自定義窗口類,窗口類必須先注冊后使用。窗口類的注冊由函數(shù)RegisterClass()實現(xiàn)。
RegisterClass(&wndclass);//wndclass為窗口類結(jié)構(gòu)
RegisterClass函數(shù)的返回為布爾值,注冊成功則返回真98(c)創(chuàng)建窗口實例創(chuàng)建一個窗口類的實例由函數(shù)CreateWindow()實現(xiàn)函數(shù)原型如下:HWNDCreateWindow(
LPCTSTRlpszClassName,∥窗口類名
LPCTSTRlpszTitle, ∥窗口標題名
DWORDdwStyle, ∥創(chuàng)建窗口的樣式
intx,y, ∥窗口左上角坐標
intnWidth,nHeight, ∥窗口寬度和度高
HWNDhwndParent, ∥該窗口的父窗口句柄
HWENUhMenu, ∥窗口主菜單句柄
HINSTANCEhInstance,∥創(chuàng)建窗口的應(yīng)用程序當前句柄
LPVOIDlpParam ∥指向一個傳遞給窗口的參數(shù)值的指針
)99100(d)顯示窗口窗口類的顯示由ShowWindow和UpdateWindow函數(shù)實現(xiàn)。應(yīng)用程序調(diào)用ShowWindow函數(shù)在屏幕上顯示窗口ShowWindow(hwnd,nCmdshow);//nCmdshow為窗口顯示形式標識顯示窗口后,應(yīng)用程序調(diào)用UpdateWindow更新并繪制用戶區(qū),并發(fā)出WM_PAINT消息。
UpdateWindow(hwnd);101(3)消息循環(huán)消息循環(huán)的常見格式如下:MSGMsg;…while(GetMessage(&Msg,NULL,0,0)){
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}將消息的虛擬鍵轉(zhuǎn)換為字符信息將消息傳送到指定窗口函數(shù)從消息隊列中讀取一條消息,并將消息放在MSG結(jié)構(gòu)中
其中函數(shù)GetMessage形式為:GetMessage(lpMSG, //指向MSG結(jié)構(gòu)的指針
hwnd,
nMsgFilteMin,//用于消息過濾的最小消息號值
nMsgFilterMax//用于消息過濾的最大消息號值)返回零值,即檢索到WM_QUIT消息,程序結(jié)束循環(huán)并退出將消息傳遞給窗口函數(shù)的相應(yīng)過程處理消息隊列Windows將產(chǎn)生的消息WinMain函數(shù)1022.窗口函數(shù)WinProcWinProc函數(shù)由一個或多個switch語句組成。每一條case語句對應(yīng)一種消息,當應(yīng)用程序接收到一個消息時,相應(yīng)的case語句被激活并執(zhí)行相應(yīng)的響應(yīng)程序模塊。WinProc包含了對各種可能接收到的消息的處理過程定義了應(yīng)用程序?qū)邮盏降牟煌⒌捻憫?yīng)103窗口函數(shù)的一般形式如下:LRESULTCALLBACKWndProc( HWNDhwnd,UINTmessgae,WPARAMwParam,LPARAMlParam){…∥message為標識的消息
switch(message)
{
case… …break;…
caseWM_DESTROY:
PostQuitMessage(0);
default:returnDefWindowProc(hwnd,message,wParam,lParam);
}return(0);}
在消息處理程序段中一般都有對WM_DESTROY的處理,該消息是關(guān)閉窗口時發(fā)出的。它向應(yīng)用程序發(fā)出WM_QUIT消息,請求退出處理函數(shù):
voidPostQuitMessage(intnExitCode)
//nExitCode為應(yīng)用程序的退出代碼為未定義處理過程的消息提供缺省處理1043.數(shù)據(jù)類型
在Windows.h中定義了Windows
應(yīng)用程序中包含種類繁多的數(shù)據(jù)類型1054.一些重要的數(shù)據(jù)結(jié)構(gòu)MSG:包含一個消息的全部信息,是消息發(fā)送的格式WINDCLASS:包含一個窗口類的全部信息及屬性POINT:定義了屏幕上或窗口中的一個點的X和Y坐標RECT:定義了一個矩形區(qū)域及其左上角和右下角的坐標幾種重要的結(jié)構(gòu)106五、應(yīng)用程序舉例【例2-1】創(chuàng)建應(yīng)用程序框架。本例的目的在于說明創(chuàng)建Windows應(yīng)用程序的方法及過程#include<windows.h> //包含應(yīng)用程序中所需的數(shù)據(jù)類型和數(shù)據(jù)結(jié)構(gòu)的定義LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);//窗口函數(shù)說明//以下初始化窗口類intWINAPIWinMain(HINSTANCEhInstance, HINSTANCEhPrevInst,LPSTRlpszCmdLine,intnCmdShow){
HWNDhwnd;
MSGMsg;
WNDCLASSwndclass;
charlpszClassName[]="窗口"; //窗口類名
charlpszTitle[]="My_Windows"; //窗口標題名107
//窗口類的定義wndclass.style=0; //窗口類型為缺省類型wndclass.lpfnWndProc=WndProc; //定義窗口處理函數(shù)wndclass.cbClsExtra=0; //窗口類無擴展wndclass.cbWndExtra=0; //窗口實例無擴展wndclass.hInstance=hInstance; //當前實例句柄wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION); //窗口的最小化圖標為缺省圖標wndclass.hCursor=LoadCursor(NULL,IDC_ARROW); //窗口采用箭頭光標wndclass.hbrBackground=GetStockObject(WHITE_BRUSH); //窗口背景為白色wndclass.lpszMenuName=NULL; //窗口中無菜單wndclass.lpszClassName=lpszClassName; //窗口類名為"窗口"108
//以下進行窗口類的注冊if(!RegisterClass(&wndclass))//如果注冊失敗則發(fā)出警告
{
MessageBeep(0);
returnFALSE;
}//創(chuàng)建窗口
hwnd=CreateWindow (
lpszClassName, //窗口類名
lpszTitle, //窗口實例的標題名
WS_OVERLAPPEDWINDOW, //窗口的風格
CW_USEDEFAULT, CW_USEDEFAULT, //窗口左上角坐標為缺省值
CW_USEDEFAULT, CW_USEDEFAULT,, //窗口的高和寬為缺省值
NULL, //此窗口無父窗口
NULL, //此窗口無主菜單
hInstance, //創(chuàng)建此窗口的應(yīng)用程序的當前句柄
NULL //不使用該值
);109//顯示窗口ShowWindow(hwnd,nCmdShow);//繪制用戶區(qū)UpdateWindow(hwnd);//消息循環(huán)
while(GetMessage(&Msg,NULL,0,0)){
TranslateMessage(&Msg);
DispatchMessage(&Msg);}returnMsg.wParam;//消息循環(huán)結(jié)束即程序終止時將信息返回系統(tǒng)}110/窗口函數(shù)LRESULTCALLBACKWndProc( HWNDhwnd, UINTmessage, WPARAMwParam, LPARAMlParam){switch(message){
caseWM_DESTROY: PostQuitMessage(0);
default: //缺省時采用系統(tǒng)消息缺省處理函數(shù)
returnDefWindowProc(hwnd,message,wParam,lParam);
}return(0);}調(diào)用PostQuitMessage發(fā)出WM_QUIT消息1111121.程序初始化過程中調(diào)用CreateWindow,為程序建立了一個窗口,做為程序的舞臺。CreateWindow產(chǎn)生窗口之后會送出WM_CREATE直接給窗口函數(shù),后者于是可以在此時機做些初始化動作(例如配置內(nèi)存、打開文件、讀初始數(shù)據(jù)...)。2.程序活著的過程中,不斷以GetMessage從消息隊列中抓取消息。如果這個消息是WM_QUIT,GetMessage會傳回0而結(jié)束while循環(huán),進而結(jié)束整個程序。1133.DispatchMessage透過WindowsUSER模塊的協(xié)助與監(jiān)督,把消息分派至窗口消息。消息將在該處被判別并處理。4.程序不斷進行2.和3.的動作。5.當使用者按下系統(tǒng)菜單中的Close命令項,系統(tǒng)送出WM_CLOSE。通常程序的窗口函數(shù)不攔截此消息,于是DefWindowProc處理它。6.DefWindowProc收到WM_CLOSE后,調(diào)用DestroyWindow把窗口清除。1.GDI的一些基本概念
設(shè)備描述表即為設(shè)備環(huán)境的屬性的集合應(yīng)用程序與輸出設(shè)備之間的橋梁Win系統(tǒng)外設(shè)直接訪問不允許統(tǒng)一的設(shè)備環(huán)境(DC)提供使應(yīng)用程序與設(shè)備相連用戶為確保圖形輸出的設(shè)備無關(guān)性應(yīng)用程序設(shè)備描述表及其屬性通過設(shè)備描述表的句柄來間接地存取應(yīng)用程序每一次圖形操作均參照設(shè)備描述表中的屬性執(zhí)行2.圖形刷新圖形刷新是繪圖過程中必須考慮的重要問題刷新請求對刷新請求的響應(yīng)刷新方法包括(1)刷新請求
應(yīng)用程序在窗口中繪制了一個橢圓,顏色列表框覆蓋了橢圓的一部分關(guān)閉顏色選框后,應(yīng)用程序需要恢復(fù)被覆蓋部分的顏色和形狀窗口大小的調(diào)整窗口移動被覆蓋后的恢復(fù)(2)系統(tǒng)對刷新請求的響應(yīng)
當用戶區(qū)的內(nèi)容需要刷新時,系統(tǒng)向應(yīng)用程序消息隊列發(fā)送WM_PAINT消息,系統(tǒng)在應(yīng)用程序的消息隊列中加入該消息,以通知窗口函數(shù)執(zhí)行刷新處理三種刷新窗口移動后的刷新被覆蓋區(qū)域的刷新對象穿越后的刷新(系統(tǒng)自動完成)用戶區(qū)移動或顯示用戶窗口大小改變程序通過滾動條滾動窗口窗口被另一個窗口覆蓋的恢復(fù)如下拉式菜單關(guān)閉等光標穿過用戶區(qū)圖標拖過用戶區(qū)窗口被另一個窗口覆蓋的區(qū)域稱為無效區(qū)域。系統(tǒng)為每個窗口建立了一個PAINTSTRUCT結(jié)構(gòu),該結(jié)構(gòu)中包含了包圍無效區(qū)域的一個最小矩形的結(jié)構(gòu)RECT,應(yīng)用程序可以根據(jù)這個無效矩形執(zhí)行刷新操作。TypedefstructtagPAINTSTRUCT{HDChdc; //設(shè)備環(huán)境句柄
BOOLfErase; //一般取真值,表示擦除無效矩形的背景
RECTrcPaint; //無效矩形標識
BOOLfRestore; //系統(tǒng)保留
BOOLfIncUpdate; //系統(tǒng)保留
BYTErgbReserved[16];//系統(tǒng)保留
}PAINTSTRUCT;rcPaint為標準的RECT數(shù)據(jù)結(jié)構(gòu),其作用是標識無效矩形,它包含了無效矩形的左上角和右下角的坐標常用的Windows應(yīng)用程序刷新窗口的方法保存副本。刷新時將副本拷貝到相應(yīng)的窗口中記錄事件。刷新時重新執(zhí)行這個曾經(jīng)發(fā)生的事件重新繪制。將圖形繪制處理程序放在消息WM_PAINT響應(yīng)模塊中,刷新時重繪圖形(3)有效的刷新方法3.獲取設(shè)備環(huán)境的方法獲取設(shè)備環(huán)境是應(yīng)用程序輸出圖形的先決條件,常用的兩種方法是調(diào)用函數(shù)BeginPaint或GetDC(1)調(diào)用BeginPaint函數(shù)應(yīng)用程序響應(yīng)WM_PAINT消息進行圖形刷新時,主要通過調(diào)用BeginPaint函數(shù)獲取設(shè)備環(huán)境
hdc=BeginPaint(hwnd,&ps);//ps為PAINTSTRUCT類型結(jié)構(gòu)定義方式為:PAINTSTRUCTps;
系統(tǒng)獲取設(shè)備環(huán)境的同時填寫ps結(jié)構(gòu),以標識無效矩形區(qū)由BeginPaint函數(shù)獲取的設(shè)備環(huán)境要用EndPaint函數(shù)釋放voidEndPaint(HWNDhwnd,PAINTSTRUCT&ps)(2)調(diào)用GetDC函數(shù)
如果繪圖工作并非由WM_PAINT消息驅(qū)動,則調(diào)用GetDC函數(shù)獲取設(shè)備環(huán)境。hdc=GetDC(hwnd);
由GetDC函數(shù)獲取的設(shè)備環(huán)境必須用ReleaseDC函數(shù)釋放
voidReleaseDC(HWNDhwnd);4.映像模式 映像模式定義了將邏輯單位轉(zhuǎn)化為設(shè)備的度量單位以及設(shè)備的x方向和y方向,程序員可在一個統(tǒng)一的邏輯坐標系中操作而不必考慮輸出設(shè)備的坐標系情況窗口:對應(yīng)邏輯坐標系上程序員設(shè)定的區(qū)域視口:對應(yīng)實際輸出設(shè)備上程序員設(shè)定的區(qū)域窗口和視口如何映射?缺省的映射模式將窗口中的對稱圖形映射到視口時仍為對稱圖形按照窗口和視口的坐標比例進行映射坐標系統(tǒng)邏輯坐標系統(tǒng)設(shè)備坐標系統(tǒng)屏幕坐標系統(tǒng)窗口坐標系統(tǒng)用戶區(qū)坐標系統(tǒng)
應(yīng)用程序可獲取設(shè)備環(huán)境的當前映像模式,并根據(jù)需要設(shè)置映像模式。相關(guān)函數(shù)設(shè)置設(shè)備環(huán)境的映像模式SetMapMode(hdc,nMapMode);
nMapMode為映像模式的整型標識符獲取當前設(shè)備環(huán)境的映像模式nMapMode=GetMapMode(hdc);窗口區(qū)域的定義由SetWindowExtEx函數(shù)完成,其函數(shù)原型形為:BOOLSetWindowExtEx(HDChdc, intnHeight,nWidth,//以邏輯單位表示的窗口區(qū)域高寬度
LPSIZElpSize,//函數(shù)調(diào)用前窗口區(qū)域尺寸的SIZE結(jié)構(gòu)地址);視口區(qū)域的定義由SetViewportExtEx函數(shù)完成,函數(shù)原型為:BOOLSetViewportExtEx(HDChdc, intnHeight,nWidth,//以物理設(shè)備單位表示的新視口區(qū)域高寬度LPSIZElpSize );只有在映射模式為MM_ANISOTROPIC和MM_ISOTROPIC時才有意義視口的缺省原點和窗口的缺省原點均為(0,0)??赏ㄟ^調(diào)用函數(shù)SetViewportOrgEx和SetWindowOrgEx設(shè)定窗口與視口的原點。SetWindowOrgEx函數(shù)的原形為:BOOLSetWindowOrgEx(HDChdc,intX,Y, //以邏輯單位表示的窗口原點坐標LPPOINTlpPoint //函數(shù)調(diào)用前原點坐標的POINT結(jié)構(gòu)的地址);只有在映射模式為MM_ANISOTROPIC和MM_ISOTROPIC時才有意義127MM_TEXT映射方式假設(shè)顯示區(qū)域為cxClient個像素寬和cyClient個像素高。如果想將邏輯點(0,0)定義為顯示區(qū)域的中心,調(diào)用SetViewportOrgEx(hdc,cxClient/2,cyClient/2,NULL)SetViewportOrgEx的參數(shù)總是使用設(shè)備單位。現(xiàn)在,邏輯點(0,0)將映射為設(shè)備點(cxClient/2,cyClient/2),而顯示區(qū)域的座標系變成如下形狀:129用下面的SetWindowOrgEx敘述可以獲得與上面使用SetViewportOrgEx同樣的效果:SetWindowOrgEx(hdc,-cxClient/2,-cyClient/2,NULL);SetWindowOrgEx的參數(shù)總是使用邏輯單位。在這個調(diào)用之后,邏輯點(-cxClient/2,-cyClient/2)映射為設(shè)備點(0,0),即顯示區(qū)域的左上角。二、繪圖工具與顏色1.畫筆(1)畫筆的創(chuàng)建使用畫筆之前必須事先定義一個畫筆句柄。形式如下:HPENhP;然后調(diào)用函數(shù)GetStockObject獲取Windows系統(tǒng)定義的四種畫筆例如獲取畫筆BLACK_PEN的形式如下:
hP=GetStockObject(BLACK_PEN);WHITE_PENBLACK_PENNULL_PEN畫筆的操作創(chuàng)建畫筆將畫筆選入設(shè)備環(huán)境刪除畫筆(2)創(chuàng)建新畫筆,形式如下:hP=CreatePen(intnPenStyle, //確定畫筆樣式intnWidth, //畫筆寬度COLORREFrgbColor//畫筆顏色);創(chuàng)建畫筆后,必須調(diào)用SelectObject函數(shù)將其選入設(shè)備環(huán)境。
SelectObject(hdc,hP);//hP為所創(chuàng)建或獲取的畫筆句柄不再使用當前畫筆時,需刪除畫筆,以免占內(nèi)存
DeleteObject(hP);PS_DASH: 虛線 PS_DASHDOT: 點劃線 PS_DASHDOTDOT:雙點劃線PS_DOT: 點線 PS_INSIDEFRAME: 實線PS_NULL: 無 PS_SOLID: 實線2.畫刷畫刷的創(chuàng)建與應(yīng)用與畫筆很相似,操作畫刷也包括創(chuàng)建、選入設(shè)備環(huán)境和刪除。(1)畫刷的創(chuàng)建使用畫刷需事先定義一個畫刷句柄。形式如下:
HBRUSHhBr;//hBr為畫刷句柄
然后調(diào)用函數(shù)GetStockObject獲取Windows系統(tǒng)提供的7種畫刷
hBr=(HBRUSH)GetStockObject(nBrushStyle)畫刷樣式BLACK_BRUSH 黑色畫刷DKGRAY_BRUSH 深灰色畫刷GRAY_BRUSH 灰色畫刷HOLLOW_BRUSH 虛畫刷LTGRAY_BRUSH 亮灰色畫刷NULL_BRUSH 空畫刷 WHITE_BRUSH 白色畫刷指定顏色畫刷如何獲得?可調(diào)用函數(shù)CreateSolidBrush和CreateHatchBrush創(chuàng)建畫刷,hBr=CreateSolidBrush(rgbColor);
創(chuàng)建具有指定顏色的單色畫刷創(chuàng)建指定陰影圖案和顏色的畫刷(2)選入設(shè)備環(huán)境
創(chuàng)建畫刷后,通過SelectObject(hdc,hBr);將其選入設(shè)備環(huán)境(3)刪除畫刷不使用畫刷時,可用DeleteObject(hBr);刪除畫刷,釋放內(nèi)存hBr=CreateHatchBrush(intnHctchStyle,COLORREFrgbColor );HS_BDIAGONAL45度從左上到右下HS_DIAGCROSS45度叉線 HS_FDIAGONAL45度從左下到右上HS_CROSS 垂直相交的陰影線HS_HORIZONTAL水平陰影線HS_VERTICAL 垂直陰影線3.顏色Windows使用宏RGB定義繪圖的顏色,其形式為:
RGB(nRed,nGreen,nBlue)
紅色值藍色值綠色值RGB(255,0,0)RGB(0,255,0)RGB(0,0,255)三、常用繪圖函數(shù)1.設(shè)置畫筆當前位置的函數(shù)MoveToEx,
BOOLMoveToEx(HDChdc,intX,Y, //X、Y分別為新位置的邏輯坐標
LPPOINTlpPoint //存放原畫筆位置的POINT結(jié)構(gòu)地址)2.從當前位置向指定坐標點畫直線的函數(shù)LineTo,BOOLLineTo(HDChdc,intX,intY)//X和Y為線段的終點坐標3.從當前位置開始,依次用線段連接lpPoints中指定的各點BOOLPolyline(HDChdc,LPPOINTlpPoints,//指向包含各點坐標的POINT結(jié)構(gòu)數(shù)組的指針
intnCount //nCount為POINT數(shù)組中點的個數(shù))4.繪制橢圓弧線的函數(shù)Arc,BOOLArc(HDChdc,intX1,intY1, //邊框矩形左上角的邏輯坐標intX2,intY2, //邊框矩形右下角的邏
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度學生保險居間業(yè)務(wù)合同
- 教育培訓行業(yè)經(jīng)驗分享指南
- 汽車汽車租賃合同
- 三農(nóng)村電商物流作業(yè)指導(dǎo)書
- 轉(zhuǎn)租房屋租賃合同
- 礦業(yè)與安全技術(shù)作業(yè)指導(dǎo)書
- 房地產(chǎn)中介銷售服務(wù)合同
- 電子電路設(shè)計與制造作業(yè)指導(dǎo)書
- 組織行為學作業(yè)指導(dǎo)書
- 雙語藝術(shù)節(jié)之迎新文藝晚會活動方案
- 鋼筋工程精細化管理指南(中建內(nèi)部)
- 小學語文中段整本書閱讀的指導(dǎo)策略研究 中期報告
- 2024年山西省高考考前適應(yīng)性測試 (一模)英語試卷(含答案詳解)
- 浙教版2023-2024學年數(shù)學八年級上冊期末復(fù)習卷(含答案)
- 2024年中國鐵路投資集團有限公司招聘筆試參考題庫含答案解析
- 運動訓練與康復(fù)治療培訓資料
- 干部人事檔案數(shù)字化 制度
- 經(jīng)營開發(fā)部工作目標責任書
- 小班繪本教學《藏在哪里了》課件
- 老師呀請你別生氣教學反思
- 2023年北京市平谷區(qū)中考英語二模試卷
評論
0/150
提交評論