WindowsAPI编程入门教程_第1页
WindowsAPI编程入门教程_第2页
WindowsAPI编程入门教程_第3页
WindowsAPI编程入门教程_第4页
WindowsAPI编程入门教程_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

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

文档简介

1、APIWindowsAPI一个API函数OkAPIWindowsAPIbeyondcode,这次在WindowsAPISDK是SoftwareDevelopmentKitWindowsWindowsSDK来说(我所说的)一个纯SDKWIN32SDKWindowsMessageBoxhelloworldSDKWindowsSDKtypedeffloatFLOAT;typedeflongLONG;typedefshortSHORTtypedefintINT;typedefcharCHAR;C/C+float,long,short,int,chartypedefunsignedintUINT;typ

2、edefunsignedintUINT32;typedefsignedintINT32;typedefunsignedlongDWORD;typedefunsignedshortWORD;unsignedinta;形unsignedlongunsignedlong还这么长了,只需UINTa;其中DWORD算是SDKDWORD都看你自己心情WPARAM,LPARAMtypedefLONG_PTRLPARAM;typedefUINT_PTRWPARAM;先告诉你,这2个数据类型很重要的定义如上,有些迷糊?别,我们LONG_PTR也就是用LPARAM的成什么的呢?typedeflongLONG_PT

3、R;看到了吗?也就是long所以归根你都可以直接使用long数据类型以上这些数据类型是参考MSDNWindows数据类型的定义,那么也后你写SDK程序就知道了,看他LPARAMLPARAMLONG_PTR,LONG_PTR又是被定LPARAM就是longLPARAM查看WinDef.h这个头LARAM和WPARAM现LONG_PTR#ifdefined(_WIN64)typedef_int64LONG_PTR;#elsetypedeflongLONG_PTR;#endif义LONG_PTR为懂英文都能知道这在定义些什么,如果定义了_int64LONG_PTRlong_WIN64这个宏那么WIN

4、64被定义了,那么这里的LONG_PTR就被定义为_int64这个在64否则就定义为long型,这样说应该比较好理必深究_int64了,在目前的主流32位编程下很少使用它啦。理解就ok了。这程序能在32位与64位下都能编译而采用WindowsVC6.0,VS2008这GotoDefinationWindowswindows#defineVOIDvoid#defineCONSTconst2个最简单的宏,也是WindowsSDKWINAPICALLBACKGetWindowTextSDK系列入下WindowsUnicodeASCIIWindowsMessageBox这个函数不能将constchar

5、*或WindowsAPI编程的朋Unicode编码和ASCIIconstcharconstwchar_t*关于Unicode和ASCII具体的Windows平台下的编程相关的我们都知道Unicode和ASCII对Unicode编码和ASCIIUnicode采用2个字节来用2个字节而ASCII采2个ASCIIUnicodeUnicode22ASCIIUnicodeUnicode字符要比ASCIISDK2APIUnicodeASCIIMessageBox#ifdefUNICODE#defineMessageBoxMessageBoxW#else#defineMessageBoxMessageBox

6、A#endif看到了吗?很简单,UNICODE宏那么就定义MessageBox为MessageBoxW,如果没有定义UNICODE这个宏,那么就定义MessageBox为MessageBoxA,MessageBox后面的W和A就是代表宽字节(Unicode)ASCIISDK数是MessageBoxW和MessageBoxA这MessageBox只是一个宏而已。所以在程序中,这3个名字的是,使用MessageBoxA的话,那么你要注意传给它的参数ASCIIcharMessageBoxWUnicode程序中就是wchar_t。WUnicode采用ASCII编码的程序,那么需要改动ASCII,如上例

7、,就使用MessageBox使用char还是wchar_t而是使用微软给我们定义的TCHAR字符数据面MessageBox函数的定义差不多,都是根据是否定义了UNICODE这TCHARcharwchar_tTCHARAPIUnicodeUnicode2UnicodeUnicode2Windowschar和wchar_t就是Unicode字符)charc=b;wcha_twc=Lb;分别定义了2个变c和wc,相cb呢?,用2个字节来保存bLLb个Unicode字wcUnicodec这个字符变量只有一个字节来保存,那bUnicodewcUnicodechar和宽字节的wchar_tcharc10;

8、wchar_twc10;charc=beyondcode;wchar_twc=Lbeyondcode;C/C+Windows在Windows编程中看到的满到LPTSTR,LPCTSTR这些数据类处都是的TCHAR,LPSTRL,PCSTR,LPWSTR,LPCWSTR,型又是怎么回事呢?别急,我们一步一步的来,最后我会联charc=hellobeyondcode;/定义一wchar_twc=Lhellobeyondcode;/char*p=c;/定义一个字符指针,指向wchar_t*wp=wc;/定义一个宽字节字这样之后,我就可以通过指针来改变刚才我们定义的2p0=H;wp0=LH;把上面2个

9、数组的第一个字符通过指针改变成大写。这没有定义指针为常量指针,也就是没有加const修饰符constchar*p=c;constwchar_t*wp=wc;C/C+Windows是怎么定义它的数据类型的首先,定义了CHAR,WCHAR的这2个字符数据类型typedefcharCHAR;typedefwchar_tWCHAR;CHAR,WCHAR这22typedefCHAR*LPSTR;typedefWCHAR*LPWSTR;LPSTR就是CHAR*,而CHAR又是char,LPSTRchar*字符指针,那LPWSTRLPWSTRWCHAR*WCHARwchar_t样LPWSTR就是wchar_

10、t*在WinNT.h这面2个定义我只LPSTRLPWSTRLPCSTR,LPCWSTR2呢,老规矩,先windows22typedefCONSTCHAR*LPCSTR;22typedefCONSTWCHAR*LPCWSTR;22constconstCONSTwindowschar*LPSTR2wchar_t*LPWSTRWindows的API函数中关于字符串的都是使用LPchar*或者wchar_t*,只要他们的charc=c;和CHARc=c;wchar_twc=Lw;和WCHARwc=Lw;char*p和LPSTRpwchar_t*wp和LPWSTRwpchar*p=newchar10;/

11、CHAR*p=newCHAR10;LPSTRp=newCHAR10;LPSTRp=newchar10;wchar_t*wp=newwchar_t10;WCHAR*wp=newWCHAR10;LPWSTRwp=newWCHAR10;LPWSTRwp=newwchar_t10;上面定义的这些字符指针p,wp都没有用const修饰符constLPSTR,LPCSTR,LPWSTR,LPCWSTRLPSTRchar*LPCSTRconstchar*LPWSTRwchar_t*22LPCWSTRconstwchar_t*2LPWSTR,LPCWSTR(Unicode)Unicode这时你需要编译一套AS

12、CII版本的程序,那你会怎LPCWSTRLPSTRLPCSTR通用点的方法吗?有!所有人在这里也都知道我会用数据类型,说通用数据类型有点太专业了,其实也就API2有一套宏,能根据不同的工程环境定义成不同的APITCHAR,LPTSTR,LPCTSTRTCHAR#ifdefUNICODEtypedefWCHARTCHAR;#elsetypedefcharTCHAR看到了吗?它也是根据UNICODE这个宏被定义没有数据类型就是WCHAR,也就是wchar_t,如果没被你说将用LPWSTRL去掉就可以了,对TCHARTCHAR就代表的是charLPTSTR,LPCTSTR#ifdefUNICODEt

13、ypedefLPWSTRLPTSTR;#elsetypedefLPSTRLPTSTR;LPTSTRWinNT.hLPTSTRUNICODELPTSTRUNICODEUnicodeLPTSTRLPWSTR,LPWSTR2wchar_t*,所以此时LPTSTR代表的数据类型就是wchar_t*有定义UNICODE这个宏,那么就LPTSTRLPSTR,而LPSTRchar*LPTSTRchar*吗?各位,我UnicodeTCHARtc=a;或者是LtcASCIITCHARtc环境下编译,所以如下=La;是否合适呢的呢?各位思考一下呢?TCHAR是UnicodeTCHAR数据类型就wchar_t宽字节

14、类型,所以tc是ASCII环境,那么TCHAR代表的是charT(),只要将字符或者_T()LTCHARtc=_T(A);UnicodeASCII两套程序MFC中的CString是Windowsc+stringbeyondcodeWindowsUnicodeASCIIAPI,SDK编:81543028SDKOkbeyondcode*/#includeintWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnShowCmd)MessageBoxA(NULL,Hellobeyondcode,Title

15、,MB_OK);return0;SDKSDKMessageBoxA呢?不能理解MessageBoxWUnicodeMessageBoxAPI函数的调用法,你能看出什么问题呢?对WinMainLPTSTRMessageBox是AHellobeyondcodeTitleL前缀。那么第告诉你我现在的工程环境是使用Unicode字符集(集可以在【项目】-工集】中设置),那么我上面的程序能正常通过编译吗?当然能,因为我已经呢?这是因为我指定的参数和函数需要的参数都是MessageBoxAMessageBoxW?为MessageBoxW的第二LPCWSTR也就是constwchar_t*,而我给出的两个字

16、符串常量却没有用L前缀.也就MessageBoxW5处WinMainwWinMain,WinMainLPWSTR,MessageBoxA改成WLok/*BYbeyondcode*/#includeintWINAPIwWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPWSTRlpCmdLine,intnShowCmd)MessageBoxW(NULL,LHelloBeyondcode,LTitle,MB_OK);return0;Unicode和ASCII的两个版本的程序,我应该怎么写呢?其实就是我上一篇重指出是Unicode还是ASCII版本

17、的,调用的APIAW函数,如上面的MessageBox,/*BYbeyondcode*/#include#includeintWINAPI_tWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPTSTRlpCmdLine,intnShowCmd)MessageBox(NULL,_T(HelloBeyondcode),_T(Title),MB_OK);return0;WinMain_tWinMain,_tWinMainUNICODEWinMainwWinMainLPTSTRtchar.h_tWinMain_T()SDK下面,我们继续在上面的程序

18、中加一些功能,让它计算1到10的和,然后把结果显示给我SDK?MessageBoxMessageBox又不是控制台程序可以使用printf之类的格式化输出函数来输出数字,也不能使用cout之类C+?要的是字符串,那我们就把我们的结果格式化到一个字符串里面,然后传送给MessageBoxwsprintf#ifdefUNICODE#definewsprintfwsprintfW#else#definewsprintfwsprintfA#endif/!UNICODEwsprintfW或者wsprintfA,而我们为了程序的通用性,直接使wsprintf_T()LPTSTRLPCTSTR/*BYbey

19、ondcode*/#include#includeintWINAPI_tWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPTSTRlpCmdLine,intnShowCmd)intsum=0;for(inti=1;i=10;i+)sum+=i;TCHARstrSum256=0;wsprintf(strSum,_T(%d),sum);MessageBox(NULL,strSum,_T(Title),MB_OK);return0;制代码怎么样,也还不算复杂吧,计算1到10的那部分不用我讲了吧,最后的结果sumMessageBoxTCHAR始化为

20、0wsprintfLPTSTR%dprintfwsprintf一个参数是LPTSTRTCHAR的数组名LPTSTR么类型呢?上一篇就讲过的啊,就是wchar_t*就是2宽字符指针,而的是wchar_tTCHARUnicodeTCHARwchar_t*的指针,那么这里TCHAR是wchar_t也就是说strSumwsprintfstrSumMessageBox讲来。在这里MessageBox的LPCTSTR就是constwchar_t*,而我们上strSumwchar_t*因为阿,这里strSum在传MessageBox的constwchar_t*MSDNsprintf单字节C/C+swprin

21、tf宽字节版本的C/C+的wsprintf和上面两个函wsprintfw不是WideWindowsWwindowsAPIAPIwsprintfA和wsprintfWwsprintfOK,这一篇文章就到这里了,SDK1到10的结果,计算的程序不和ASCII版本的程序在编程方APIc+UnicodeSDKSDKSDKMessageBoxAPISDK2(WNDCLASSEX)是你在结构体WNDCLASSEX中指定的那WNDCLASSWNDCLASSEX的结构体来描述一个窗口取具体的操作,当然你也可以不操作,无动于衷,对于windowsSDK程序的消息循环,不断的发送消息,而开车的人就相当于窗SDK/

22、*BYbeyondcode*/#include#includeLRESULTCALLBACKWinMessageProc(HWNDhwnd,UINTmsg,WPARAMwParam,LPARAMlParam);2intWINAPI_tWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPTSTRlpCmdLine,intnShowCmd)return0;LRESULT查看是longCALLBACK和WINAPI是一样stdcallCALLBACKWinMessageProc这个函数的代码的,WinMessageProc/MyWindowClas

23、sWNDCLASSEXwc;wc.cbSize=sizeof(wc);wc.style=CS_VREDRAW|CS_HREDRAW;wc.cbClsExtra=0;wc.cbWndExtra=0;wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);wc.hCursor=LoadCursor(NULL,IDC_ARROW);wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);wc.hIconSm=LoadIcon(NULL,IDI_APPLICATION);wc.hInstance=hInstance;wc.lpf

24、nWndProc=WinMessageProc;wc.lpszMenuName=NULL;wc.lpszClassName=_T(MyWindowClass);if(!RegisterClassEx(&wc)MessageBox(NULL,_T(”),_T(”),MB_OK);return0;NULLNULLNULLNULL2WNDCLASSMSDNlpszClassName_T(MyWindowClass)lpfnWndProc这个成MSDNWinMessageProc这个函数,这是指我们这里指定的是WinMessageProc个窗口类有哪些特性后就完了?RegisterClassEx这个A

25、PI函数WNDCLASS/MyWindowClassHWNDnewWind=CreateWindowEx(0L,_T(MyWindowClass),_T(beyondcode),WS_OVERLAPPEDWINDOW,0,0,200,200,NULL,NULL,hInstance,NULL);if(NULL=newWind)MessageBox(NULL,_T(”),_T(”),MB_OK);return0;ShowWindow(newWind,nShowCmd);UpdateWindow(newWind);CreateWindowExAPI0L们上面已经注册了的那个名叫MyWindowCla

26、ss的窗口类,第三个参数是窗口的标题,随便WS_OVERLAPPEDWINDOWMSDNNULLNULL,WinMainhInstanceNULLAPI22个APIShowWindowUpdateWindowShowWindow的第二个参数是指显示的类型,是最序中第一次调用ShowWindow必须使用WinMainMSDN/MSGmsg;while(GetMessage(&msg,NULL,0,0)TranslateMessage(&msg);DispatchMessage(&msg);?GetMessageGetMessageWM_QUITGetMessage0GetMessageTrans

27、lateMessageDispatchMessageAPI函数进行处理.其中DispatchMessage就是将消息发送给了对应的窗口的窗口消息处数进行处理。至于TranslateMessage呢,则进行一些消息的转换,可以先不深究。息的代码,对于你不处理的消息,则统统交给一个叫DefWindowProc的API函数进行默认LRESULTCALLBACKWinMessageProc(HWNDhwnd,UINTmsg,WPARAMwParam,LPARAMlParam)switch(msg)caseWM_DESTROY:PostQuitMessage(0);break;default:retur

28、nDefWindowProc(hwnd,msg,wParam,lParam);return0;2WM_DESTROY就调用PostQuitMessage这个APIDefWindowProc这个函数进行处PostQuitMessage这个API函数的功能就是发送一个WM_QUIT的消,在消息循环中GetMessage一旦WM_QUIT束了,如果在这里我们处理WMPostQuitMessage,怎样呢,读者朋友们思考一下是WM_DESTROY值为0,那么消息循DESTORYSDKVS2008,windows7我在API入门系列本API的应用,由SetWindowTextGetClientRect得

29、到GetWindowLongPtrCreateWindowEx创BeginPaint得到窗SDKSDKAPIEndPaintMessageBoxAPI的API函数调用2DrawText22WM_DESTROYMSDNWM_CREATE理WM_CREATE最合适不过啦,代码如下:caseWM_CREATE:RECTrctClient;/用来存放主窗口客户区大小信息constintbuttonWidth=80;/按钮的宽constintbuttonHeight=25;/按钮的高GetClientRect(hwnd,&rctClient);/得到主窗口客户区的大小信息HINSTANCEhInst=(

30、HINSTANCE)GetWindowLongPtr(hwnd,GWLP_HINSTANCE);HWNDhButton=CreateWindowEx(0L,_T(button),_T(确定),WS_VISIBLE|WS_CHILD,rctClient.right/2-buttonWidth/2,rctClient.bottom/2-buttonHeight/2,buttonWidth,buttonHeight,hwnd,(HMENU)2,hInst,NULL);SetWindowText(hwnd,_T();break;WM_CREATEGetClientRectrctClientMSDN个R

31、ECT结构GetClientRectrctClient了两个整形常量buttonWidth,buttonHeightGetWindowLongPtr这个函数获取和窗口有例的句柄,也就是WinMain函数所传递进buttonWS_OVERLAPPEDWINDOWWS_CHILD,如果我们需要创建WS_VISIBLESDK编程(81543028SetWindowText这个APIhwnd22case设备句柄调用GDI函数DrawText来完绘出,所以我们需要处理WM_PAINTWM_PAINT:constintbuttonWidth=80;constintbuttonHeight=25;const

32、inttextHeight=25;PAINTSTRUCTps;HDChdc=BeginPaint(hwnd,&ps);RECTrctClient,rctText;GetClientRect(hwnd,&rctClient);rctText.left=rctClient.left;rctText.right=rctClient.right;rctText.top=rctClient.bottom/2-buttonHeight-textHeight;rctText.bottom=rctClient.bottom/2-buttonHeight;DrawText(hdc,_T(Beyondcode),

33、_tcslen(_T(Beyondcode),&rctText,DT_CENTER|DT_SINGLELINE|DT_VCENTER);2EndPaint(hwnd,&ps);break;复制代码首先定义了三个整形常量buttonWidth,buttonHeighttextHeight指示要显示在文本的矩形框的高度,矩形框的宽度和PAINTSTRUCTBeginPaintEndPaintPS在调用BeginPaint和EndPaint的时候将它的地址MSDNBeginPatinEndPaint这BeginPaint和EndPatin这数,因为获取的hdc是通过hwnd这个窗。rctText是显示文参数hdc调用DrawTex

温馨提示

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

评论

0/150

提交评论