windows程序設計1
,單擊此處編輯母版標題樣式,單擊此處編輯母版文本樣式,第二級,第三級,第四級,第五級,*,Windows,程序設計基礎,主要內(nèi)容,Windows,編程基礎知識,Win32,程序運行原理,用實例剖析,Windows,高級特性,第一章,windows,程序設計基礎知識,1.1,必備知識,Windows,的操作系統(tǒng),:,Windows95 Windows98 Windows Me Windows2000 Windows XP Windows2003,(,32,),Vista,(,64,),開發(fā)工具,VB,、,Visual FoxPro,、,VC+,、,Delphi,、,C#,。,TC,是,16,位,DOS,程序編譯器,Win32 API,(Application Programming Interface),Win32 API,可認為是一個程序庫,提供各式各樣的與,windows,系統(tǒng)服務有關的函數(shù)。,Win32 API,是最底層的服務。,調(diào)用,windows,的各種服務。,通常所說的,sdk,編程就是直接調(diào)用,API,函數(shù)進行編程。,Win32 API,是指編制,32,位應用程序時用的一組函數(shù)、結構、宏定義。在,win32,的環(huán)境下,任何語言都是建立在,Win32 API,基礎上的。,Visual FoxPro,、,VB,等軟件,API,隱藏的較深。,大多數(shù),API,位于三個核心,DLL,中:,kernel32.dll,、,user32.dll、GDI32.dll,采用其開發(fā),windows,應用程序過于繁瑣。,API&MFC,1.KERNEL,在,Win32,中庫名為,KERNEL32.DLL,主要用于產(chǎn)生與操作系統(tǒng)之間的關聯(lián):程序加載 上下文選擇,.,文件輸入輸出,.,內(nèi)存管理,.,例如:,GlobalMemoryStatus,函數(shù)就包括當前物理內(nèi)存及虛擬內(nèi)存的使用信息。,2.USER,這個類庫在,Win32,中名叫,USER32.DLL,。它允許管理全部的用戶接口,比如:窗口 菜單 對話框 圖標等,.,例如:,DrawIcon,函數(shù)將在指定的設備關聯(lián)上“畫”出圖標或者鼠標。,3.GDI(Graphical Device Interface),它在,Win32,中的庫名為:,GDI32.dll,,它是圖形輸出庫。使用,GDI Windows“,畫”出窗口、菜單以及對話框等:它能創(chuàng)建圖形輸出,.,它也能保存圖形文件,.,例如:,CreateBitmap,函數(shù)就能通過指定的長、寬、顏色創(chuàng)建一個位圖。,API&MFC,API:,一套用來控制,Windows,的各個部件,(,從桌面的外觀到為一個新進程分配的內(nèi)存,),的外觀和行為的一套預先定義的,Windows,函數(shù),.,MFC,是對,WindowsAPI,的封裝,是,Win,API,與,C+,的結合,MFC,就是掛在它之上的一個輔助軟件開發(fā)包,MFC,主包含文件為,“,Afxwin.h,”,。,API,主包含文件為,windows.h,(1),包含要調(diào)用函數(shù)的聲明文件,windows.h,包含其他頭文件,windef.h,基本類型定義,winnt.h,支持,Unicode,的類型定義,winbase.h,內(nèi)核函數(shù),winuser.h,用戶接口函數(shù),wingdi.h,圖形設備接口函數(shù),winsock.h,網(wǎng)絡編程函數(shù),API,函數(shù)的調(diào)用方法,(2),連接到指定的庫文件,kernel32.lib user32.lib gdi32.lib,winspool.lib,comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib,uuid.lib,odbc32.lib odbccp32.lib,顯示設置:,#,pragma,comment(lib,”w2_32.lib”),(3),在,API,函數(shù)前加“,:”,表示這是一個全局函數(shù),以與,C+,類的成員函數(shù)區(qū)分。,API,函數(shù)的調(diào)用方法,C#,調(diào)用格式,using,System.Runtime.InteropServices,;,/,引用此名稱空間,簡化后面的代碼,./,使用,DllImportAttribute,特性來引入,api,函數(shù),注意聲明的是空方法,即方法體為空。,DllImport(user32.dll)public static extern,ReturnType,FunctionName(type,arg1,type arg2,.);/,調(diào)用時與調(diào)用其他方法并無區(qū)別,1.VB,不能直接調(diào)用,Win API,,要先聲明然后再調(diào)用。,2.,聲明,API,過程,比如聲名,SetWindowTextA,首先,在模塊的聲明部分對過程進行聲明:,Private Declare Function,SetWindowText,Lib user32 Alias,SetWindowTextA,(,ByVal,hwnd,As Long,ByVal,lpString,As String)As Long 3.,調(diào)用,API,過程 在聲明了函數(shù)之后,調(diào)用它的方式與標準的,Visual Basic,函數(shù)相同。在下例中,,Form Load,事件調(diào)用了上面聲明的過程。,Private Sub,Form_Load,(),SetWindowText,Form1.hWnd,Welcome to VB End Sub,在,VB,環(huán)境下,涉及到的所有,integer(,整型數(shù),),,都是,16,位,調(diào)用,API,例子,(VB),調(diào)用,API,例子(,C#,),讀寫,INI,文件。,using System;using,System.IO,;using,System.Text,;using,System.Runtime.InteropServices,;namespace,FileIO,public class,INIFileIO,DllImport(kernel32)private static extern long,WritePrivateProfileString(string,section,string,key,string,val,string,filePath,);,DllImport(kernel32)private static extern,int,GetPrivateProfileString(string,section,string,key,string,def,StringBuilder,retVal,int,size,string,filePath,);,調(diào)用,API,例子(,C#,),public,INIFileIO,()public static void,INIWriteValue(string,section,string,key,string,val,string,filePath,),WritePrivateProfileString(section,key,val,filePath,);,public static string,INIReadValue(string,section,string,key,string,filePath,),StringBuilder,temp=new StringBuilder(255);,int,i=,GetPrivateProfileString(section,key,temp,255,filePath,);return,temp.ToString,();,#include,就可以使用,API,函數(shù),調(diào)用,API,例子,(C+),#include,stdafx.h,/,這是,VC,自動添加的頭文件,沒有什么用途,#include/,包含,MessageBox,函數(shù)聲明的頭文件,int,main(int,argc,char*,argv,),/,調(diào)用,API,函數(shù),MessageBox,int,nSelect,=:,MessageBox(NULL,Hello,Windows XP,Greetings,MB_OKCANCEL);,if(nSelect,=IDOK),printf,(,用戶選擇了“確定”按鈕,n);,else,printf,(,用戶選擇了“取消”按鈕,n);,return 0;,回調(diào)函數(shù),回調(diào)函數(shù)就是一個通過函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針,(,地址,),作為參數(shù)傳遞給另一個函數(shù),當這個指針被用為調(diào)用它所指向的函數(shù)時,我們就說這是回調(diào)函數(shù)。,某些,API,函數(shù)要求以,callback,作為你參數(shù)之一。如,SetTimer,,,LineDDA,,,EnumObjects,。,UINT_PTR,SetTimer,(,HWND,hWnd,/,窗口句柄,UINT_PTR,nIDEvent,/,定時器,ID,,多個定時器時,可以通過該,ID,判斷是哪個定時器,UINT,uElapse,/,時間間隔,單位為毫秒,TIMERPROC,lpTimerFunc,/,回調(diào)函數(shù),);,回調(diào)函數(shù)必須有關鍵詞,CALLBACK,回調(diào)函數(shù)本身必須是全局函數(shù)或者靜態(tài)函數(shù),不可定義為某個特定的類的成員函數(shù),回調(diào)函數(shù)并不由開發(fā)者直接調(diào)用執(zhí)行,(,只是使用系統(tǒng)接口,API,函數(shù)作為起點,),回調(diào)函數(shù)通常作為參數(shù)傳遞給系統(tǒng),API,,由該,API,來調(diào)用,回調(diào)函數(shù)可能被系統(tǒng),API,調(diào)用一次,也可能被循環(huán)調(diào)用多次,int,_,stdcall,CompareInts(const,byte*velem1,constbyte*velem2),int,elem1=*(,int,*)velem1;,int,elem2=*(,int,*)velem2;,if(elem1elem2),return1;,return0;,int,_,stdcall,CompareStrings(const,byte*velem1,constbyte*velem2),constchar*elem1=(char*)velem1;,constchar*elem2=(char*)velem2;,returnstrcmp(elem1,elem2);,int,main(int,argc,char*,argv,),int,i;,int,array=5432,4321,3210,2109,1098;,cout,Beforesorting,ints,with,Bubblesortn,;,for(i,=0;i5;i+),cout,arrayi,n;,Bubblesort(byte,*)array,5,sizeof(array0),&,CompareInts,);,cout,Afterthesortingn;,for(i,=0;i5;i+),cout,arrayi,n;,constcharstr510=,estella,danielle,crissy,bo,angie,;,cout,Beforesortingstringswith,Quicksortn,;,for(i,=0;i5;i+),cout,stri,n;,Quicksort(byte,*),str,5,10,&,CompareStrings,);,cout,Afterthesortingn;,for(i,=0;i5;i+),cout,stri,n;,return0;,結 束,