《第4讲Windows编程基础》由会员分享,可在线阅读,更多相关《第4讲Windows编程基础(65页珍藏版)》请在金锄头文库上搜索。
1、皋衫糙析石簧持跨蛮觉乎蛔崎阉沂缎仔道瘫滓待州培秽尸芋唯熬睛位尉泊第4讲Windows编程基础第4讲Windows编程基础第第第第4 4 4 4讲讲讲讲WindowsWindowsWindowsWindows编程基础编程基础编程基础编程基础主讲:谢昕主讲:谢昕瓣琳昆奔蛛霞周滨冒襄坪熙娘洲楞想真砷瑰观池整诲炬彬腺啪涉庇必衬痈第4讲Windows编程基础第4讲Windows编程基础2 2编程的基本概念编程的基本概念编程的基本概念编程的基本概念与与WindowsWindows系统密切相关的八个基本概念:系统密切相关的八个基本概念:窗口、程序进程、线程消息、事件句柄、API与SDK。啊敬肮淑园牲诫入碌捎
2、圆黑初歪宿配锑栈警烷伐嗣诉慷苑大土巾顽椽凝补第4讲Windows编程基础第4讲Windows编程基础3 31 1 1 1、窗口、窗口、窗口、窗口窗口是Windows本身以及Windows 环境下的应用程序的基本界面单位,但是很多人都误以为只有具有标题栏、状态栏、最大化、最小化按钮这样标准的方框才叫窗口。其实窗口的概念很广,例如按钮按钮和对话框对话框等也是窗口,只不过是一种特殊的窗口罢了。慎哼牙辆民今孽丈难翁呸桌江袍避捍着惕垮控徐眶姿拣朽渠肛妄睁间徐厚第4讲Windows编程基础第4讲Windows编程基础4 42 2 2 2、程序、程序、程序、程序通常说的程序都是指一个能让计算机识别的文件。接
3、触最多的是以exe或者com作为扩展名的文件。注意:程序是静态的,进程是动态的。黔要栋遍当叔憨掘嗅心惫着随盐类稀庞获却瘦深窑政甜扑荧遵欣邓朗秸舅第4讲Windows编程基础第4讲Windows编程基础5 53 3 3 3、进程、进程、进程、进程进程就是应用程序的执行实例(或称一个执行程序),进程是程序动态的描述。一个exe文件,在没有被执行的时候称之为应用程序,当被执行以后,就被操作系统作为一个进程执行了。当关机或退出,进程便消亡彻底结束了生命。进程经历了由“创建”到“消亡”的生命期,而程序自始至终存在于你的硬盘上,不管计算机是否启动。哭稿行黑鞍痛葵免褒整相败铁贪蟹绩氯苫晓饱坊筹囤毡奏烂善输芍
4、榜溪虚第4讲Windows编程基础第4讲Windows编程基础6 64 4 4 4、线程、线程、线程、线程线程是进程的一个执行单元线程是进程的一个执行单元,同一个进程中的各个线程对应于一组CPU指令、一组CPU寄存器以及一个堆栈。进程的动态性,是通过线程来体现的。肄忘汲裕阵涡票陋坝珐轩璃硒傻植憨驴中饮谊衅犁劝低戴迅凿主羔概漆茬第4讲Windows编程基础第4讲Windows编程基础7 75 5 5 5、消息、消息、消息、消息消息是应用程序和计算机交互的途径,在计算机上几乎做每一个动作都会产生一个消息鼠标被移动会产生WM_MOUSEMOVE消息,鼠标左键被按下会产生WM_LBUTTONDOWN的
5、消息,鼠标右键按下便产生WM_RBUTTONDOWN消息等等。柔备耕功势喝拟霖习处劲风茎徊屯宫竭爹掉寒岁蒲劣佬管扰啤磊幕盈师汲第4讲Windows编程基础第4讲Windows编程基础8 8关于消息及消息队列关于消息及消息队列关于消息及消息队列关于消息及消息队列操作系统能够将输入设备的变化上传给应用程序操作系统能够将输入设备的变化上传给应用程序操作系统能够将输入设备的变化上传给应用程序操作系统能够将输入设备的变化上传给应用程序。如用户在某个程序活动时按了一下键盘,操作系统马上能够感知到这一事件,并且能够知道用户按下的是哪一个键,操作系统并不决定对这一事件如何作出反应,而是将这一事件转交给应用程序
6、,由应用程序决定如何对这一事件作出反应由应用程序决定如何对这一事件作出反应由应用程序决定如何对这一事件作出反应由应用程序决定如何对这一事件作出反应。(好比有个蚊子叮了我们一口,我们的神经末梢(相当于操作系统)马上感知到这一事件,并传递给了我们的大脑(相当于应用程序),我们的大脑最终决定如何对这一事件作出反应,如将蚊子赶走,或是将蚊子拍死。)对事件作出反应的过程就是消息响应。对事件作出反应的过程就是消息响应。对事件作出反应的过程就是消息响应。对事件作出反应的过程就是消息响应。懂仇菩迈欲局赁碱呻摘绎屏貉溜艾蜜履窘略真躲内深娥爪尿吹嚼擎铅曹娱第4讲Windows编程基础第4讲Windows编程基础9
7、 96 6 6 6、事件、事件、事件、事件事件是程序对外界动作的反应事件是程序对外界动作的反应。在程序运行的过程中改变窗口的大小或者移动窗口等,都会触发相应的“事件”,从而调用相关的事件处理函数。苗揣肌京掖瞻靳淌截淫融姆雹体煮视绣掉太琵糖磅话综爱涛销厄跪凹卉迭第4讲Windows编程基础第4讲Windows编程基础10107 7 7 7 、句柄、句柄、句柄、句柄句柄是一个指针句柄是一个指针,通过句柄就可以控制该句柄指向的对象。句柄是系统用来标识不同对象类型的工具。如窗口、菜单等,这些东西在系统中被视为不同类型的对象,用不同的句柄将他们区分开来。牌劫酗谭彬勾融煮哎填恫悟坪署掣甩护倔信殉劳瘤铁痕援
8、悍站新赏庇敷峨第4讲Windows编程基础第4讲Windows编程基础1111关于句柄关于句柄关于句柄关于句柄 句柄(句柄(句柄(句柄(HANDLEHANDLEHANDLEHANDLE),资源的标识),资源的标识),资源的标识),资源的标识。操作系统要管理和操作这些资源,都是通过句柄来找到对应的资源。按资源的类型,又可将句柄细分成图标句柄(HICON)、光标句柄(HCURSOR)、窗口句柄(HWND)、应用程序实例句柄(HINSTANCE)等。操作系统给每一个窗口指定的一个唯一的标识号即窗口句柄。 繁哉供曹感酷婉囤挨争兹迭埂沽窘霸捷鸵扁卷耻比袁入既女沾墟产椒忆乎第4讲Windows编程基础第4
9、讲Windows编程基础12128 8 8 8、APIAPIAPIAPI与与与与SDKSDKSDKSDKAPI是英文Application Programming Interface 的缩写,意思是“应用程序接口”,泛指系统为应用程序提供的一系列函数接口。在编程的时候可以直接调用,而不必知道其内部实现的过程,只知道它的原型和返回值就可以了。SDK是英文Software Development Kit的缩写,意思是“软件开发工具包”,微软提供了许多专门的SDK开发包,比如DirectX开发包和语音识别开发包等等。民精窜墙尸蚜楞搏渴谤误谦玄猫粳帜经咋蜗梳讯庙就搅拥亚丝帝焊画敌沼第4讲Windows
10、编程基础第4讲Windows编程基础1313网络安全编程概述网络安全编程概述网络安全编程概述网络安全编程概述 从理论上说,任何一门语言可以在任何一个操作系统上编程,C语言可以在Windows下编程,同样也可以在Linux下编程。编程是一项比较综合的工作,除了熟练使用编程工具以外,还要了解系统本身的内部工作机理和编程语言。吠坠牺觉侠丛筷温虱矾挥摔熬行赣趴基婶忙酋寅陕缸雇螟垄缄狠嚣禾佛烁第4讲Windows编程基础第4讲Windows编程基础1414学习学习学习学习WindowsWindowsWindowsWindows下编程下编程下编程下编程学习语言,选择语言和工具是第一步,而且是非常重要的一步
11、工作,目前的编程语言那么多,有C、C+、C#、Java和汇编语言等等。虽然有很多语言,只要精通一门就够了。从实用的角度来讲,C/C+是最好的选择,而微软公司的VisualC+和Insprise公司(原Borland公司)的C+Builder是其相应开发工具的两大主流。比较流行的是比较流行的是VC+6.0VC+6.0英文企业版英文企业版详核凋亿萍豢钥腥沉盎骋靶塔丛犀挞号剖介桔拆垄螟退答攫哑逗午萎尉咽第4讲Windows编程基础第4讲Windows编程基础1515学习编程需要经历三大步学习编程需要经历三大步学习编程需要经历三大步学习编程需要经历三大步1 1 1 1、读程序、读程序、读程序、读程序语
12、言基础知识、查相关的资料,补充基础知识2 2 2 2、写程序、写程序、写程序、写程序编程贵在动手!要规范、循序渐进。3 3 3 3、积累功能代码、积累功能代码、积累功能代码、积累功能代码分类保存、代码库、效率及正确率。腔惭文尘芭付猖扮狠砾万夫附手妆溢埃恋业绥桅咽幅戈停荧郁虽闯惶桃碱第4讲Windows编程基础第4讲Windows编程基础1616C C C C语言发展的四个阶段语言发展的四个阶段语言发展的四个阶段语言发展的四个阶段 1 1、面向过程的、面向过程的C C语言语言2 2、面向对象的、面向对象的C+C+语言语言3 3、SDKSDK编程编程4 4、MFCMFC编程编程盘袱脐婴粥丰卞驶臭腰
13、兼椰戒催远倍汀藻桶耕碉洞獭嗣泞卷肆烹权田实翠第4讲Windows编程基础第4讲Windows编程基础1717面向过程的面向过程的面向过程的面向过程的C C C C语言语言语言语言 C和C+的最主要区别是:C语言中没有类的概念,C+在C的语法基础上引入了类,所以C+和C的语法是基本相同的。#include void main()printf(Hello DOSn);生栅轩气黍烟寝揽辩钓业排矛递屡击淌畦草抛律碉摩跟逝削炒疑勒沏婿禄第4讲Windows编程基础第4讲Windows编程基础1818读取命令行参数读取命令行参数读取命令行参数读取命令行参数main函数可以带参数,第一个参数是int型的,表
14、示参数个参数个数数,第二个参数是字符指针数组,放命令行参数的内容参数的内容。#include int main(int argc, char *argv ) int i; for (i = 1; i argc; i+) printf(%sn, argvi); return 0;砌彤尺浩冈辽层胰员拽让蜒黔叫仇握烛黑姬摇灯逃稳俱水陷张顺捕弃肩悸第4讲Windows编程基础第4讲Windows编程基础1919面向对象的面向对象的面向对象的面向对象的C+C+C+C+语言语言语言语言面向对象程序设计语言可以将一些变量和函数封装到类中,当变量被类封装后,称之为属性或者数据成员,当函数被类封装后,称之为方法
15、或者成员函数。定义好的一个类,然后定义一个类的实例,这个实例就叫做对象,在C+中可以用类定义对象.萧鲁凉筹键沾式桶诬轩爆戎乏农啮四趁腕直荷柄晋镣砰门丰彰歼呼芭烃狡第4讲Windows编程基础第4讲Windows编程基础2020在在C+C+中使用类中使用类#includeclasspersonpublic:intheart;char*name;intrun()heart=heart+20;returnheart;voidmain()intiRunStop;personZhangSan;ZhangSan.name = 张三;ZhangSan.heart = 72;cout姓名:ZhangSan.n
16、ame endl;cout跑步前心跳 ZhangSan.heartendl;iRunStop = ZhangSan.run();cout跑步后心跳iRunStopendl;徽醇企纲酒萤线翠拈拳威落钵圈扼胎渗属竟纲蹲加碌淤位寅砍始雌刮喊廖第4讲Windows编程基础第4讲Windows编程基础2121SDKSDKSDKSDK编程编程编程编程C库提供了许多函数,可以直接使用。如库提供了许多函数,可以直接使用。如DeleteFile函数来函数来删除一个文件。删除一个文件。#include#includeintmain()DeleteFile(C:test.txt);printf(删除成功n);ret
17、urn0;损买胺竟脾织索猴贰霍扮噬好消颁健额衍微扔咱棵寡缺灯还矣螟叮溶虑癸第4讲Windows编程基础第4讲Windows编程基础2222WindowsWindowsWindowsWindows内部机制内部机制内部机制内部机制 Windows是一个“基于事件的,消息驱动的基于事件的,消息驱动的”操作系统。在Windows下执行一个程序,只要用户进行了影响窗口的动作(如改变窗口大小或移动、单击鼠标等)该动作就会触发一个相应的“事件”。系统每次检测到一个事件时,就会给程序发送一个“消息”,从而使程序可以处理该事件。每次检测到一个用户事件,程序就对该事件做出响应,处理完以后,再等待下一个事件的发生。
18、他嘴驰巢胯酌揪告唾雄璃帝仅洛利承吭撕砰匆极椰譬乞洋羽勤磊涯陌读仙第4讲Windows编程基础第4讲Windows编程基础2323WindowsWindows应用程序、操作系统、计算机硬件之间的相互关系应用程序、操作系统、计算机硬件之间的相互关系 Windows程序内部运行原理侍办萨更幕季浮哺劫砸卜蚤胆怜壶军缴俩抽辊树浇缉李几阎粮旧品试忙讨第4讲Windows编程基础第4讲Windows编程基础2424关于消息及消息队列关于消息及消息队列关于消息及消息队列关于消息及消息队列 操作系统是怎样将感知到的事件传递给应用程序的呢?这是通操作系统是怎样将感知到的事件传递给应用程序的呢?这是通过过消息机制消
19、息机制消息机制消息机制(Message)(Message)来实现的。操作系统将每个事件都包装来实现的。操作系统将每个事件都包装成消息的结构体成消息的结构体MSGMSG来传递给应用程序,来传递给应用程序,MSGMSG结构定义如下:结构定义如下: typedefstructtagMSGHWNDhWnd;/目标窗口句柄UINTmessage;/消息标识WPARAMwParam; /消息参数1(附加信息,16位)LPARAMlParam;/消息参数2(附加信息,32位)DWORDtime;/消息发送时间POINTpt;/消息发送时鼠标的屏幕坐标MSG;岳族汽吨尽爷于楼粟癣措抹场硼翅蕾搁魁窜郝彻甘砍霹羡
20、殷贯颅絮苏谰逻第4讲Windows编程基础第4讲Windows编程基础2525从变量类型区分变量用途从变量类型区分变量用途从变量类型区分变量用途从变量类型区分变量用途int x,y;int x,y;x=30;x=30;y=30;y=30;/x/x和和y y既可以用来表示坐标点,也可以用来表示宽度和既可以用来表示坐标点,也可以用来表示宽度和高度,还可以用来表示身高和体重。高度,还可以用来表示身高和体重。typedef int WIDTHtypedef int WIDTHtypedef int HEIGHTtypedef int HEIGHTWIDTH x;WIDTH x;HEIGHT y;HEI
21、GHT y;/ /好处:好处:我们从变量的类型上就可以知道我们从变量的类型上就可以知道x x和和y y是用来表是用来表示宽度和高度。示宽度和高度。裙宅竿栅就诊迁腆沦餐醒疽几洞浙臻嫌熏喝探孙盆诬佩疙愁哈药尤悬煎齿第4讲Windows编程基础第4讲Windows编程基础2626编写窗口应用程序编写窗口应用程序编写窗口应用程序编写窗口应用程序#include int WINAPI WinMain ( HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) MessageBox (NULL, Hello,
22、Windows!, HelloMsg, MB_OK) ; return 0 ;在在projectproject中选中选Win32 ApplicationWin32 Application示例示例1虐饱鹤丧予淆鬃梧淌碍痊碾随诡晴苞汪缸窍论罚瘴蛤春十厚忘鼻筛狙倦颅第4讲Windows编程基础第4讲Windows编程基础2727WinMainWinMainWinMainWinMain函数函数函数函数 Windows程序的入口函数int WINAPI WinMain( HINSTANCE hInstance, / handle to current instance HINSTANCE hPrevIn
23、stance, / handle to previous instance LPSTR lpCmdLine, / command line int nCmdShow / window show state);物邯坎炒峙肇筏穷生端卯硅异湛碟号庆湍取犹拨恿吧冠室悠取授认关鸿并第4讲Windows编程基础第4讲Windows编程基础2828编写窗口应用程序编写窗口应用程序编写窗口应用程序编写窗口应用程序hInstance :是当前实例的句柄这里表示应用程序本身;hPrevInstance:总是为NULL。在Windows早期版本中,当多次同时运行同一个程序时,系统会创建该程序的多个“实例”,同一程序
24、的所有实例共享代码和内存。程序需要检查hPrevInstance来判断自身的其他实例是否正在运行,以便从已经存在的实例中获取数据。在32位版本中,统一程序运行方式改变了,不再需要了!凑澳即杠炽咳后腿瓶售瞅沃东汐渭讣最雇礼继几荐榷戒晤傍词崭鲜赋莲雨第4讲Windows编程基础第4讲Windows编程基础2929编写窗口应用程序编写窗口应用程序编写窗口应用程序编写窗口应用程序lpCmdLine:是运行程序的命令行用于接受并存放程序运行时所需的参数nCmdShow:用于指定程序窗口最初的显示模式可以正常显示,也可以在初始化就最大化或者最小化。末疗使颁安硷篷主桅绝缓吩拯它色背居姥喧蚕薪憎但跳媒撩晰亩则
25、箩牵出第4讲Windows编程基础第4讲Windows编程基础3030窗口的创建窗口的创建窗口的创建窗口的创建 创建一个完整的窗口需要经过下面四个操作步骤:1.设计一个窗口类;2.注册窗口类;3.创建窗口;4.显示及更新窗口。惮隆辽错醉待竞李鸿美肃寥北萨媚造浮巍赦忙汾旷岩榆凛理沛雇衰坠胁节第4讲Windows编程基础第4讲Windows编程基础31311 1 1 1、设计窗口类、设计窗口类、设计窗口类、设计窗口类typedef struct _WNDCLASS UINT style; /窗口样式 WNDPROC lpfnWndProc; /指向窗口过程函数 int cbClsExtra; /窗
26、口类的附加内存空间(0) int cbWndExtra; /窗口的附加内存空间(0) HANDLE hInstance; /指向程序的实例句柄 HICON hIcon; /指向图标的句柄 HCURSOR hCursor; /指向光标的句柄 HBRUSH hbrBackground; /背景画刷句柄 LPCTSTR lpszMenuName; /菜单资源名 LPCTSTR lpszClassName; /指定窗口类的名称 WNDCLASS; 站瘟那氛簧胆挥切箭灭知何霞假檀埂昏忠我丹埋弄钳矾挛诸讼署焙拼持穴第4讲Windows编程基础第4讲Windows编程基础3232窗口类的类型窗口类的类型窗口
27、类的类型窗口类的类型窗口类的类型窗口类的类型补充知识:补充知识:在程序中经常要用到一类变量,这个变量里的每一位(bit)都对应某一种特性。当该变量的某位为1时,表示有该位对应的那种特性,当该位为0时,即没有该位所对应的特性。当变量中的某几位同时为1时,就表示同时具有几种特性的组合。一个变量中的哪一位代表哪种意义,不容易记忆,所以我们经常根据特征的英文拼写的大写去定义一些宏,该宏所对应的数值中仅有与该特征相对应的那一位(bit)为1,其余的bit都为0。樊弦铅完宜惊瓢盂幢捣骨缄椽孟主挣疤允巨破纬指凑霍窥橱邻央癣牢欠轩第4讲Windows编程基础第4讲Windows编程基础3333窗口类的类型窗口
28、类的类型窗口类的类型窗口类的类型窗口类的类型窗口类的类型使用goto definition,发现CS_VREDRAW=0x0001,CS_HREDRAW=0x0002,CS_DBLCLKS =0x0008,CS_NOCLOSE=0x0200。共同点就是只有一位为共同点就是只有一位为1 1,其余位都为,其余位都为0 0。如果希望某一变量的值既有CS_VREDRAW又有CS_HREDRAW特性,可使用或或或或运算,如:style=CS_VREDRAW|CS_HREDRAW ;如果希望在某一变量原有的几个特征上去掉其中一个特征,用取反取反取反取反()之后再进行与与与与(&)运算。如在刚才的style
29、的基础上去掉CS_NOCLOSE特征,可以用:style=style&CS_NOCLOSE;耐唱核禾孺氓力收胸础眩虑全攘龚蜒兢洼虏萨僳坚措娟今她错赐班卯痒挂第4讲Windows编程基础第4讲Windows编程基础3434窗口过程函数窗口过程函数窗口过程函数窗口过程函数lpfnWndProc:指定了这一类型窗口的过程函数,也称回调函数。回调函数的原理:当应用程序收到给某一窗口的消息时,就应该调用某一函数来处理这条消息。这一调用过程不用应用程序自己来实施,而由操作系统来完成,但是,回调函数本身的代码必须由应用程序自己完成。对于一条消息,操作系统到底调用应用程序中的哪个函数(回调函数)来处理呢?操作
30、系统调用的就是接受消息的窗口所属的类型中的lpfnWndProc成员指定的函数。每一种不同类型的窗口都有自己专用的回调函数,该函数就是通过lpfnWndProc成员指定的。 渣饲迹驰植即涕活物澳鲤吭蘸呻掏宠筷席殆戮桅谤悯味哭俊责揣乾盲考韵第4讲Windows编程基础第4讲Windows编程基础3535窗口过程函数窗口过程函数窗口过程函数窗口过程函数举例:汽车厂家生产汽车好比应用程序创建窗口,用户使用汽车好比操作系统管理窗口,某种汽车在销售前就指定好了修理站(类似回调函数),当用户的汽车出现故障后(类似窗口收到消息),汽车用户(类似操作系统)自己直接找到修理站去修理,不用厂家(类似应用程序)亲自
31、将车送到修理站去修理,但修理站还得由厂家事先建造好。 持续赚添踞攘阉玻钠捆畅言抒驱律酝笛银愁构罩啥归宫菜宁羽俊凸杭棋绝第4讲Windows编程基础第4讲Windows编程基础3636设计窗口类的示例代码设计窗口类的示例代码设计窗口类的示例代码设计窗口类的示例代码WNDCLASSWNDCLASSwndcls;wndcls.style=CS_HREDRAW|CS_VREDRAW;wndcls.cbClsExtra=0;wndcls.cbWndExtra=0;wndcls.hbrBackground=(HBRUSH)GetStockObject(BLACK_BRUSH);wndcls.hCursor
32、=LoadCursor(NULL,IDC_CROSS);wndcls.hIcon=LoadIcon(NULL,IDI_ERROR);wndcls.hInstance=hInstance;wndcls.lpfnWndProc=WindowProc;wndcls.lpszClassName=xiexin2006;wndcls.lpszMenuName=NULL;苇妇黔蔗董匆邻减滤寓憎墙瘩奉迄檀镐陋器霹念谚舔片置血欣榜契风宅炊第4讲Windows编程基础第4讲Windows编程基础37372 2 2 2、注册窗口类、注册窗口类、注册窗口类、注册窗口类刚才有: WNDCLASSWNDCLASSwndc
33、ls;所以:所以:RegisterClass(&wndcls);ATOM RegisterClass( CONST WNDCLASS *lpWndClass);参数lpWndClass:设计窗口类的对象指针丽煎洞皆拯抹愁歉户页蹿矿速培完芭腾巾骑昼被讹续五贱埋瑚错纳闭兽挟第4讲Windows编程基础第4讲Windows编程基础38383 3 3 3、创建窗口、创建窗口、创建窗口、创建窗口HWND CreateWindow( LPCTSTR lpClassName, / 1.pointer to registered class name LPCTSTR lpWindowName, /2. poi
34、nter to window name DWORD dwStyle, / 3.window style int x, / 4.horizontal position of window int y, /5. vertical position of windowint nWidth, /6. window width int nHeight, / 7.window height HWND hWndParent, /8. handle to parent or owner window HMENU hMenu, / 9.handle to menu or child-window identif
35、ier HANDLE hInstance, / 10.handle to application instance LPVOID lpParam /11. pointer to window-creation data ); 脂客瞄颂传讹琳茶秧鹃疆店靡滑锨衬拢意萍乖糊萎位菌竞宛讥许字作谜梳第4讲Windows编程基础第4讲Windows编程基础3939创建窗口创建窗口创建窗口创建窗口的示例代码的示例代码的示例代码的示例代码HWNDhwnd;hwnd=CreateWindow(xiexin2006,Mywindow,WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NUL
36、L,hInstance,NULL);注:创建成功后,返回系统分配给窗口句柄,否则返回NULL。因此要用一个句柄变量(如hwnd)来保存WS_OVERLAPPEDWINDOW类型类型的窗口具有:Creates an overlapped window with the WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKFRAME, WS_MINIMIZEBOX, and WS_MAXIMIZEBOXstyles.瓣厩嗣敢庆牧傀暗读我斯踩甫铁己测姬迭喳骸渤盒磐俐氰协协拌铁奋矢附第4讲Windows编程基础第4讲Windows编程基础40404 4 4 4
37、、显示及更新窗口、显示及更新窗口、显示及更新窗口、显示及更新窗口BOOL ShowWindowShowWindow( HWND hWnd, /窗口创建成功后的句柄 int nCmdShow / 窗口显示状态);BOOL UpdateWindowUpdateWindow( HWND hWnd / 窗口创建成功后的句柄);ShowWindow(hwnd,SW_SHOWNORMAL);UpdateWindow(hwnd);还有:还有:SW_MAXIMIZE , SW_SHOWMAXIMIZED SW_SHOWMINIMIZED SW_SHOWDEFAULT 等晚翱谣疾宠挛子渔赦吭蛮硬裁胡诬届做箱陋涤
38、论播恃萎菜做舆译燥合下朗第4讲Windows编程基础第4讲Windows编程基础4141创建窗口创建窗口创建窗口创建窗口的示例代码的示例代码的示例代码的示例代码HWNDhwnd;hwnd=CreateWindow(xiexin2006,Mywindow,WS_OVERLAPPEDWINDOW,0,0,600,400,NULL,NULL,hInstance,NULL);WS_OVERLAPPEDWINDOW类型类型的窗口具有:Creates an overlapped window with the WS_OVERLAPPED, WS_CAPTION, WS_SYSMENU, WS_THICKF
39、RAME, WS_MINIMIZEBOX, and WS_MAXIMIZEBOXstyles.吝模媳挥起搭玉脑痊涌擅站待雄衍惟岗叁版爵短浚疲驭尖舆陋笑统造具锁第4讲Windows编程基础第4讲Windows编程基础4242WindowsWindowsWindowsWindows消息循环消息循环消息循环消息循环消息队列和在应用程序中的轮询处理 场群挂膨牺侗瞩惟虫籍桐全姓喉性南咸赵垒殃叮油折筹溜蛙居贰啃锣烘驳第4讲Windows编程基础第4讲Windows编程基础4343WindowsWindowsWindowsWindows消息循环消息循环消息循环消息循环BOOL GetMessage( LPM
40、SG lpMsg, / 指向消息结构体的地址 HWND hWnd, / 接收消息的窗口句柄 UINT wMsgFilterMin, / 消息的最小值(一般取0) UINT wMsgFilterMax /消息的最大值(一般取0);后两个参数若都设为0,则接收所有消息;接收到除WM_QUIT 外的消息均返回非0值;对于WM_QUIT返回0,出现错误返回1。眠佬殖松砸奏矾恫氯军恤捣圾鄂矾湃轴坠肛臃都填磐卸胶凤鲸孔陌袱标虹第4讲Windows编程基础第4讲Windows编程基础4444WindowsWindowsWindowsWindows消息循环消息循环消息循环消息循环MSG msg;while(G
41、etMessage(&msg,NULL,0,0)TranslateMessage(&msg);DispatchMessage(&msg);return msg.wParam;TranslateMessage(&msg):将虚拟键消息转换为字符消息DispatchMessage(&msg ):把消息投递到窗口过程爸托遏拄怒幸犊遂带器肘蝉磺违攫改丙悬徒菜唤欢候莱萌元咐暇酿哥调你第4讲Windows编程基础第4讲Windows编程基础4545窗口过程函数窗口过程函数窗口过程函数窗口过程函数LRESULT CALLBACK WindowProc( HWND hwnd, / 消息的窗口句柄 UINT u
42、Msg, / 消息代码 WPARAM wParam, / 消息的附加参数1 LPARAM lParam /消息的附加参数2);该函数内部主要通过switch-case来确定窗口接收的是什么消息,以及如何处理这些消息。帐么勉岔耀绒里扇子迄诈点堆卖晨济献豁砍碎将公坍葬胳握咀巷婚饼罕逃第4讲Windows编程基础第4讲Windows编程基础4646窗口过程函数示例代码窗口过程函数示例代码窗口过程函数示例代码窗口过程函数示例代码LRESULT CALLBACK WindowProc(HWND hwnd,UINT uMsg, WPARAM wParam,LPARAM lParam) switch(uMs
43、g) case WM_LBUTTONDOWN: MessageBox(hwnd,mouse clicked,message,0); break;case WM_CLOSE:DestroyWindow(hwnd);break; case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hwnd,uMsg,wParam,lParam); return 0;细翌彭膘异琼绚埃汝嘶畦按兴嫩躲陌夸妓酣灯销苏做追微就氖证惯皑磺砂第4讲Windows编程基础第4讲Windows编程基础4747总结总结总结总结:SDK:SDK:S
44、DK:SDK开发程序的步骤开发程序的步骤开发程序的步骤开发程序的步骤 1、包含相关头文件,如window.h及stdio.h等2、写WinMain()入口函数A、设计一个窗口类(WNDCLASS)B、注册窗口类(RegisterClass)C、创建窗口(CreateWindow)D、显示及更新窗口(ShowWindowUpdateWindow)E、消息循环(获取、转换、投递消息函数)3、写窗口过程函数用switch来接收各类消息并作相应处理示例示例2簧镰淘我苫嫩菜葛鹿耶渐戍位纲拨疵家徽尿诺吼训绽蛛帘龋菩蟹蜗臼蒋伦第4讲Windows编程基础第4讲Windows编程基础4848利用利用利用利用S
45、DKSDKSDKSDK函数创建窗口函数创建窗口函数创建窗口函数创建窗口 #include#includeWNDCLASSwc;HWNDh_wnd;MSGmsg;/*消息处理函数消息处理函数wndProc的声明的声明*/longWINAPIWindowProc(HWND,UINT,WPARAM,LPARAM);/*winMain函数函数*/intPASCALWinMain(HINSTANCEh_CurInstance,HINSTANCEh_PrevInstance,LPSTRp_CmdLine,intm_Show)wc.lpfnWndProc=WindowProc;wc.hInstance=h_
46、CurInstance;wc.hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH);wc.lpszClassName=ECJTU;樊加愤假蛙酉甘灼既遏璃徐踏希锚营竟膘笆汝遥鉴瓤笨铭钓白但窖旬壹窜第4讲Windows编程基础第4讲Windows编程基础4949利用利用利用利用SDKSDKSDKSDK函数创建窗口函数创建窗口函数创建窗口函数创建窗口 RegisterClass(&wc); /注册窗口类h_wnd=CreateWindow(ECJTU,My Window,WS_OVERLAPPEDWINDOW,0,0,400,500, 0,0,h_Cur
47、Instance,0); /创建窗口/显示窗口ShowWindow(h_wnd,SW_SHOWMAXIMIZED);UpdateWindow(h_wnd); /更新窗口/消息循环while(GetMessage(&msg,NULL,0,0)TranslateMessage(&msg);DispatchMessage(&msg);return (msg.wParam ); 碗殆砍框心鼻误纺巴旁贮畴跌卵韧哉锗奉俯约乒篡佩教际登握书丝刑腕豪第4讲Windows编程基础第4讲Windows编程基础5050利用利用利用利用SDKSDKSDKSDK函数创建窗口函数创建窗口函数创建窗口函数创建窗口 LRES
48、ULTCALLBACKWindowProc(HWNDhwnd,UINTuMsg,WPARAMwParam,LPARAMlParam)switch(uMsg)caseWM_LBUTTONDOWN:MessageBox(hwnd,mouseclicked,message,0);break;caseWM_CLOSE:DestroyWindow(hwnd);break;caseWM_DESTROY:PostQuitMessage(0);break;default:returnDefWindowProc(hwnd,uMsg,wParam,lParam);return0;示例示例3挛茅嗣恩欧走姨蛊恰钒叫厦
49、扒大核凄伴鼎构晰旱乙汽远橙渝拴作双郴辜嫂第4讲Windows编程基础第4讲Windows编程基础5151MFCMFCMFCMFC编程编程编程编程 SDK的功能非常强大,需要记很多的函数,当面向对象编程成为主流的时候,微软将SDK的函数分类进行封装,这就是MFC(MicrosoftFoundationClass)MFC中,函数名及其用法与SDK中基本一致。可多参考MSDN。司拴疾犊狗蝇晒啸聂橡祁昨喜粳废厅崎腋喉怎赫盟蛤缴迹狭渺鸟疥棘肖垫第4讲Windows编程基础第4讲Windows编程基础5252MFCMFCMFCMFC编程基础编程基础编程基础编程基础#includeclasssample:p
50、ublicCFrameWndpublic:sample()/构造函数构造函数Create(NULL,MyWindow);MessageBox(MyWindow,CFrameconstructor);classApp:publicCWinApppublic:BOOLInitInstance();BOOLExitInstance();BOOLApp:InitInstance()/InitInstance函数的定义函数的定义/MessageBox(0,MyWindow,InitInstance,MB_OK|MB_ICONASTERISK);坯乞勒厢瞩洽家眺淫携搪瞄湖韵撵扯黎曰继扮憨抠感澎才候羹北岭热
51、苫侗第4讲Windows编程基础第4讲Windows编程基础5353MFCMFCMFCMFC编程基础编程基础编程基础编程基础sample*obj;obj=newsample;m_pMainWnd=obj;obj-ShowWindow(SW_SHOWMAXIMIZED);returnTRUE;BOOLApp:ExitInstance()/ExitInstance函数定义函数定义MessageBox(0,MyWindow,ExitInstance,MB_OK|MB_ICONHAND);returnTRUE;/创建应用程序对象创建应用程序对象Appappobject;示例示例4新戎壬绕咋于罪歧陋垃诺
52、叭嚏研奄袋源像欲杠悟瞻慈氛跪赵谣少静疡谦瓶第4讲Windows编程基础第4讲Windows编程基础5454MFCMFCMFCMFC编程基础编程基础编程基础编程基础征岁斥倚躁距吼冀苹糊芍打撇匿戳策稼覆糖略笆扫它叫矣患阎伺蓄铬樊空第4讲Windows编程基础第4讲Windows编程基础5555MFCMFCMFCMFC事件处理机制事件处理机制事件处理机制事件处理机制#includeclasssample:publicCFrameWndpublic:sample()/构造函数构造函数Create(NULL,MyWindow);voidOnLButtonDown(UINT,CPoint)MessageB
53、ox(LeftButton,Hello,0);DECLARE_MESSAGE_MAP();BEGIN_MESSAGE_MAP(sample,CFrameWnd)ON_WM_LBUTTONDOWN()END_MESSAGE_MAP()/消息映射消息映射示例示例5外巨森钱袖执裕敦隐阎茶绣诊觉分津暴健冗渔之矛韧玛售背活狞榆天吾指第4讲Windows编程基础第4讲Windows编程基础5656网络安全编程网络安全编程网络安全编程网络安全编程 网络安全基础编程技术主要包括:网络安全基础编程技术主要包括:网络安全基础编程技术主要包括:网络安全基础编程技术主要包括:Socket编程注册表编程文件系统编程定时
54、器编程驻留程序编程多线程编程。惊讹税撞传撒烩堤矩怪暖贫悄迭炸趾范拖价澄绅巢肛瞬霉帘聊潭砒航雹工第4讲Windows编程基础第4讲Windows编程基础5757SocketSocketSocketSocket编程编程编程编程网络安全编程离不开网络编程,凡基于网络应用的程序都离不开Socket。Socket的意思是套接字,是计算机与计算机之间通信的接口。它的出现,使程序员可以很方便地访问TCP/IP,从而开发各种网络应用的程序。使用Winsock提供的API函数是最基本的网络编程技术。盗胎哲垫描锗才剥所箩孰秧囊峙侩邻去豺虞跪瘁酸隶懂怨醛耪苛孽湃疏踞第4讲Windows编程基础第4讲Windows编
55、程基础5858基本概念基本概念基本概念基本概念套接字:描述的是主机间的进程通信机制。提供了进程通信的入口点。套接字用一个半相关描述:(协议,本地主机地址,本地端口)(协议,本地主机地址,本地端口)一个套接字半相关包含本地主机地址、端口号、使用协议类型。一个完整的套接字连接则用一个相关描述:(协议,本地主机地址,本地端口,远地主机地址,远地(协议,本地主机地址,本地端口,远地主机地址,远地端口)端口)一个套接字相关则包含本地主机地址、本地端口号、远地一个套接字相关则包含本地主机地址、本地端口号、远地主机地址、远地端口号以及使用的协议类型。主机地址、远地端口号以及使用的协议类型。伎尝蒋处藤汽钞客绢
56、卢仿菠抒军错噶肌精之需嫡岿灼姑脓诧桓您氦桔袭蒸第4讲Windows编程基础第4讲Windows编程基础5959套接字套接字套接字套接字(socket)(socket)(socket)(socket)的引入的引入的引入的引入随着Unix的应用推广,套接字套接字套接字套接字在编写网络软件中得到了极大的普及。后来,套接字又被引进了Windows等操作系统,成为开发网络应用程序的非常有效快捷的工具。套接字存在于通信区域中。通信区域也叫地址族通信区域也叫地址族通信区域也叫地址族通信区域也叫地址族,它是一个抽象的概念,主要用于将通过套接字通信的进程的共有特性综合在一起。套接字通常只与同一区域的套接字交换数
57、据。WindowsSockets只支持一个通信区域:网际域(AF_INET),这个域被使用网际协议簇通信的进程使用。赖嫂喂牡般周汁备慢沥蚊钵娜银斜帧刃砰席枪骑凶或赚专俄琐搐吨橇乐鲤第4讲Windows编程基础第4讲Windows编程基础6060网络字节顺序网络字节顺序网络字节顺序网络字节顺序不同的计算机存放多字节值的顺序不同,有的机器在起始地址存放低位字节(低位先存低位先存低位先存低位先存),有的机器在起始地址存放高位字节(高位先存高位先存高位先存高位先存)。基于Intel的CPU(即PCPC机)采用的是低位先存低位先存低位先存低位先存。而网络中的TCP/IP协议使用16位整数和32位整数的高
58、位先存高位先存高位先存高位先存格式。为保证数据的正确性,在网络协议中需要指定网络字节顺序。嘻碧呛媒坎馒莆宪铃珍爱尖啃却聘隐傈丫岩配锐列脸冕晰脏赦掩世畅屎铜第4讲Windows编程基础第4讲Windows编程基础6161客户机服务器模式客户机服务器模式客户机服务器模式客户机服务器模式在TCP/IP网络应用中,通信的两个进程间相互作用的主要模式是客户机/服务器模式(client/server),即客户向服务器提出请求,服务器接收到请求后,提供相应的服务。客户机/服务器模式的建立基于两个原因:1、网络中软硬件资源、运算能力和信息不均等2、网间进程通信完全是异步的。C/S模式在操作过程中采取的是主动请
59、求方式。模式在操作过程中采取的是主动请求方式。轿呢饰霄傅疮天翰兵临奖句档市辽怖醇尔唆被盯虑沁羽初插旬携措辽鸦麻第4讲Windows编程基础第4讲Windows编程基础6262客户机服务器模式客户机服务器模式客户机服务器模式客户机服务器模式首先服务器方要先启动,并根据请求提供相应的服务首先服务器方要先启动,并根据请求提供相应的服务:打开一个通信通道并告知本地主机,它愿意在某一地址和端口上接收客户请求。等待客户请求到达该端口。接收到重复服务请求,处理该请求并发送应答信号。接收到并发服务请求,要激活一个新的进程(或线程)来处理这个客户请求。新进程(或线程) 处理此客户请求,并不需要对其它请求作出应答
60、。服务完成后,关闭此新进程与客户的通信链路,并终止。返回第二步,等待另一客户请求。关闭服务器。堕比杉沫影辆塌赐届猎究狞芒阳沦馏陪诡韧鸽盔燕宋掳墅矗吟里酣遮邻私第4讲Windows编程基础第4讲Windows编程基础6363客户机服务器模式客户机服务器模式客户机服务器模式客户机服务器模式客户方:客户方:打开一个通信通道,并连接到服务器所在主机的特定端口。向服务器发服务请求报文,等待并接收应答;继续提出请求。请求结束后关闭通信通道并终止。陶牺探荫禽渡蔑湖漆肝萌臂既圃刨介阂汁烫旅锤恋吸缴续查砍屑女思途件第4讲Windows编程基础第4讲Windows编程基础6464Windows SocketsWi
61、ndows SocketsWindows SocketsWindows Sockets的实现的实现的实现的实现Windows SocketsWindows Sockets是Windows的网络程序设计接口,它是从BerkeleySockets扩展而来的,以动态链接库动态链接库动态链接库动态链接库的形式提供。在继承了BerkeleySockets主要特征的基础上,又对它进行了重要扩充,如一些异步函数异步函数异步函数异步函数及符合Windows消息驱动特性的网络事件异步选择机制网络事件异步选择机制网络事件异步选择机制网络事件异步选择机制。WindowsSockets1.1和BerkeleySock
62、ets都是基于TCP/IP协议的;Sockets2从Sockets1.1发展而来,与协议与协议与协议与协议无关并向下兼容无关并向下兼容无关并向下兼容无关并向下兼容,可以使用任何底层传输协议提供的通信能力,来为上层应用程序完成网络数据通讯,而不关心底层网络链路的通讯情况,真正实现了底层网络通讯对应用程序的透明。寄符迎哗格糠组铱抄挖胖喀瓦戎伪入帐耘厦七甥庞兄间幻岗柒洛艾沟陪讥第4讲Windows编程基础第4讲Windows编程基础6565套接字的类型套接字的类型套接字的类型套接字的类型1、流式套接字(、流式套接字(SOCK_STREAM)提供面向连接、可靠的数据传输服务,数据无差错、无重复的发送,且按发送顺序接收。2、数据报式套接字(、数据报式套接字(SOCK_DGRAM)提供无连接服务。数据包以独立包形式发送,不提供无错保证,数据可能丢失或重复,并且接收顺序混乱。3、原始套接字(、原始套接字(SOCK_RAW)棺辉酝配迁肿别拱倔黄症父妆苦蠢爹上挤鸿许盐毕万税莹肄厉车茎其绸歉第4讲Windows编程基础第4讲Windows编程基础