您好,欢迎访问三七文档
当前位置:首页 > 机械/制造/汽车 > 制造加工工艺 > Windows编程基础.
Windows编程基础Windows编程基础•Windows编程概述–窗口组成–句柄及windows消息•Windows应用程序基本结构•Windows编程方法介绍–利用API编程-----传统方法–利用MFC编程•利用API编程举例•利用MFC编程举例一、Windows编程概述Windows是一个应用于微型计算机的具有图形化用户界面的操作系统。特点:•图形化的窗口界面。•虚拟化的设备接口如图形设备接口(CDI):是一个与设备无关的图形化显示模式接口。窗口、消息、句柄等是Windows编程需要了解的基本概念。•窗口窗口分非工作区和工作区两部分。非工作区:包括窗体边界、标题、菜单、工具栏、状态栏等,由系统控制。工作区:用于用户数据的交互。由用户操作。1窗口一个应用程序的窗口一般包含下列成分:窗口边界工作区控制菜单框下拉菜单水平滚动条垂直滚动条最大化按钮最小化按钮标题栏1窗口•编写一个Windows应用程序首先应创建一个或多个窗口,随后应用程序的运行过程即是窗口内部、窗口与窗口之间、窗口与系统之间进行数据处理与数据交换的过程。2句柄及windows消息•Windows程序的执行取决于事件的触发(事件驱动),由于事件的触发而提供的信息称消息。消息是windows应用程序与windows系统间、windows应用程序间或windows应用程序内部窗口间信息交换的纽带。•应用程序中有各个对象存在,每个对象都有一个由4字节长的数值构成的标识,这个标识称为句柄,应用程序通过句柄访问相应的对象信息。2句柄及windows消息HWND窗口句柄HDC设备环境句柄HBITMAP位图句柄HCURSOR光标句柄HICON图标句柄HFONT字体句柄HMENU菜单句柄HPEN画笔句柄HFILE文件句柄HBRUSH画刷句柄HINSTANCE当前实例句柄2句柄及windows消息消息用于信息交换。消息号:由事先定义好的消息名标识字参数(wParam):用于提供消息的附加信息长字参数(lParam):用于提供消息的附加信息消息typedefstructtagMSG{HWNDhwnd;窗口句柄,为null,则可检索所有驻留在消息队列中的消息UINTmessage;消息值,由Windows.h头文件中的宏定义来标识WPARAMwParam;包含有关消息的附加信息,不同消息其值有所不同LPARAMlParam;DWORDtime;指定消息送至队列的时间POINTpt;指定消息发送时屏幕光标的位置,其数据类型POINT也是一个结构体}MSG;附加信息与具体消息号的值有关,在Win中消息用结构体MSG表示VC中存在几种系统定义的消息分类,不同的前缀符号经常用于消息宏识别消息附属的分类,系统定义的消息宏前缀如下:BN表示按钮控制消息CB表示组合框控制消息DM表示默认下压式按钮控制消息EM表示编辑控制消息LB表示列表框控制消息SBM表示滚动条控制消息WM表示窗口消息二、Windows应用程序基本结构•Windows应用程序与控制台(DOS)应用程序一样有一个入口函数。•控制台应用程序的入口函数:main;Windows应用程序的入口函数:WinMain。(1)WinMain函数三个基本的组成部分:函数说明、初始化和消息循环功能注册窗口类,建立窗口及执行必要的初始化进入消息循环,据接受的消息调用相应的处理过程当消息循环检索到WM_QUIT时终止程序运行WinMain函数WinMain函数说明WinMain函数的说明如下:intWINAPIWinMain(HINSTANCEhThisInst,∥应用程序当前实例句柄HINSTANCehPrevInst,∥应用程序其他实例句柄LPSTRlpszCmdLine,∥指向程序命令行参数的指针IntnCmdShow∥应用程序开始执行时窗口显示方式的整数值标识)注意!Win是多任务管理的,同一应用程序的多个窗口可能会同时存,Win系统对每个窗口的执行称为一个实例,并用一个实例句柄来唯一标识(1)WinMain函数WinMain函数被声明成为返回一个int值,同时还有APIENTRY或WINAPI标识符的修饰。APIENTRY:APIEntry,函数调用约定,windef.h中有定义(在windows.h文件包含了windef.h):#defineWINAPI__stdcall#defineAPIENTRYWINAPI函数调用约定主要约束了两件事:1.确定参数传递顺序2.确定调用堆栈由谁(调用函数或被调用函数)清理__stdcall表示1.参数从右向左压入堆栈2.函数被调用者修改堆栈3.函数名(在编译器这个层次)自动加前导的下划线,后面紧跟一个@符号,其后紧跟着参数的尺寸在win32应用程序里,宏APIENTRY,WINAPI,都表示_stdcall,非常常见。在WinMain函数中定义窗口类(窗体的风格)、注册窗口类、创建窗口、显示窗口、建立消息循环。定义窗口类:WNDCLASSwndclass;//WNDCLASS为结构体,设置窗口基本属性typedefstruct{UINTstyle;//窗口的风格WNDPROClpfnWndProc;//指定窗口的消息处理函数的窗口过程函数intcbClsExtra;//指定分配给窗口类结构之后的额外字节数intcbWndExtra;//指定分配给窗口实例之后的额外字节数HINSTANCEhInstance;//指定窗口过程所对应的实例句柄HICONhIcon;//指定窗口的图标HCURSORhCursor;//指定窗口的鼠标指针HBRUSHhbrBackground;//指定窗口的背景画刷LPCTSTRlpszMenuName;//窗口的菜单资源名称LPCTSTRlpszClassName;//该窗口类的名称}WNDCLASS,*PWNDCLASS;设置窗口基本属性wndclass.style=CS_HREDRAW|CS_VREDRAW;wndclass.lpfnWndProc=WndProc;wndclass.cbClsExtra=0;wndclass.cbWndExtra=0;wndclass.hInstance=hInstance;wndclass.hIcon=LoadIcon(NULL,IDI_APPLICATION);wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);wndclass.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);wndclass.lpszMenuName=NULL;wndclass.lpszClassName=HelloWin;//窗口类名注册窗口类:RegisterClass(&wndclass))创建窗口:CreateWindowhwnd=CreateWindow(HelloWin,//窗口类名,要与注册时指定的相同我的窗口,//窗口标题WS_OVERLAPPEDWINDOW,//窗口样式CW_USEDEFAULT,//窗口最初的x位置CW_USEDEFAULT,//窗口最初的y位置480,//窗口最初的x大小320,//窗口最初的y大小NULL,//父窗口句柄NULL,//窗口菜单句柄hInstance,//应用程序实例句柄NULL);//创建窗口的参数ShowWindow(hwnd,nCmdShow);//显示窗口UpdateWindow(hwnd);//更新窗口,包括窗口的客户区消息循环:当从应用程序消息队列中检取的消息是WM_QUIT时,则退出循环while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);//将虚拟键消息转换为字符消息DispatchMessage(&msg);//将消息发送给窗口过程,这里是WndProc}(2)窗口处理函数也称回调函数,处理发送给窗口的消息。LRESULTCALLBACKWndProc(HWNDhwnd,//窗口句柄UINTmessage,//消息值WPARAMwParam,//字消息附加参数LPARAMlParam);//长消息附加参数LRESULTCALLBACKWndProc(HWNDhwnd,UINTmessage,WPARAMwParam,LPARAMlParam){HDChdc;PAINTSTRUCTps;RECTrc;switch(message){caseWM_CREATE://窗口创建产生的消息return0;caseWM_PAINT:hdc=BeginPaint(hwnd,&ps);GetClientRect(hwnd,&rc);//获取窗口客户区大小DrawText(hdc,TEXT(Hello这是我第一个Windows程序!),-1,&rc,DT_SINGLELINE|DT_CENTER|DT_VCENTER);EndPaint(hwnd,&ps);return0;caseWM_DESTROY://当窗口关闭时产生的消息PostQuitMessage(0);return0;}returnDefWindowProc(hwnd,message,wParam,lParam);//默认的消息处理}三、Windows编程方法介绍1.利用API编程-----传统方法微软提供了一套SDK工具,SDK:SoftwareDevelopmentKit,即软件开发工具包用这种方法编写Windows程序非常繁杂困难。例子Win12.利用MFC编程MicrosoftFoundationClassLibrary,微软基本类库,由微软的AFX小组于1992年创建,MFC类库拥有一个庞大的、扩展的C++类层次结构,封装了SDK结构、功能及应用程序框架的内部技术。由于有了MFC,使我们不必过多做关于界面的设计与实现的工作,而是专注于项目本身的功能实现。MFC包含100多个类,大概可分为以下几种类型:MFC类的种类(不同书归纳有所不同)•根类:CObject:MFC抽象类,提供公共操作:对象的建立和删除,串行化支持等•应用程序框架类:用于构造应用程序的框架,提供公用功能,包括与命令相关的类(CCmdTarget)、窗口应用程序类(CWinApp)、窗口类(CWnd)、文档类(CDocument)、视图类(CView)等。由CWnd派生出来的窗口类包括:标准框架(CFrameWnd)、MDI主/子框架(CMDIFrameWnd/CMDIChildWnd)、对话框(CDialog)、控件(CButton、CStatic、CEdit、CListBox、CComboBox、CScrollBar等)•图形处理类:包括图形设备接口(GDI)类(CGdiObject)和设备环境(DC)类(CDC),CGdiObject类派生类包括:画笔(CPen)、GDI画刷(CBrush)、字体(CFont)、位图(CBitmap)、GDI调色板(CPalette)、绘图区v(CRng)等。CDC派生类包括:客户区设备环境(CClientDC)、全窗口设备环境(CWindowDC)、WM_PAINT消息用设备环境(CPaintDC)、元文件设备环境(CMetaFileDC)等。•文件服务类:文件类(CFile)•数组、列表和映像类•Internent服务类•数据库类•OLE类•调试和异常类MFC创建程序框架:例子Win2例win2_1:基于对话框的MFC框架:CWin2_1APP类例win2_2:SDI的MFC框架:CWin2_2APP类例win2_3:MDI的MFC框架:CWin2_3APP类由CWinAPP派生应用类有成员函数:InitInstance、Run、ExitInstance等。InitInstance是一个必须覆盖的CWinApp成员函数。用应用类定义了一个唯一的全局对象theApp。MFC建立的windows应用程序一样有一个程序入口函数WinMain。可以通过查看“MicrosoftVisualStudio
本文标题:Windows编程基础.
链接地址:https://www.777doc.com/doc-2867674 .html