版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、WindowsAPI编程一windows基础编写第一个程序:#includeintWINAPIWinMain(HINSTANCEhlnstancelNSTANCEhPrevInstancePSTRIpCmdLineJntnShowCmd)MessageBox(NULLJEXTChelloworld,)/TEXT(,FirstProgram,)/MB-OK);return0;WINDEF.HWINBASE.HWINUSER.HWINGDI.HWINNT.H程序入口点:Windows程序的入II点总是WinMain函数,该函数定义如F:IntWINAPIWinMain(HINSTANCEhlnst
2、ance,HINSTANCEhPrevlnstance,LPSTRIpCmdLine,IntnCmdShow)Hlnstance是当前实例句柄,句柄是一个整数,用丁标示程序,窗II和资源等程序分析:程序的总体结构上,头文件windows.h代替了stdio.h,WinMain代替了main函数,MessageBox代替了printf.头文件:Windows.h是最重要的头文件,包含了许多其他的windows头文件,重要的几个如卜所示:用于定义基本数据类型用于包含内核函数用丁包含用户接II函数用于包含图形设备接II函数用丁支持Unicode编码的基本数据类型当前实例句柄总是置空命令行程序最初的显
3、示模式HPrevInstance总是置空NULL,在windows早期版本中,程序盂要通过检查hprevinstance來判断自身的其他实例程序是否正在运行,而在32位版本的,只需将其置空。IpCmdLine是运行程序的命令行。用户可以单击“开始”菜单中的“运行”选项,然后输入命令运行程序,这里的命令就是由参数IpCmdLine传入的。nCmdShow用于指定程序窗口最初的显示模式。注:这里变量的名称使用的是“匈牙利命名法”的命名规则,即在变量名前加一个标示变量数据类型的短前缀。例如,前缀h标示变量是一个句柄(handleMessageBox函数:IntMessageBox(HWNDHWnd,
4、LPCTSTRIpText,LPCTSTRIpCaption,UINTuType所属窗口句柄需要显示的信息字符串对话框窗口标题字符串对话框中的按钮和提示图标类型)MessageBox函数的第四个参数用丁指定对话框中显示的按钮和提示图标的类型。常用按钮类型有MB_OK(“确定”按钮),MB_OKCANCEL(确定”和“取消”按钮),MB_YESNO(“是”和“否”按钮),MB_INFORMATION(M信息提示”图标),MB_WARNING(警告”图标),MB_ERROR(“错误”图标)。各种按钮和图标可以使用“I”连接,表示同时使用。Windows与Unicode:字符集:Unicode字符集
5、比ASCII码要多很多,并且用16位的值表示一个字符,比ASCII多一倍,采用双字节字符集,包含了很多国家的文字代码点,总计65000多个代码点。C运行库对Unicode的支持数据类型:Unicode采用wchar_t表示字符数据类型,就像char。但它是16位双字节的。如卜定义:wchar_tch=,W,;定义单个字符wwchar_t*ch=LthisisaUnicodestring;定义字符串指针wchar_tch=LathisisaUnicodestring;定义字符数组其中,字符串前而的L表示编译器将字符串按Unicode保存,即每个字符占2个字节为了将单字节字符扩充为双字节字符,系统
6、会自动在单字节字符后插入0。例如,单字节字符W在intel处理器内存储为57,而双字节字符W则存储为5700.字符串处理函数:对双字节字符串的处理与单字节字符串不同。单字节用strlen,如iStringLength=strlen(thisisaUnicodestring);/i代表int即:intStringLength=双字节用wcslen,如:iwStringLength=wcslen(LthisisaUnicodestring);注意L,不能用strlen计算双字节字符串的长度,否则会出现编译错误。所有的字符串处理函数都要重新定义一个新的版本来支持Unicodeo因此采用TCHAR.H
7、头文件实现对单字节和双字节字符串的统一处理,根据该文件中定义的字符串处理函数,可以根据是否定义了UNICODE宏來分别处理Unicode字符集和单字节字符集。/TCHAR表示既可以指向windows字符又可以指向Unicode字符以计算字符串长度为例,处理单字节和双字节字符串的统一函数是.tcslen,在TCHAR.H+定义如F(该头文件不是ANSIC标准的一部分,所以这里定义的宏和函数名Z前都有一个F划线):#ifd&-UNICODEwcslen#define.tcslenffdefine_tcslen#endifstrlen#else由此可知,如果定义了UNICODE,就定义了_tcsle
8、n为wcslen,否则定义为strlenForexample:intstringLength=(_tcslen(Hcpath)+1);II如果定义为UNICODE则是wcslen,反之是strlenchar*test=仃CHAR*)malloc(sizeof仃CHAR)*stringLength);intlength=_tcslen(test);另外,TCHAR.H中还定义了一个新的数据类型TCHAR解决两种字符数据类型的统一问题。林ifdef.UNICODEtypedefwchartTCHAR;#elsetypedefcharTCHAR;#endif即,如果定义了Unicode,就定义了TC
9、HAR为wchar_t,否则定义为char如:wchar_twc_examplel=LA;wchar_t表示双字符数据类型,当给TCHAR定义了Unicode,就使得自定义类型TCHAR代表数据类型wchar_twchart*wc-example2=L,ABCDEF;为了解决字符串前L(指定为双字节字符串)的问题,TCHAR.H中定义了儿个宏#ifdef.UNICODEffdefine_T(x)L#x#endif如果定义了Unicode,就以L开头的字符串代替以_T()宏所包用字符串.数据类型:在WINNT.H文件支持Unicode,分别为单字节和双字节编码定义了两套数据结构。单字节编码数据类
10、型:typedefcharCHAR;自定义数据类型CHAR表示char数据类型以下用作字符指针typedefCHAR*PCHAR;/pointchar,wc表示一个宽字符,即wideChartypedefCHAR*LPCH,*PCH;/longPointChar和pointChartypedefCONSTCHAR*LPCCH,*PCCH;/理解为longPointConstChar和pointConstChar以卜用作字符串指针字首N和L表示near和long两种大小不同的指针,Win32中相等typedefCHAR*NPSTR;/nearPointstringtypedefCHAR*LPST
11、RZ*PSTR;/longPointStringpointstringtypedefCONSTCHARLPCSTR,*PCSTR;/longPointConstStringpointConstString双字节编码数据类型:typedefwchartWCHAR;/wideChar,自定义WCHAR表示wchart以下用作字符指针typedefWCHAR*PWCHAR;/自定义PWCHAR表示双字符形指针typedefWCHAR*LPWCH/*PWCH;/wideChar*longPointWideChar/*pointWideChartypedefCONSTWCHAR*LPCWCH/*PCWC
12、H;/constwideChar*longPointConstWideChar以下用作字符串指针typedefWCHAR*NWPSTR;/widechar*nearWidePointStringtypedefWCHAR*LPWSTR,*PWSTR;/wideCharlongPointWideString/pointWideStringtypedefCONSTWCHAR*LPCWSTR/PCWSTR;并在此基础上定义了一套统一的数据结构#ifdefUNICODEtypedefWCHARTCHAR,*PTCHAR;/wideChartchar,*point_Tchar/以下为字符串指针自定义类型,
13、LPWSTR为长整形双字符字符串指针类型typedefLPWSTRLPTCH,PTCH;/自定义LPTCH,PTCH表示指向双字符型字符串的指针typedefLPWSTRPTSTR,LPTSTR;/longPointWideStringpointTstringtypedefLPCWSTRLPCTSTR;#elsetypedefcharTCHAR,*PTCHAR;/以下为字符串指针typedefLPSTRLPTCH,PTCH;typedefLPSTRPTSTR,LPTSTR;typedefLPCSTRLPCTSTR;#endif为了处理字符串前而的L(指定为双字节字符串),还定义了_TEXT宏#
14、ifdefUNICODEffdefine_TEXT(quote)L#quoteelseffdefine_TEXT(quote)quoteendif用于将单字节编码转换为双字节编码如果明确要编写ASCII编码的程序,就使用单字节编码的数据类型体系,如果明确需要编写Unicode编码的程序,就使用双字节编码的数据类型体系;如果不确定使用何种编码,则应当使用统一的数据类型体系,而由将來是否定义了UNICODE來决定是否解释为Unicode编码。涉及字符串的函数显示单字节字符串信息的消息框函数为MessageBoxA:IntWINAPIMessageBoxA(HWNDhWnd,窗口句柄,h表示句柄,w
15、nd表示窗口LPCSTRIpText,/内容字符串LPCSTRIpCaption,/caption表示标题,即这个变量为标题字符串UINTuType)/UNIT是unsignedint的缩写窗口和消息:WindowsAPI函数调用说明LoadiconLoadCursorGetStockObjectRegisterclassCreateWindowShowWindowUpdateWindowGetMessageTranslateMessageicon图标加载程序图标以供显示使用加载亂标指针以供显示使用获取一个图形设备对象为程序的窗口注册窗口类创建一个窗口在屏幕上显示窗口刷新窗口从消息队列中获取消
16、息转换消息DispatchMessageBeginPaintGetClientRectDrawTextEndPaintPostQuitMessageDefWindowProc将消息发送给窗口函数开始在用户区绘制取得用户区显示文本结束绘制在消息队列中插入一条“推出”消息执行缺省的windows消息处理二窗口和消息:匈牙利表示法:Windows坏境卜的变量命名约定一“匈牙利命名法”:变量名以一个或多个小写字母开始,这些字母用来表示改变吊:的数据类型。例如,szAppName中的“sz就表示ustringendedwithzero(以零结尾的字符串)如卜表列出了编写windows程序时经常用到的一些
17、变最前缀前缀数据类型CChar或WCHAR或TCHARbyBYTEnShort1Intx,yInt:坐标为x,yex,cyInt:分别作为x方向和y方向的长度b或fBool;f表示flagwWordLLongdwDword(无符号长整数)fnFunction(函数)sStringszStringendedwithzerohHandlepPointer取变吊名要尽彊取一些有意义的名字。例如szAppName中的AppName就表示了该变吊:是用来表示“ApplicationName。注册窗口类:“窗I啖”与“窗11”Z河的关系有点类似C+中的类与类的实例Z间的关系,可以基于同一个窗II类创建多个
18、窗II,正如C+中可以基丁同一个类而巾明多个类的实例。但是窗II类只规定了基丁该窗II类的窗II中刻画窗I丨内部特征和与具体显示关系不人的一些特性,包扌舌窗II用丁相应windows消息的窗II函数,窗II的基本显示风格,窗II所属的实例句柄,窗I1类名称和窗I所使用的菜单名称等。在创建窗IIZ前,必须调用Registerclass函数为窗II注册一个窗II类,定义如下:ATOMRegisterclass(constWNDCLASS*lpWndClass)如果注册失败,则返回零,反Z返回非零值。ATOM类型用于保证其返回值在整个系统中独一无二,区别于其他的窗I类该函数只用一个参数:一个指向WN
19、DCLASS结构体的指针。WNDCLASS结构体中包括了两个指向字符串的指针域。单字符型窗口类结构体/unsightedintstyle;用于ASCII版本的WNDCLASS:typedefstruct_WNDCLASSAUINTWNDPROCIntstyle;IpfnWndProc;窗口过程函数longPointertoFunctionWNDPROCcbClsExtra;/调用Registerclass,分配给user.exe本地堆中的类别据结构的额外的字节数,即保存数据,指定尺寸后注册窗口时系统就会按照此尺寸开辟一块内存IntcbWndExtra;.调用CreateClass,0cr即保存
20、数据,指定尺寸后创建窗口时系统会按照此尺寸开辟一块内存HINSTANCEhinstance;/instancehandle实例句柄HICONhlcon;/iconhandle图标句柄HCURSORhCursor;/cursorhandle鼠标句柄HBRUSHhbrBackground;/backgroundhandle背景句柄LPCSTRIpszMenuName;/longpointstringmenunameLPCSTRIpszClassName;WNDCLASSA;窗LI类结构体中包扌舌的数据:窗口实例句柄,窗口显示风格style,窗I过程函数(处理窗II的所有响应的消息),窗口注册时额外
21、的内存开销,窗LI创建时额外的内存开销,窗II背景,窗II菜单,窗II类名,图标句柄,鼠标句柄。用TUnicode版的WNDCLASSW:typedefstruct_VVNDCLASSWUINTstyple;WNDPROCIpfnWndProc;IntcbClsExtra;IntcbWndExtra;HINSTANCEhlnstance;HICONhlcon;HCURSORhCursor;HBRUSHhbrBackGround;LPCWSTRIpszMenuName;LPCWSTRIpszClassName;WNDCLASSW;Windows提供了一个通用的版本:Typedefstruct.W
22、NDCLASSUINTstyle;WNDPROCIpfnWndProc;IntcbClsExtra;IntcbWndExtra;HINSTANCEhlnstance;HICONhlcon;HCURSORhCursor;HBRUSHhbrBackGround;LPCTSTRIpszMenuName;LPCTSTRIpszClassName;WNDCLASS;注:这些结构体由编译器自行提供,只需对其赋值即可Ipfn表示longpointertofunction,cb表示countofbytes(字节数),hbr表示handleofabrush(一个刷子的句柄),Ipsz表示longpointert
23、oastringendedwithzero为了调用Registerclass函数,需要先定义一个WNDCLASS结构体,然后初始化该结构体的10个域,作为参数传给Registerclass函数。在WNDCLASS结构体中最重要的两个域是第二和最后一个。第二个域(IpfnWndProc)是所有基丁该窗II类创建的窗II所使用的窗II函数的入II地址,正是这个窗II函数负责处理窗II所响应的所有信息。最后一个域是该窗II类的名称,在后面CreateWindow函数中还将使用,正是这个域将“窗I”与其响应的“窗I类”联系起来。窗口样式语句:cs表示createStyle创建样式Wndclass.st
24、yle=CS.HREDRAW|CS.VREDRAW;窗I类结构体的对彖中的style数据成员赋值使用“位或”操作符组合了CS.HREDRAW,CS_VREDRAW两种“类风格”标识符,它们分别表示:当窗II水平方向的宽度变化时重新绘制整个窗II,当窗II垂直方向的宽度变化时重新绘制整个窗II。这样,当要改动窗II人小时,窗II中的信息相対位置将保持不变。类似CS_HREDRAW这样的标识符为“位标识符”如下是一些以CS开头的标识符:CS_BYTEALIGNCLIENT在字节边界(在X方向)上対齐窗体的客户区。此类型将影响到在窗体显示时它的宽度和它的水平位置。CS_BYTEALIGNWINDOW
25、在字节边界(在X方向)上对齐窗体。此类型将影响到在窗体显示时它的宽度和它的水平位置。CS_CLASSDC分配一个设备坏境并被类中的所有窗体共享。由于窗体类被处理特化,它是可以适用于一个应用程序的若干线程创建一个相同类的窗体。它同样适用于多个线程试图同时使用相同的设备坏境。当此种情况发生时,系统只允许一个线程去成功的它的绘图操作。CS_DBLCLKS当指针在属于此类的窗体内部,并且用户双击鼠标时,将会发送一个双击消息到窗体程序。CS_GLOBALCLASS指定此窗体类是一个应用程序全局类。应用程序全局类是由一个在进程中对所有模块有效的exe或ddl注册的一个窗体类。CS_HREDRAW如果窗体被
26、移动或尺寸调整器改变了客户区的人小,重绘全部的窗体。CS_NOCLOSE关闭按扭不可用。CS0WNDC为此类中的每一个窗体分配唯一的设备坏境。CS_PARENTDC设置子窗体中剪卜的矩形到父窗体中,以使子窗全可以在父窗体上绘图。一个具有CS_PARENTDC属性控制的窗体从设备坏境的系统缓存中接收到一个规则的设备环境。它不把父窗体的设备环境或设备坏境设置给予子窗体。指定CS_PARENTDC以提高应用程序的性能。CS_SAVEBITS保存被此类的一个窗体摭住的屏幕图彖的一部分为位图。当窗体被移动,系统使用保存过的位图去恢复屏幕图彖,包括其它被摭住的窗体。因此如果被位图使用内存没有被释放,并且其
27、它的屏幕动作没有使储冇的图像无效。系统不会发送WM_PAINT消息到被摭盖的窗体。这种类型对在其它屏幕动作发生时被暂时显示小窗体(如菜单或对话框)很有用。这种类型増加了显示窗体所需的时间,因为系统必须先分配内存去存储位图。CS_VREDRAW如果窗体被移动或尺寸调整器改变了客户区的高度,重绘全部的窗体。看下面的一个综合实例:#includeLRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);/函数声明intWINAPIWinMain(HINSTANCEhlnstance,HINSTANCEhPrevlnstance,LPSTRIpCmdLineJnt
28、nCmdShow)主函数体staticTCHARszAppName=TEXT(”HelloWin”);staticTCHARszClassName=TEXTrHelloWinClass“);HWNDhwnd;声明窗II句柄,HWND是宏定义的数据类型MSGmsg;声明消息对彖,MSG为消息结构体WNDCLASSwndclass;/窗I1类结构体定义了一个窗II对彖wndclass.style=CS_HREDRAW|CS_VREDRAW;窗II显示模式wndclass.lpfnWndProc=WndProc;/对象的窗II过程指针成员指向窗II过程函数(处理所有响应的消息),wndclass.c
29、bClsExtra=0;调用RegisterClassS时不提供额外的空间wndclass.cbWndExtra=0;/调用CreateClass时不提供额外的空间wndclass.hlnstance=hlnstance;窗II实例句柄接受形参hlnstancewndclass.hlcon二Loadicon(NULL,IDI_APPLICATION);图标成员旬柄赋值wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);鼠标成员句柄赋值wndclass.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);/背景成
30、员句柄赋值wndclass.lpszMenuName=NULL;/指向菜单名称的长整形指针为空wndclass.lpszClassName=szClassName;/指向类名的长整形指针指向数组szClassNameif(!RegisterClass(&wndclass)如果注册窗II类失败,返回0,在创建窗II前耍先调用注册窗I啖,参数是窗II对象指针或引用MessageBox(NULL,TEXT(HthiSprogramrequireswindowsNTjszAppName,MBJCONERROR);return0;创建窗II,调用窗II创建函数,传递实参,返回值新窗II句柄给hwndhw
31、nd=CreateWindow(szClassName,TEXT(Hthishellowinprogram),WS.OVERLAPPEDWINDOW,/窗口类名,窗口标题名,窗口样式CW_USEDEFAULT,窗IIx轴位置缺省,即使用默认值CW_USEDEFAULT,窗IIy轴位置缺省,即使用默认值CW_USEDEFAULT,窗II宽度缺省CW_USEDEFAULT,窗II高度缺省NULL,窗门没启父窗IINULL,窗II菜单栏为空hInstance,/窗I1实例句柄NULL);ShowWindow(hwnd,nCmdShow);调用窗II显示函数,传递窗II旬柄和窗II显示样式Update
32、Window(hwnd);调用窗I1刷新函数while(GetMessage(&msgfNULL,0,0)/用接收作用于窗口的消息TranslateMessage(&msg);消息转换DispatchMessage(&msg);/将消息发给窗II函数,returnmsg.wParam;LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMiParam)得到消息后系统会进行回调,执行回调函数HDChdc;PAINTSTRUCTps;RECTrect;switch(message)caseWM_CREATE:MessageBo
33、x(NULLJEXT(creating,l),TEXT(,hellowinMessage,),MB_OK);return0;caseWM_PAINT:hdc=BeginPaint(hwnd,&ps);GetClientRect(hwnd,&rect);DrawText(hdcJEXTCHellowindows98”),4&rect,DT_SINGLELINE|DT.CENTER|DT_VCENTER);EndPaint(hwnd,&ps);return0;caseWM_DESTROY:PostQuitMessage(O);return0;returnDefWindowProc(hwnd,mes
34、sage,wParam,IParam);程序分析:程序开头是一段函数声明:LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);LRESULTCALLBACK其实是函数WndProc的函数类型,即函数返回值类型,他们是宏,意思是LongResultCallBack返回长整形的数据。在windowsAPI中,得到Message消息Z后系统会进行回调,这时,我们需要一个回调函数,这个问题要从windows运行机制说起.Windows是以消息为基础,事件为驱动而运行的,所谓消息就是诸如光标移动,鼠标点击左右健,双击时,会使得windows发出一个消息给应用程
35、序,总Z就是windows发出一个通知,告诉应用程序某个事件发生了。当一个事件发生后,如点击了鼠标左键,这时windows会产生一个message,传递给指定的窗II进行处理,这时就需要有一个接门来给系统调用。这个函数LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);中的第一个参数HWND,是消息要传递的窗II,参数2是消息的ID(就是这是个什么样的消息,比如鼠标左键按卜事件刈应的消息是WM_LBUTTONDOWN,即windowsMessageeftButtonDown),参数3和4是消息的具体内容。函数声明后是主调函数:intWINAPIWin
36、MainfHINSTANCEhlnstancelNSTANCEhPrevInstanceAPSTRIpCmdLineJntnCmdShow)第一个参数是当前的实例旬柄,第2个参数是上一个实例旬柄,通常设为NULL,第3个参数是指向字符串的指针,第4个指针是一个整形数据,表示窗II显示的模式。说到句柄handle,它有点类似C+中的指针,但又不完全实现指针的作用,它是一个指向某一结构体的指针。这个结构体中只有一个整形参数。它的功能就好比是锅柄,你要使用锅,你就必须先握住锅柄,而具体怎么使用这个锅,就不是锅柄的事情了。WindowsAPI程序中都需要一个handle作为输入参数,这是因为API要和
37、许多底层的东西打交道,而这些东西是不允许改动的,因而使用了handle而不是真正意义上的指针,handle在这里只是一个中河人,用来记录对彖的最新地址,你知道handle在那里,但你不知道对彖在那里,而handle却知道对象在那里。窗口图标样式函数:Loadicon函数HICONLoadicon(HINSTANCEhlnstance,LPCSTRIpIconName)该函数从与hlnstance模块相关联的可执彳亍文件中装入IpIconName指定的图标资源,进当图标资源还未装入时该函数才执行装入操作,否则只获取装入的资源句柄。参数说明:IpIconName是指向NULL字符结尾的字符串指针,
38、它包含图标名,如果要使用windows预定义的图标,则实例句柄必须为NULL,IpIconName贝lj可以是下列值:IDI_APPUCATION:32512IDI_QUESTION:332514IDI_HAND:32513IDI.EXCLAMATION:32515IDI_ASTERISK:32516IDI_WINLOGO:32517这些值对应了不同的windows图标。窗口背景样式函数:GetStockObjectGetStockObject函数:该函数检索预定义的备用笔,刷子,字体或调色板的句柄函数原型:HGDIOBJGetStockObject(intfnObject)其中HGDIOBJ
39、是handle_GDI_Object.参数:fnObject:指定对彖的类型,该参数可取如卜值2;BLACK_BRUSH:黑色画笔;DKGRAY_BRUSH:暗灰色画笔:DC_BRUSH:在Windows98,WindowsNT5.0和以后版本中为纯颜色画笔,缺省色为白色,可以用SetDCBrushColor函数改变颜色,更多的信息参见以卜的注释部分。GRAYBRUSH:灰色画笔;HOLLOW_BRUSH:空画笔(相当于HOLLOW_BRUSH);LTGRAY_BRUSH:亮灰色画笔;NULL_BRUSH:空画笔(相当于HOLLOW_BRUSH);WHITE_BRUSH:白色画笔;BLACK_
40、PEN:黑色钢笔;DC_PEN:在Windows98、WindowsNT5.0和以后版本中为纯色钢笔,缺省色为白色,使用SetDCPenColor函数可以改变色彩.WHITE_PEN:白色钢笔;ANSI_FIXED_FONT:在Windows中为固定间距(等宽)系统字体:ANSI_VAR_FONT:在Windows中为变间距(比例河距)系统字体:DEVICE_DEFAUCT_FONT:在WindowsNT+为设备相关字体:DEFAULT_GUI_FONT:用户界面对象缺省字体,如菜单和对话框;OEM_FIXED_FONT:原始设备制造商(OEM)相关固定间距(等宽)字体;SYSTEM_FONT
41、:系统字体,在缺省情况卜一,系统使用系统字体绘制菜单,对话框控制和文本;SYSTEM_FIXED_FONT:固定间距(等宽)系统字体,该对象仅提供给兼容16位Windows版本:DEFAULT_PALETTE:缺省调色板,该调色板由系统调色板中的静态色彩组成。返回值:如果成功,返回値标识声请的逻辑对彖,如果失败,返回值为NULL。WindowsNT:若想获得更多错误信息,请调用GetLastError函数。注释:仅在CS_HREDRAW和CS_UREDRAW风格的窗II中使用DKGRAY_BRUSH、GRAY_BRUSH和LTGRAY_BRUSH对彖。如果在其他风格的窗II中使灰色画笔,可能导
42、致在窗II移动或改变人小Z后出现画笔模式错位现彖,原始储存画笔不能被调整。HOLLOW_BRUSH和NULL_BRUSH储存对象相等。由DEFAULT_GUI_FONT储存对彖使用的字体将改变。当想使用菜单、对话框和其他用户界面对彖使用的字体时请使用此储存对象。不必要通过调用DeleteObject函数来删除储存对象。创建窗口函数:CreateWindow()函数功能:该函数创建一个重叠式窗II、弹出式窗II或子窗II。它指定窗II类,窗II标题,窗II风格,以及窗II的初始位置及人小(可选的)。该函数也指定该窗II的父窗II或所属窗II(如果存在的话),及窗II的菜单。若要使用除Create
43、Window函数支持的风格外的扩展风格,则使用CreateWindowEx函数(扩展函数)代替CreateWindow函数。函数原型:HWNDCreateWindowfLPCTSTRlpClassName,LPCTSTRIpWindowName,DWORDdwStyleJntxzintyjntnWidth,intnHeight,HWNDhWndParenHMENUhMenu,HANDLEhlnstance,LPVOIDIpParam);参数:IpClassName:指向一个空结束的字符串或整型数atom如果该参数是一个整型最,它是由此前调用theGlobalAddAtom函数产生的全局屋。这个
44、小于OxCOOO的16位数必须是IpClassName参数字的低16位,该参数的高位必须是0。如果IpClassName是一个字符串,它指定了窗II的类名。这个类名可以是任何用函数RegisterClassEx注册的类名,或是任何预定义的控制类名。请看说明部分的列表。LPWindowName:指向一个指定窗II名的空结束的字符串指针。如果窗II风格指定了标题条,由IpWindowName指向的窗II标题将显示在标题条上。当使用Createwindow函数来创建控制例如按钮,选择框和静态控制时,可使用IpWindowName来指定控制文本。dwStyle:指定创建窗II的风格。该参数可以是下列窗
45、II风格的组合再加上说明部分的控制风格。风格意义:WS_BORDER:创建一个单边框的窗1丨。WS_CAPTION:创建一个有标题框的窗II(包括WS_BODER风格)。WS_CHIID:创建一个子窗II。这个风格不能与WS_POPUP风格合用。WS_CHLDWINDOW:与WS_CHILD相同。WS_CLIPCHILDREN:当在父窗II内绘图时,排除子窗II区域。在创建父窗II时使用这个风格。WS_CLIPBLINGS;排除子窗IIZ间的相对区域,也就是,当一个特定的窗II接收到WM_PAINT消息时,WS_CLIPSIBLINGS风格将所有层叠窗II排除在绘图Z外,只重绘指定的子窗II。
46、如果未指定WS_CLIPSIBLINGS风格,并且子窗II是层叠的,则在重绘子窗II的客户区时,就会重绘邻近的子窗口。WS_DISABLED:创建一个初始状态为禁止的子窗II。一个禁止状态的窗口不能接受來自用户的输入信息。WS_DLGFRAME:创建一个带对话框边框风格的窗II。这种风格的窗II不能带标题条。WS.GROUP:指定一组控制的第一个控制。这个控制组由第一个控制和随后定义的控制组成,自第二个控制开始每个控制,具有WS_GROUP风格,每个组的第一个控制带冇WS_TABSTOP风格,从而使用户可以在组间移动。用户随后可以使用光标在组内的控制间改变键盘焦点。WS_HSCROLL:创建一
47、个有水平滚动条的窗II。WS_ICONIC:创建一个初始状态为最小化状态的窗II。与WS_MINIMIZE风格相同。WS_MAXIMIZE:创建一个具有最人化按钮的窗II。该风格不能与WS_EX_CONTEXTHELP风格同时出现,同时必须指定WS_SYSMENU风格。WS_OVERLAPPED:产生一个层叠的窗1丨。一个层叠的窗II有一个标题条和一个边框。与WS_TILED风格相同。WS_OVERtAPPEDWINDOW:创建一个具有WS_OVERLAPPED,WS_CAPTION,WS_SYSMENUWS_THICKFRAME,WS_MINIMIZEBOX,WS_MAXMIZEBOX风格的
48、层叠窗I丨,与WS_TILEDWINDOW风格相同。WS_POPUP:创建一个弹出式窗I丨。该风格不能与WS_CHLD风格同时使用。WS_POPUWINDOW:创建一个具有WS_BORDER,WS_POPUP,WS_SYSMENU风格的窗II,WS_CAPTION和WS_POPUPWINDOW必须同时设定才能使窗II某单可见。WS_SIZEBOX:创建一个可调边框的窗II,与WS_THICKFRAME风格相同。WS_SYSMENU:创建一个在标题条上带仃窗II菜单的窗II,必须同时设定WS_CAPTION风格。WS_TABSTOP:创建一个控制,这个控制在用户按FTab键时可以获得键盘焦点。按
49、KTab键后使键盘焦点转移到下一具有WS_TABSTOP风格的控制。WS_THICKFRAME:创建一个具有可调边框的窗I,与WS_SIZEBOX风格相同。WS_TILED:产生一个层叠的窗II。一个层叠的窗II有一个标题和一个边框。与WS_OVERLAPPED风格相同。WS_TILEDWINDOW:创建一个具有WS_OVERLAPPED,WS_CAPTION,WS_SYSMENUMS_THICKFRAME.WS_MINIMIZEBOX,WS_MAXMIZEBOX风格的层叠窗丨I。与WS_OVERLAPPEDWINDOW风格相同。WSVISIBLE:创建一个初始状态为可见的窗I丨。WSVSCR
50、OLL:创建一个有垂直滚动条的窗口。X:指定窗II的初始水平位置。对一个层叠或弹出式窗II,X参数是屏幕坐标系的窗II的左上角的初始X坐标。对丁子富II,x是子窗II左上角相对父窗II客户区左上角的初始X坐标。如果该参数被设为CW_UCEDEFAULT则系统为窗II选择缺省的左上角坐标并忽略Y参数。CW_USEDEFAULT只对层叠窗II有效,如果为弹出式窗II或子窗II设定,则X和y参数被设为零。Y:指定窗II的初始垂直位置。对一个层叠或弹出式窗口,y参数是屏幕坐标系的窗II的左上角的初始y坐标。对丁子窗II,y是子窗II左上角相对父窗II客户区左上角的初始y坐标。对丁列表框,y是列表框客户
51、区左上角相对父窗II客户区左上角的初始y坐标。如果层叠窗II是使用WS_VISIBLE风格位创建的并且X参数被设为CWUSEDEFAULT,则系统将忽略y参数。nWidth:以设备单元指明窗II的宽度。对于层叠窗II,nWidth或是屏幕坐标的窗II宽度或是CW_USEDEFAULToXinWidth是CW_USEDEFAULT,则系统为窗II选择一个缺省的高度和宽度:缺省宽度为从初始X坐标开始到屏幕的右边界,缺省高度为从初始X坐标开始到目标区域的顶部。CW_USEDFEAULT只参层叠窗II有效:如果为弹出式窗丨I和子窗II设定CW_USEDEFAULT标志则nWidth和nHeight被设
52、为零。nHelght:以设备单元指明窗II的高度。对于层叠窗II,nHeight是屏幕坐标的窗II宽度。若nWidth被设为CW_USEDEFAULT,则系统忽略nHeight参数。hWndParent:指向被创建窗口的父窗口或所有者窗口的旬柄。若要创建一个子窗口或一个被属窗II,需提供一个有效的窗II句柄。这个参数对弹出式窗口是可选的。WindowsNT5.0:创建一个消息窗II,可以提供HWND_MESSAGE或提供一个己存在的消息窗II的句柄。hMenu:菜单句柄,或依据窗II风格指明一个子窗II标识。对于层叠或弹出式窗II,hMenu指定窗II使用的菜单:如果使用了菜单类,则hMenu
53、可以为NULL。对J:子窗II,hMenu指定了该子窗II标识(一个整型鼠),一个对话框使用这个整型值将事件通知父类。应用程序确定子窗II标识,这个值对于相同父窗II的所有子窗I1必须是唯一的。hlnstance:与窗I1相关联的模块事例的句柄。IpParam:指向一个值的指针,该值传递给窗IIWM_CREATE消息。该值通过在IParam参数中的CREATESTRUCT结构传递。如果应用程序调用CreateWindow创建一个MDI客户窗II,则IpParam必须指向一个CLIENTCREATESTRUCT结构。返回值:如果函数成功,返回值为新窗II的句柄:如果函数失败,返回值为NULL。若
54、想获得更多错误信息,请调用GetLastError函数。备注:在返回前,CreateWindow给窗I过程发送一个WM_CREATE消息。对于层叠,弹出式和子窗II,CreateWindow给窗口发送WM_CREATE,WM_GETMINMAXINFO和WM_NCCREATE消息。消息WM_CREATE的IParam参数包含一个指向CREATESTRUCT结构的指针。如果指定了WS_VISIBLE风格,CreateWindow向窗II发送所有需要激活和显示窗II的消息。消息获取函数:GetMessage()GetMessage()函数功能:该函数从调用线程的消息队列里取得一个消息并将其放于指定
55、的结构。此函数可取得与指定窗口联系的消息和由PostThreadMesssge寄送的线程消息。此函数接收一定范由的消息值。GetMessage不接收属丁其他线程或应用程序的消息。函数原型:BOOLGetMessage(LPMSGIpMsg,HWNDhWnd,UINTwMsgFilterMin,UINTwMsgFilteMax参数:IpMsg:指向MSG结构的指针,该结构从线程的消息队列里接收消息信息。hWnd:取得其消息的窗II的句柄。这是一个有特殊含义的值(NULL)。GetMessage为任何属丁调用线程的窗II检索消息,线程消息通过PostThreadMessage寄送给调用线程。wMs
56、gFilterMin:指定彼检索的最小消息值的整数。wMsgFilterMax:指定被检索的最人消息值的整数。返回值:如果函数取得WM_QUITZ外的其他消息,返回非零值。如果函数取得WM_QUIT消息,返回值是零。如果出现了错误,返回值是。例如,当hWnd是无效的窗I1句柄或IpMsg是无效的指针时。若想获得更多的错误信息,请调用GetLastError函数。备注:应用程序通常用返回值来确定是否终止主消息循坏并退出程序。GetMesssge只接收与参数hWnd标识的窗口或子窗口相联系的消息,子窗口由函数IsChild决定,消息值的范围由参数wMsgFilterMin和wMsgFilterMa
57、x给出。如果hWnd为NULL,则GetMessage接收属J:调用线程的窗II的消息,线程消息由函数PostThreadMessage寄送给调用线程。GetMessage不接收属丁其他线程或其他线程的窗II的消息,即使hWnd为NULLo由PostThreadMessage寄送的线程消息,其消息hWnd值为NULL。如果wMsgFilterMin和wMsgFilterMax都为零,GetMessage返回所有可得的消息(即,无范围过滤常数WM_KEYFIRST和WM_KEYAST可作为过滤值取得与键盘输入相关的所有消息:常数WM_MOUSEFIRST和WM_MOUSELST町用来接收所有的鼠
58、标消息。如果wMsgFilterMin和wMsgFilterMax都为零,GetMessage返回所有可得的消息(即,无范R习过滤)。GetMessage不从队列里清除WM.PAINT消息。该消息将保留在队列里直到处理完毕。注意,此函数的返回值可非零、零或-1,应避免如下代码出现:while(GetMessage(IpMsg,hwnd0,0)一1返回值的可能性表示这样的代码会导致致命的应用程序错误。显示窗口函数:ShowWindow(hwnd,nCmdShow)参数hwnd表示所创建的窗II的句柄,第二个参数nCmdShow用來表示窗II初始状态所显示的形式,常见的有四种形式:SW.SHOWM
59、AXIMIZED(最大化一个窗口,并激活);SW_SHOWMINIMIZED(最小化一个窗口,并激活);SW_SHOWMINNOACTIVE(最小化一个窗口但不激活);SW_SHOWNORMAL(正常形式显示一个窗口)消息循环函数:调用窗II刷新函数后,窗II显示完毕,Z后的程序需要处理的是由键盘和鼠标发送的消息。Windows是基丁消息驱动机制的,windows会为当前运行的每个windows程序维护一个消息队列。当发生某个事件后,windows将事件转换为对应的消息,并将消息放入相应的“消息队列”。然后,程序从自己的消息队列中按一定的次序读取消息并发送给相应的窗II函数消息结构体MSG在W
60、INUSE.H中定义如下:typedefstructtagMSGHWNDhwnd;WPARAMLPATAMDWORDwParam;IParam;time;其中POINT也是一个结构体,用以表示屏幕上的一个点的坐标,其定义如下:typedefstructtagPOINTLONGX;LONGY;;消息结构(MSG)各个域的定义如下:hwnd接收消息的窗口的句柄。Message消息标识符。wparam消息参数,其含义和数值依据消息的不同而不同。Lparam消息参数,其含义与消息有关。Time,消息进入队列的时间。Pt,消息进入队列时鼠标的坐标。整个消息循坏从GetMessage函数调用开始,从消息队
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 食品厂清洁消毒制度
- 机械行业市场前景及投资研究报告:机器人行业进步发展空间广阔
- 8.4卷积神经网络
- 某汽车厂工艺流程制度
- 2026年森林防火巡查值守试题及答案
- 2026年老年痴呆失能照护试题
- 工程监理员试题及答案
- 高中电路讲解测试题及答案
- 高三语文期中试题及答案
- 护士招聘内部考试题及答案
- 公交驾驶员招聘笔试题及答案
- 2026-2030中国润滑油用添加剂行业应用态势与需求趋势预测报告
- 2026-2030中国尾矿综合利用行业发展规划与投资策略建议报告
- (2026)政工师职称考试题库及答案
- 2026山东省中考语文试题及参考答案(省统考)
- 全过程工程咨询服务工程结算
- 2026年江苏省自考08295生态恢复与建设高频考点重点串讲
- 2027年高考物理总复习训练题-电场力的性质
- 2026年巴中市巴州区四年级数学第二学期期末考试模拟试题含答案解析
- 2025(某大型国企)财务岗位招聘笔试试卷附答案
- 九州通财务制度
评论
0/150
提交评论