您好,欢迎访问三七文档
当前位置:首页 > 机械/制造/汽车 > 制造加工工艺 > 第03章 Windows编程基础
第三章Windows编程基础Windows编程基础知识Windows应用程序常用消息Windows中的事件驱动程序设计Windows应用程序的基本结构跨平台开发原则跨平台应用程序的开发Windows操作平台:Windows3.X是一个16位的操作平台。Windows95/98/NT/2000是一个32位的操作平台。NT/2000是一个全32位的操作系统,而95/98是16位和32位的混合物。WindowsAPI(Win16API和Win32API)Win16(Windows3.x)—Win32S(Windows3.x的32接口)—Win32(Windows95/98/NT)跨平台应用程序的开发原则:1、应用程序中要检测版本2、注意数据类型的变化3、尽量使用通用的API函数4、注意各个版本的区别和支持/不支持的功能5、注意一些函数语法和语义上的改变Win32平台开发工具包Win32平台的常用开发工具1、微软提供的软件开发包(SDK)Win32SDK、OLESDK、ODBCSDK等。2、微软提供的可视化集成开发工具VisualStudio系列产品VisualC++(MFC)、VisualBasic、VisualJ++3、Borland公司的一些开发工具BorlandC++(OWL)、C++Builder、Delphi4、其他的WatcomC++、PowerBuilder窗口窗口是Windows应用程序基本的操作单元,是应用程序和用户之间交互的接口环境,也是系统管理应用程序的基本单位。事件、句柄事件驱动Windows是消息驱动(或事件驱动)的操作系统。句柄和Windows消息1、句柄句柄是整个Windows编程的基础,一个句柄是指Windows使用的一个惟一的整数值(long),用于标识应用程序中不同的对象和同类对象中不同的实例,例如,一个窗口、文件等。常用的句柄类型一些常用的句柄类型:(表3-1)HWNDHBITMAPHINSTANCEHICONHCURSORHMENUHFONTHFILEHPENHDCHBRUSH消息结构定义2、消息消息是Windows应用程序之间及应用程序与Windows操作系统之间进行通信的机制。消息是一个整数值,可以携带两个参数,一个是wParam,另一个是lParam。根据消息的不同,参数所表示的含义也不同。在WindowsAPI中为了方便的使用消息,通常用MSG结构来封装消息。MSG结构的定义:typedefstructtagMSG{HWNDhwnd;//检索消息的窗口UINTmessage;//消息类型WPARAMwParam;//消息附加信息,如键值LPARAMlParam;DWORDtime;POINTpt;}MSG;消息的分类消息的分类系统定义的消息消息内部的消息用户自定义的消息外部的消息系统定义的消息的取值范围:0x0000~0x03FF、0x8000~0xBFFF用户自定义的内部消息的取值范围:0x0400~0x7FF用户自定义的外部消息的取值范围:0xC000~0xFFFF系统定义的消息①.系统定义的消息Windows使用系统定义的消息和应用程序进行通信、控制应用程序。每个系统定义的消息都有一个唯一的数值标识符和相应的宏,例如,按下鼠标左键为:WM_LBUTTONDOWN0x0201按下鼠标右键为:WM_RBUTTONDOWN0x0204用户定义的消息(1)②.用户定义的消息除系统定义的消息外,用户也可以定义自己的消息。用户自定义的消息分为:用户自定义的内部消息和用户自定义的外部消息两类。用户自定义的内部消息一般用于本应用程序内的通信,其他的外部程序不认识该消息。使用用户自定义的内部消息时应注意,定义的内部消息值应大于0x0400。Windows定义了一个宏:#defineWM_USER0x0400用户定义的消息(2)用户自定义的外部消息一般用于不同应用程序之间的通信,其他的外部程序可以认识该消息。使用用户自定义的外部消息必须通过RegisterWindowMessage()API函数在Windows系统中进行注册,成功后,将返回一个0xC000~0xFFFF之间的值。常用消息(1)WM_LBUTTONDOWN单击鼠标左键时产生该消息,其附加的参数wParam中包含了标识鼠标键的按下状态;lParam的低位字节包含了当前光标的X坐标,高位字节包含了当前光标的Y坐标。MK_LBUTTON鼠标键状态参数及其说明(表3-3)MK_MBUTTONMK_RBUTTON按下了鼠标左键按下了鼠标中键按下了鼠标右键常用消息(2)和WM_LBUTTONDOWN相似的消息有:WM_LBUTTONUPWM_RBUTTONDOWNWM_RBUTTONUPWM_MBUTTONDOWNWM_MBUTTONUP常用消息(3)WM_KEYDOWNWM_CHARWM_CREATEWM_CLOSEWM_DESTROYWM_QUITWM_PAINT事件驱动程序设计(1)基于DOS的应用程序主要使用顺序的、过程驱动的程序设计方法。顺序的、过程驱动的程序有一个明显的开始和结束,因此,程序能直接控制事件或过程的顺序。基于Windows的应用程序的设计方法与基于DOS的程序设计方法的主要不同在于Windows程序是事件驱动的,事件驱动的程序的执行顺序不是由程序控制的,而是由事件的发生来控制的。事件驱动程序设计(2)过程驱动程序与事件驱动程序的区别例如,求一个学生的平均成绩的程序开始输入学生的姓名输入第一次成绩输入第二次成绩输入第三次成绩结束计算平均成绩过程驱动设计事件驱动程序设计(3)过程驱动程序与事件驱动程序的区别例如,求一个学生的平均成绩的程序开始结束消息循环输入学生的姓名输入第一次成绩输入第二次成绩输入第三次成绩计算平均成绩事件驱动设计Windows应用程序的基本流程开始初始化应用程序和窗口进入消息循环并检索消息是退出消息?退出程序是否处理该消息?由Windows进行默认处理处理消息是否是否Windows应用程序的文件组成Windows应用程序的组成.CPP或.C文件.H文件.DEF文件//模块属性,可省略.RC文件.MAK文件//工程文件源程序文件//建立projectwin32application,然后建立新文件输入#includewindows.hLRESULTCALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);HINSTANCEghInst;charszAppName[]=WinSDK;charszAppTitle[]=AWindowsSDKApplication;intWINAPIWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnShowCmd//初始窗口显示方式){HWNDhWndMain;MSGMessage;WNDCLASSwc;wc.style=CS_HREDRAW|CS_VREDRAW;wc.lpfnWndProc=WndProc;//窗口消息处理函数wc.cbClsExtra=0;//类扩展内存wc.cbWndExtra=0;//窗口扩展内存wc.hInstance=hInstance;//当前实例句柄wc.hIcon=LoadIcon(NULL,IDI_APPLICATION);wc.hCursor=LoadCursor(NULL,IDC_ARROW);wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);wc.lpszMenuName=NULL;wc.lpszClassName=szAppName;//给定义的类一个名字//1.注册窗口类RegisterClass(&wc);//2.创建窗口hWndMain=CreateWindow(szAppName,//lpClassNameszAppTitle,//lpWindowNameWS_OVERLAPPEDWINDOW,//dwStyleCW_USEDEFAULT,//xCW_USEDEFAULT,//xCW_USEDEFAULT,//nWidthCW_USEDEFAULT,//nHeightNULL,//hWndParentNULL,//hMenuhInstance,//程序句柄NULL);//lpParam//3.显示窗口ShowWindow(hWndMain,SW_SHOWMAXIMIZED);//4.绘制客户区UpdateWindow(hWndMain);//5.消息循环while(GetMessage(&Message,NULL,0,0)){TranslateMessage(&Message);DispatchMessage(&Message);}//6.消息循环结束returnMessage.wParam;}LRESULTCALLBACKWndProc(HWNDhWnd,UINTmessage,WPARAMwParam,LPARAMlParam){switch(message){caseWM_DESTROY:PostQuitMessage(0);default:returnDefWindowProc(hWnd,message,wParam,lParam);}return0;}程序分析(1)程序入口点用C语言编写的DOS程序的入口点是main()函数,Windows程序也需要入口点,称为WinMain()。通常在WinMain函数中完成程序的初始化、创建窗口和进行消息循环。WinMain函数的原型:intFARPASCALWinMain(HINSTANCEhInstance,HINSTANCEhPrevInstance,LPSTRlpCmdLine,intnCmdShow)在Win32平台下,hPrevInstance的值总是为NULL!WinMain的另一种形式:intWINAPIWinMain(…)程序分析(2)类初始化每个应用程序的窗口都有窗口类,应用程序的窗口类必须由Windows初始化和注册一次。窗口类由WNDCLASS结构定义,通过RegisterClassAPI函数。WNDCLASS结构定义如下:typedefstruct_WNDCLASS{UINTstyle;WNDPROClpfnWndProc;intcbClsExtra;intcbWndExtra;HANDLEhInstance;HICONhIcon;HCURSORhCursor;HBRUSHhbrBackground;LPCTSTRlpszMenuName;LPCTSTRlpszClassName;}WNDCLASS;程序分析(3)RegisterClass函数定义注册窗口类是为CreateWindow做准备ATOMRegisterClass(CONSTWNDCLASS*lpWndClass)如果该函数执行成功,将返回一个唯一的类标识,失败时,返回NULL。除使用WNDCLASS和RegisterClass定义和注册类外,在Win32平台下,还可以使用WNDCLASSEX和RegisterClassEx定义和注册。ATOM:字符串表中的16bit的标志符号程序分析(4)创建应用程序窗口通过CreateWindowAPI函数创建窗口;通过ShowWindow和UpdateWindow显示窗口。CreateWindow函数定义如下:HWNDCreateWindow(LPCTSTRlpClassName,LPCTSTRlpWindowName,intx,inty,intnWidth,intnHeight,HWNDhWndParent,HMENUhMenu,HANDLEhInstance,LPVOIDlpParam);ShowWindow只完成了创建窗口显示的一部分工作,它主要负责建立窗口框架、标题栏、菜单栏等窗口的边界元素,而不负责创建窗口的客户区,
本文标题:第03章 Windows编程基础
链接地址:https://www.777doc.com/doc-5198379 .html