您好,欢迎访问三七文档
当前位置:首页 > 行业资料 > 国内外标准规范 > WINDOWSAPI教程
初级WINDOWSAPIC++语言版编程当我们使用着漂亮的界面,方便快捷的应用程序的时候。我们才会发现,以前曾编写的程序是多么的粗糙(TC编写的程序)。简单的界面,16色的显示系统,大大的落后于计算机的发展。简单的说就是杀鸡用牛刀。如何该改变这种情况呢?Microsoft公司在推出windows操作系统的时候给出了简单易行的解决方案。这就是WINDOWS平台API应用程序接口。当然API也是发展的,它从WIN16API发展到了现在普遍使用的WIN32API。只有充分理解API函数功能和用法,才能深入到WINDOWS系统的内部,才能充分挖掘出操作系统给我们提供的强大功能。现在就让我们放弃那DOS应用程序,进入WINDOWS编程的海洋之中吧。要想了解WINDOWSAPI那么我们必须先了解WINDOWS下的程序是如何进行驱动的。同学们可以很清楚的发现到,当你在使用WINDOWS记事本的时候,当键盘输入字符的时候字就会出现在屏幕上。当你移动鼠标的时候,光标就会在屏幕上移动。双击鼠标、单击鼠标就会有相应的事件发生。这些都是由于WINDOWS具有的事件驱动的属性造成的。比如说当你按下键盘的字符键的时候,消息队列就会向程序发送WM_CHAR的消息,如果你所写的程序中含有处理这个消息的函数,程序就会执行它。为了更好的了解WINDOWS编程,这里我必须介绍几个基本的概念:1,句柄:它是WINDOWS编程的基础。一个句柄是指WINDOWS在内存中使用的一个唯一的整数质,是一个4个字节长的数值,用于标识应用程序中不同对象和相同对象的不同实例。这里我列出几种WINDOWS常用的句柄:HWND:标示窗口句柄HINSTANCE:标示当前实例句柄HCOURSOR:标示光标句柄HFONT:标示字体句柄HPEN:标示画笔句柄HBRUSH:标示画刷句柄HDC:标示设备环境句柄HBITMP:标示位图句柄HICON:标示图标句柄HMENU:标示菜单句柄HFILE:标示文件句柄由于WINDOWS应用程序利用WINDOWS消息来与其它的WINDOWS应用程序及WINDOWS系统进行消息交换。所以消息是一个十分重要的对象它的结构如下。typedefstruct{HWNDhwnd;//检索消息的窗口句柄UNITmessage;//代表一个消息的消息质WPARAMwParam;//消息附加信息的字参数LPARAMlParam;//消息附加信息的长字参数DWORDtime;//消息入队时间POINTpt;//消息发送时鼠标的位置point.x;point.y;}tagMSG;2,消息:VC++中消息都用前缀标示消息所属的分类,下面我来介绍一下这些前缀BM表示按钮控制消息CB表示组合框控制消息DM表示默认下压式按钮控制消息EM表示编辑控制消息LB表示列表框控制消息SBM表示滚动条控制消息WM表示窗口消息现在我来对系统常用的一些消息进行说明:1,WM_LBUTTONDOWN:单击鼠标左键时产生2,WM_LBUTTONUP:放开鼠标左键时产生3,WM_RBUTTONUP:放开鼠标右键时产生4,WM_LBUTTONBLCLK:双击鼠标左键时产生5,WM_RBUTTONBLCLK:双击鼠标右键时产生6,WM_KEYDOWN:按下了一个非系统键时产生的消息7,WM_CHAR:同上8,WM_CREATE:由CreateWindow函数发出的消息9,WM_DESTROY:消除窗口时发出的消息10,WM_QUIT:退出程序时发送的消息11,WM_PAINT:做任何移动操作时发出的消息介绍了以上的这些基础入门知识,我们就可以简单的了解一下WINDOWSAPI程序的组成基本结构。它是由入口函数WinMain和窗口函数基本框架,并包含各种数据类型、数据结构与函数等应用组建组成的。其中入口函数WinMain和窗口函数是WINDOWS应用程序的主体。一个基本的WinMain函数应该具有以下的功能:1,注册窗口类,建立窗口及执行其他必要的初始化工作2,进入消息循环,根据从应用程序消息队列接受的消息,调用相应的处理过程。3,当消息循环检索到WM_QUIT消息时中止程序运行WinMain函数有三个基本组成部分:函数说明、初始化和消息循环。(1)函数说明intWINAPIWinMain(HINSTANCEhThisInst,//应用程序当前实例句柄HINSTANCEhPrevInst,//应用程序其它实例句柄LPSTRlpszCmdLine,//指向程序命令行参数的指针intnCmdShow//应用程序开始执行时窗口显示方式的整数值标示)(2)初始化初始化包括窗口类的定义、注册、创建窗口实例和显示窗口四部分。(在以后的程序中我将详细的介绍它们具体的实现方法)(3)消息循环WINDOWS应用程序的运行是以消息为核心的。WINDOWS将产生的消息放入应用程序的消息队列中,而应用程序的WinMain函数从消息循环提取队列中的消息,并将其传递给窗口函数的相应过程处理。它的基本写法如下:MSGMeg;//定义消息//(...)省略了一些内容while(GetMessage(&Meg,NULL,0,0){TranslanteMessage(&Meg);DispatchMessage(&Meg);}在上一篇中我着重介绍了WINDOWSAPI32程序的基本结构框架,您一定想完成自己的第一个WINDOWS程序吧?别忙我先向您介绍一下API的窗口函数,只有了解它您才能进行编程。什么是窗口函数呢?它又定义了什么呢?窗口函数定义了应用程序对接受到的不同消息的响应,其中包含了应用程序对各种可能接受到的消息的处理过程,是消息处理分支控制语句的集合。一般来说,窗口函数由一个或多个switch语句组成。每一个case语句对应一种消息,当应用程序接受到一个消息时,在窗口函数内的相应的case语句就会被激活并执行相应的响应程序模块。简单的说窗口函数就是应用程序处理接受到的消息的函数,其中包含了应用程序对各种可能接受到的有用的消息的处理过程。窗口函数的一般格式是这样的:LRESULTCALLBACKWndProc(HWNDhwnd,//窗口句柄UNITmessage,//代表所处理消息的消息值WPARAMwParam,//消息的附加参数(1)LPARAMlParam//消息的附加参数(2)){...//省略switch(message)//message为标识消息的消息值{case......break;...caseWM_DESTROY:PostQuitMessage(0);default:returnDefWindowProc(hwnd,message,wParam,lParam);}return(0);}窗口函数主体内容是消息处理语句,它由多个case语句组成。您只需要将窗口可能接收到的消息在case语句中编写相应的处理程序段就可以了。在case语句的消息处理程序段中一般都有对消息WM_DESTROY的处理。这个消息是关闭窗口时发出的。一般情况下,应用程序调用函数PostQuitMessage响应这条消息。PostQuitMessage函数的定义如下:voidPostQuitMessage(intnExitCode);//nExitCode为应用程序退出代码在处理case语句中不包含的信息时我们用这个默认处理:returnDefWindowProc(hwnd,message,wParam,lParam);来保证所有发送到窗口的消息都得到了应有的处理。除了了解窗口函数的基本结构,我们还要掌握一些基本WINDOWS程序的数据结构(1)MSG,(定义消息)前文已介绍过了(2)WNDCLASS结构WNDCLASS包含一个窗口类的全部信息。应用程序通过定义一个窗口类来确定窗口的属性。它的定义如下:typedefstructtagWNDCLASS{UNITstyle;//窗口的样式,一般为0WNDPROClpfWndProc;//指向窗口函数的指针intcbClsExtra;//分配在窗口类结构后的字节数intcbWndExtra;//分配在窗口实例后的字节数HINSTANCEhInstance;//定义窗口类的应用程序的实例句柄HICONhIcon;//窗口类的图标HCURSORhCursor;//窗口类的光标HBRUSHhbrBackground;//窗口类的背景刷LPCSTRlpszMenuName;//窗口类的菜单资源名LPCSTRlpszClassName;//窗口类名}WNDCLASS;现在我就可以教您写出自己的第一个WINDOWS程序(点击此处下载)#includewindows.h//窗口函数说明LRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);//初始化窗口类//WinMain函数说明intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInst,LPSTRlpszCmdLine,intnCmdShow){HWNDhwnd;MSGMsg;WNDCLASSwndclass;charlpszClassName[]=窗口;//窗口类名charlpszTitle[]=My_Windows;//窗口标题名//窗口类的定义wndclass.style=0;//窗口类型为缺省类型wndclass.lpfnWndProc=WndProc;//窗口处理函数为WndProcwndclass.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;//窗口类名为窗口示例//窗口类注册if(!RegisterClass(&wndclass))//如果注册失败则发出警告声音{MessageBeep(0);returnFALSE;}//创建窗口hwnd=CreateWindow(lpszClassName,//窗口类名lpszTitle,//窗口实例的标题名WS_OVERLAPPEDWINDOW,//窗口的风格CW_USEDEFAULT,CW_USEDEFAULT,//窗口左上角坐标为缺省值CW_USEDEFAULT,CW_USEDEFAULT,,//窗口的高和宽为缺省值NULL,//此窗口无父窗口NULL,//此窗口无主菜单hInstance,//创建此窗口的应用程序的当前句柄NULL);//不使用该值//显示窗口ShowWindow(hwnd,nCmdShow);//绘制用户区UpdateWindow(hwnd);//消息循环while(GetMessage(&Msg,NULL,0,0)){TranslateMessage(&Msg);DispatchMessage(&Msg);}returnMsg.wParam;//消息循环结束即程序终止时将信息返回系统}//窗口函数LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam){switch(message){caseWM_DESTROY:PostQuitMessage(0);//调用PostQuitMessage发出WM_QUIT消息default://默认时采用系统消息默认处理函数returnDefWindowP
本文标题:WINDOWSAPI教程
链接地址:https://www.777doc.com/doc-2856246 .html