windows程序设计教程,windows编程 程序每行注释
windows程序设计教程,windows编程 程序每行注释详细介绍
本文目录一览: Windows程序设计教程的目录
第1章概述11.1Windows的发展历史11.2Windows操作系统的基本性质和用途31.3API的基本特征及其发展历程51.4编程工具及其发展概况61.5集成开发环境71.6C程序和Windows程序的比较71.7Windows程序HelloMsg.c的三个基本组成部分81.7.1#include声明和包含文件81.7.2Windows程序HelloMsg.c的进入点81.7.3MessageBox函数101.8字符编码及Unicode简介111.8.1字符集编码的发展简史121.8.2双字节字符集131.8.3Unicode字符集131.9字符的数据类型char和宽字符数据类型wchar141.9.1操作系统中基本数据类型的确定141.9.2单字节字符数据类型141.9.3宽字符数据类型151.9.4宽字符库函数161.9.5字符串函数的Unicode版和ASCII版的合一方法…171.9.6TCHAR.h头文件的作用171.9.7编译命令中_UNICODE识别字的引入171.9.8Windows对宽字符支持181.10应用程序实现Unicode和ASCII混合编码的原理191.10.1WINNT.h是对Unicode支持的头文件191.10.232位系统中的MessageBox函数201.10.3Windows的字符串处理函数211.10.4Windows中的sprintf函数22练习124第2章Windows操作系统的寻址方法与存储器管理252.1Windows的芯片262.2Windows的分段寻址方法262.2.116位实模式262.2.216位保护模式272.2.332位保护模式292.2.4分段寻址方法的缺陷及其消除方法312.332位分页保护模式及其寻址方法312.4抢占式多任务、非抢占式多任务、进程和线程的概念332.4.1进程和线程的概念332.4.2抢占式多任务342.4.3非抢占式多任务342.4.432位抢占式多任务多线程的工作原理362.532位Windows应用程序的消息输入方式372.5.1多线程的开发372.5.232位Windows采用多重输入队列372.632位Windows中虚拟内存空间的划分382.732位Windows中虚拟内存的管理402.7.1内存页与分页文件402.7.2有关地址空间的解释402.7.332位Windows中分配内存页的两种方法——预约与委托412.7.4异常事件及其处理方法432.7.5VirtualQuery()的用法432.7.6改变页保护标识的函数VirtualProtect()452.7.7内存的释放函数VirtualFree()46练习247第3章开发Windows应用程序的技术基础493.1应用程序的结构与编译493.1.1Windows应用程序的结构和C语言程序结构的比较493.1.2Windows应用程序的编译和C语言程序编译的比较503.1.3Windows编译应用程序所需的六个基本文件513.2Windows应用程序设计接口573.3标识符的匈牙利命名惯例583.4事件驱动程序设计593.5动态链接库函数613.6PASCAL调用规范与WINAPI调用规范623.7句柄与代号633.8Windows应用程序的工作原理633.9窗口类的作用及其用法初步65练习366第4章应用程序的分析694.1HELLOWIN.C应用程序694.2WinMain函数的四个参数724.3窗口类结构WNDCLASS734.4窗口类结构的各条款介绍744.5与窗口有关的识别字的介绍764.6和窗口有关的几种结构764.7代号简介774.8函数调用774.9注册窗口类784.10建立窗口784.11显示窗口794.12基本消息循环804.12.1GetMessage(&msg,NULL,0,0)函数804.12.2TranslateMessage(&msg)和DispatchMessage(&msg)函数804.12.3MSG结构及其解释814.13窗口函数82练习484第5章Windows操作系统中的窗口类855.1Windows中的窗口类概述855.1.1系统全局窗口类865.1.2应用专用窗口类865.1.3应用全局窗口类875.2几种窗口类结构介绍875.2.1Windows 95中的扩展窗口类结构875.2.2窗口类条款的补充说明885.2.3Windows NT中的窗口类895.3几个与窗口类有关的函数905.3.1LoadIcon函数905.3.2LoadImage函数915.3.3LoadCursor函数925.3.4CreateSolidBrush函数935.4窗口类的式样955.5设计中值得注意的几个问题97练习598第6章输出1016.1客户区的绘制和更新1026.1.1WM_PAINT消息1026.1.2有效矩形和无效矩形1036.2GDI简介1046.2.1设备描述表1046.2.2获得hDC代号的方法1056.3TextOut函数1096.4重画区域的设定1106.5系统字体1116.5.1字体信息的存储1126.5.2用五个参数表示字体尺寸1126.5.3格式化文字1136.6Windows系统中的视觉元件信息表1156.7字体显示例子SYSMETS1.C1166.7.1SYSMETS1.C窗口函数的分析1196.7.2SYSMETS1.C程序存在问题1206.8滚动条的使用1206.8.1滚动条的范围和地址1216.8.2滚动条消息1226.8.3在SYSMETS1.C中加入滚动功能1246.8.4在WM_VSCROLL消息之后更新客户区的方法1286.9建立更好的滚动1296.9.132位滚动条函数的应用1296.9.2滚动范围的计算1316.9.3新SYSMETS——SYSMETS3.C132练习6138第7章图形程序的编程基础1417.1概论1417.1.1GDI函数及其分类1427.1.2GDI绘制的基本图形1437.1.3图形程序设计的其他问题1447.2设备描述表1457.2.1取得设备描述表代号的方法1457.2.2取得设备描述表中信息的方法1467.2.3保存设备描述表1477.2.4设备描述表的构成1487.2.5DEVCAPS1程序1497.2.6每个度量单位内的像素数目——解析度1527.2.7色彩1537.3画线函数与画笔1557.3.1处理像素的函数1557.3.2画线函数1567.3.3画正弦曲线程序SINEWAVE1587.3.4画线函数与画图函数的关系1597.3.5像素偏差问题1607.3.6LINEDEMO画图程序1637.3.7画笔1647.3.8背景模式、背景颜色及其处理1687.3.9“位布尔运算”与画线模式1697.4画图1717.4.1图形函数1717.4.2图形的填入——画刷1717.4.3画刷的建立、选择和删除1727.5GDI映射方式1747.5.1映射方式概述1747.5.2设备坐标和逻辑坐标176练习7177第8章键盘程序编程基础1798.1键盘输入概论1798.1.1键盘的输入焦点1808.1.2系统消息队列与应用程序消息队列1818.2按键1818.2.1基本概念1818.2.2四个按键消息1828.2.3系统按键消息与非系统按键消息1828.2.4虚拟键码1838.2.5按键消息的参数lParam1878.2.6如何使用GetKeyState函数了解按键的状态1888.2.7按键消息及其使用1898.3字符消息及其处理1928.3.1概述1928.3.2四个字符消息1938.3.3按键消息和字符消息的处理顺序1948.3.4控制字符键及其处理1958.3.5WM_DEADCHAR消息1968.4显示键盘消息和字符消息的显示程序KEYVIEW11978.5字体2028.5.1Windows支持的三种字体2028.5.2Windows中的内定字体2038.5.3显示字体的程序STOKFONT204练习8208第9章鼠标程序编程基础2119.1概述2119.1.1GetSystemMetrics函数的应用2119.1.2预先定义的鼠标游标2129.1.3鼠标消息与键盘消息的区别2129.1.4显示区域内的鼠标消息及其处理方法2129.1.5鼠标消息在其他情况下的处理2149.1.6鼠标消息的处理例子2149.1.7CONNECT程序的应用2169.2按键及其处理2179.2.1Shift Ctrl键的处理2179.2.2为单键鼠标提供右键的处理方法2189.2.3如何使用GetKeyState函数了解鼠标按键状态2199.2.4双击鼠标按键及其处理2199.3非显示区域鼠标消息及其处理2209.3.1非显示区域鼠标消息2209.3.2非显示区域中的命中测试消息2219.3.3从消息产生消息2229.4显示区域中的命中测试程序2239.4.1命中测试程序CHECKER1.C2239.4.2使用键盘模拟鼠标2259.4.3在CHECKER1中加入键盘界面后的程序2269.5子窗口的基本概念2319.5.1用子窗口实现CHECKER程序——CHECKER3.C2319.5.2CHECKER3中添加键盘界面——CHECKER4.C237练习9244第10章预定义窗口类和子窗口控制项24710.1基本概念24710.1.1什么是子窗口控制项24710.1.2怎样建立子窗口控制项24810.1.3控制项的操作25010.1.4Windows系统中的控制项25110.2按钮控制项例程BTNLOOK.C25210.2.1CreateWindow函数的应用25610.2.2按钮控制项的预定义窗口类button25610.2.3按钮控制项的名称标签25710.2.4按钮控制项的式样25710.2.5按钮控制项的尺寸与位置25710.2.6CreateWindow的其他参数25710.3子窗口与父窗口之间的消息传送25810.3.1子窗口向父窗口发送command消息25810.3.2父窗口向子窗口发送消息25910.4按钮26010.4.1按钮的分类26010.4.2分组块26410.4.3如何改变按钮上的文字26410.4.4按钮的可见与启用26410.4.5按钮和输入焦点26510.5按钮控制项的颜色及其设定26610.5.1WM_CTLCOLORBTN消息的应用26810.5.2拥有者自画按钮表面图案的程序OWNDRAW.C26910.6静态控制项27410.6.1预定义静态窗口类的特点27410.6.2静态控制项的窗口式样27510.6.3在静态控制项上写“文字”27510.7滚动条控制项27610.7.1滚动条窗口类27610.7.2滚动条控制项例程COLORS1.C27710.7.3COLORS1程序的设计技巧及有关函数说明28310.8编辑控制项29010.8.1编辑控制项的例程POPPAD1.C29010.8.2编辑控制项的窗口类edit和窗口式样ES_29110.8.3编辑控制项产生的通知码29210.8.4编辑控制项的使用29310.8.5把消息发送给编辑控制项29310.9列表框控制项29410.9.1预定义列表框窗口类listbox29410.9.2列表框式样29510.9.3列表框功能识别字LB_29610.9.4应用功能识别字对列表框中项目进行增删29610.9.5应用功能识别字对列表框中项目进行选择、查找与获得29810.9.6接收来自列表框的通知码299练习10300第11章对话框的使用30311.1概述30311.1.1什么是对话框30311.1.2对话框的分类30411.1.3对话框函数30511.1.4在对话框中使用控制项30611.1.5设计模式对话框的步骤30611.2模式对话框的实例分析30711.2.1最简单的模式对话框例程About1.C30711.2.2对话框模板和控制项的设计31411.2.3较复杂模式对话框的例程ABOUT2.C31811.2.4对话框函数中控制项的使用32511.2.5避免使用整体变量的方法33011.2.6Tab键、游标移动键在控制项输入焦点转移中的应用33111.2.7在对话框上画图33311.2.8将其他函数用于对话框33411.3非模式对话框实例分析33411.3.1模式对话框与非模式对话框的比较33511.3.2非模式对话框例程COLORS2.C337练习11343第12章Windows中的资源34512.1资源描述文件与模块定义文件34512.1.1有关“资源”、“模板”的基本概念34512.1.2资源描述文件34612.1.3模块定义文件34712.2图标34912.2.1概述34912.2.2Developer Studio开发应用程序ICONDEMO的基本方法35012.2.3大图标、小图标的应用35512.2.4解读ICONDEMO.RC和RESOURCE.H文件35612.2.5LoadIcon返回图标代号35612.2.6在应用程序中使用图标35712.3在程序中使用定制游标35812.3.1在窗口类中设置游标35812.3.2用SetClassLong设置子窗口中的游标35812.3.3用SetCursor改变窗口中的游标35912.4字符串资源及其应用35912.4.1什么是字符串资源35912.4.2使用字符串资源的程序段36012.5菜单36112.5.1菜单概念36112.5.2菜单代号、菜单项ID与菜单ID36212.5.3在程序中引用菜单36212.5.4和菜单有关的窗口消息36312.5.5菜单显示例程MENUDEMO.C36612.5.6建立菜单的另一种方法37312.5.7在客户区范围内任意处可以启动的下拉式菜单37412.5.8系统菜单37812.5.9一些改变菜单的函数37912.5.10处理菜单的其他函数37912.6加速键38112.6.1用加速键实现菜单项功能38112.6.2安排加速键的几条规则38212.6.3加速键的实施步骤38212.6.4加速键表模板38212.6.5用Developer Studio生成加速键表模板38512.6.6在程序中加载加速键表38512.6.7消息循环中加入对加速键的处理38612.6.8窗口函数接收加速键的窗口消息38712.7菜单与加速键在应用程序中的应用——POPPAD2实例分析38812.7.1POPPAD2例程38812.7.2加速键表的载入39512.7.3case WM_INITMENUPOPUP消息处理分支的解释396练习12397附录A参考VC++的索引399参考文献403
Windows桌面应用程序设计指南(控件篇16-状态栏)
状态栏是主窗口底部的一个区域,它显示有关当前窗口状态(例如正在被查看的对象以及方式)、后台任务(例如打印、扫描和格式化)或其他上下文信息(例如选择和键盘状态)等。 状态栏通常使用文字和图标表明状态,但也可以包含进度条以及和当前状态相关的命令或者选项菜单。
思考以下问题:
状态栏是一种在不打断用户操作进程的情况下,能很好提供状态信息的方法。但状态栏也容易被忽视,因为体量很轻、展示容易,实际操作中很多用户根本不会注意到状态栏的存在。 这个问题的解决方案不是通过使用花哨的图标、动画或闪烁来吸引用户的注意力,而是根据该限制情况进行设计。你可以通过以下方式改善该限制情况:
只需要确保一件事: 确保状态栏的信息有用、相关但不具有根本重要性。
状态栏有以下几种使用范例: 当前窗口状态 :可在所有视图模式下,显示当前展示内容的来源。
上下文信息 :显示关于用户当前行为的上下文信息。
使用“状态栏”指代该控件,不要使用“状态文字”或其他说法。例如:当前所在页面数展示在状态栏上。
Windows桌面应用程序设计指南(控件篇5-下拉列表&组合框)
使用下拉列表或组合框,用户可以在列表中选择互斥的值。 用户只能选择其中一个选项。使用标准的下拉列表,用户只能在列表中进行选择,但是如果加上组合框,他们也可以输入列表中没有的选项。
下列这几点需要明确:
思考以下问题:
除了以上适用于下拉列表的原则,可编辑式下拉列表还需要注意以下几点:
对于下拉列表, 列表中的选项数量不是选择控件的决定因素 ,它们可能只有一个,也可能成千上万。 可编辑式下拉列表的项目数量多少都无所谓,因为用户也可以输入一个不在列表中的值。 而且下拉列表可以用于输入数据,所以可能无法事先知道项的数量,也可能无法限定数据的值。 始终为可编辑式列表框预留出至少三个项目高度的屏幕空间。
下拉列表和及其组合框有以下几种应用范例:
下拉列表 是一个标准的下拉式列表框,包含一组固定的预设值。当列表收起时,只有选中项目是可见的。用户点击下拉按钮时,展现所有选项。如果要变更选项,用户需要点击展开列表,然后选择另一个选项。
预览式下拉列表 是可以预览选择结果以帮助用户进行选择的下拉列表。
可编辑式下拉列表 是一个下拉组合框,它允许用户输入一个下拉列表中不存在的值。
可编辑式列表框 是一个常规组合框,允许用户输入在下方列表框中不存在的值。
提示符是放置在可编辑下拉列表中作为其默认值的标签或短指令。 与静态文本不同的是,一旦用户在组合框中键入某些内容或获得输入焦点,提示符就会从屏幕上消失。
以下情况,可以使用提示符:
不要仅仅使用提示符来指导用户从列表中选择某些内容或单击按钮。 例如,像“选择一个选项”或“输入一个文件名”然后单击“发送”这样文字的提示符是不必要的。
使用提示符的时候,注意:
在提到下拉列表时:
在提到组合框时:
Windows桌面应用程序设计指南(控件篇18-文本框)
使用文本框,用户可以展示、输入或编辑文字和数字。
思考以下问题:
虽然文本框具有非常灵活这一优点,但它们的缺点是具有最小值的约束。可编辑文本框的限制有:
除了长度限制和可选的旋转控制外,文本框没有任何视觉线索来提示其有效值或格式。这意味着必须要依靠标签将这些信息传递给用户。如果用户输入的文本无效,则必须使用错误提示告知用户错误原因。
一般来说, 应该尽可能多地使用限制性控件。 文本框这类的非限制性控件是最后的选择。即便如此,在考虑限制性时,也要考虑全球不同地区用户的需求。例如,适用于美国邮政编码的限制性控件并不能全球化使用,而非限制性文本框则可以适用于任何邮政编码格式。
文本框是一个有多种使用方式的灵活控件: 数据输入框 :一个用来输入或编辑短字符串的单行、非限制性文本框。
带辅助控件的输入框 :用于输入或编辑字符串的单行非限制性文本框,附带一个帮助用户选择有效值的命令按钮。
文本输入框 :用来编辑或输入长字符串的非限制性多行文本框。
数字输入框 :一种只能键入或编辑数字的单行文本框,可以附带一对方便鼠标操作键入的旋转控件。
数据输出 :不带边框的单行只读文本框,用来展示短的字符串。与静态文本不同,当数据比控件宽时,使用文本框显示的数据可以滚动、选中和复制。
文字输出 :用来展示大段只读文字的多行文本框。
因为文本框通常不会限制为仅接受有效值,所以需要对用户的输入进行确认,并且对可能出现的错误进行处理。在以下几种情形下验证输入问题:
更多详细规则,请参见 错误信息 和 气球状提示 相关章节。
输入提示是作为默认值放置在文本框中的一段标签文字或者简短提示。和其他静态文本不同,输入提示会在用户键入内容或者获取输入焦点的瞬间消失。
使用输入提示的场景有: 1.屏幕空间很有限,使用标签或说明文字不合适,如在工具栏上。 2.提示符主要用于简洁地表明文本框的用途。它不能是用户在使用文本框时需要查看的关键信息。 不要使用输入提示指示用户输入特定文字或点击按钮。例如,输入提示不能是“请输入文件名”或者“点击发送”。
使用输入提示时需要注意:
文本框的长度是预期输入文本长度的视觉线索。当设计文本框大小时:
当提到文本框时:
示例: 在 密码 框中键入密码,然后单击 确定 。
Windows下编程需要看哪些书
猿绦蛏杓朴雀行巳ぃ鋈巳衔癢indows编程需要有以下基础:1、C语言
这方面不用说清华大学谭浩强的《C语言程序设计》。
2、C++语言最好是《Essentil C++》、《C++primer》、《C++编程思想》、《insideC++》、《Effectc++》循序渐进。
有了这两方面的基础可以进入Windows程序设计领域了。
Windows程序设计的三本经典的书籍:
这三本书按照由易到难的顺序依次为: <
<windows程序设计最经典的windows编程入门书,涉及到windows编程最基础的方方面面,书内源程序都是win32程序,条理很清楚,可以了解进行windows设计的一般步骤。
<
<windows核心编程是讲解windows
操作系统内部机制的专著,全面系统地介绍了Windows的各种基本构件,如进程、线程、DLL和内存管理等。
<
<programming server side
Application(英文版),
Windows编程的终极之作,同<
<windows核心编程一样,都是jeffreyrichter的著作,讲解了
windows Server
方面的编程,包括IO完成端口方法,
Service等。如果说读第一本书可以使你完成一些简单的Windows编程,第二本书可以使你成为比较专业的Windows程序设计者,那么最后这本书将使你成为大师级的Windows程序开发者。”windows下多线程编程再推荐《Win32多线程程序设计》,
</windows核心编程一样,都是jeffreyrichter的著作,讲解了
</windows核心编程是讲解windows
</windows程序设计最经典的windows编程入门书,涉及到windows编程最基础的方方面面,书内源程序都是win32程序,条理很清楚,可以了解进行windows设计的一般步骤。
windows编程 程序每行注释
这是《Windows程序设计 第五版》的源代码吧,看书吧,书上出现源代码的下面就是对这段源代码的详细解释。
如果没有书就找个电子版看看吧。
这里可以下载:
http://www.mycodes.net/soft/1693.htm
http://wt1.mycodes.net/book/20031218/WindowsgbCHM.rar
HELLOWIN.C
/*------------------------------------------------------------------------
HELLOWIN.C -- Displays "Hello, Windows 98!" in client area
(c) Charles Petzold, 1998
-----------------------------------------------------------------------*/
#include
//包含Windows 32窗口程序必须的头文件
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; //声明窗口消息处理回调函数
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("HelloWin") ;
HWND hwnd ;
MSG msg ;
WNDCLASwndclass ; //声明窗口结构类
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) GetStockObject (WHITE_BRUSH) ; //窗口背景
wndclass.lpszMenuNam = NULL ; //窗口菜单(无)
wndclass.lpszClassName= szAppName ; //窗口类名称
if (!RegisterClass (&wndclass)) //注册窗口类
{
MessageBox ( NULL, TEXT ("This program requires Windows NT!"), //注册失败 提示 返回
szAppName, MB_ICONERROR) ;
return 0 ;
}
//用注册的窗口类来创建窗口
hwnd = CreateWindow( szAppName, // window class name
TEXT ("The Hello Program"), // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT,// initial x position
CW_USEDEFAULT,// initial y position
CW_USEDEFAULT,// initial x size
CW_USEDEFAULT,// initial y size
NULL, // parent window handle
NULL, // window menu handle
hInstance, // program instance handle
NULL) ; // creation parameters
ShowWindow (hwnd, iCmdShow) ; //显示窗口
UpdateWindow (hwnd) ; //更新窗口(发送一次WM_PAINT消息)
while (GetMessage (&msg, NULL, 0, 0)) //消息循环
{
TranslateMessage (&msg) ; //将键盘消息转换为WM_CHAR消息
DispatchMessage (&msg) ; //分发消息
}
return msg.wParam ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc ;
PAINTSTRUCT ps ;
RECT rect ;
switch (message)
{
case WM_CREATE: //创建消息的处理 放音乐
PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;
return 0 ;
case WM_PAINT: //在Client区域绘制"Hello, Windows 98!"
hdc = BeginPaint (hwnd, &ps) ;
GetClientRect (hwnd, &rect) ;
DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; //字体显示格式
EndPaint (hwnd, &ps) ;
return 0 ;
case WM_DESTROY: //窗口被销毁时发送WM_Quit消息来退出消息循环
PostQuitMessage (0) ;
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ;
}
#include
//windows程序设计必须要包含的头文件
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ; //回调函数的声明,将在wndclass.lpfnWndProc = WndProc ; 中用到
//主函数即入口函数
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)
{
static TCHAR szAppName[] = TEXT ("HelloWin") ; //将"HelloWin"赋给szAppName[]
HWND hwnd ; //定义一个窗口句柄,用来标识窗口
MSG msg ; //定义一个消息结构体,该结构体包含消息的几个数据
WNDCLASS wndclass ; //定义一个窗口类,该窗口类也是个结构体,下面的语句是修改结构体数据
wndclass.style = CS_HREDRAW | CS_VREDRAW ; //窗口绘制模式为水平重绘和垂直重绘
wndclass.lpfnWndProc = WndProc ; //回调函数为一开始申明的函数
wndclass.cbClsExtra = 0 ; //类的附加内存(额外的),不需要就设为0
wndclass.cbWndExtra = 0 ; //窗口的附加内存,同上
wndclass.hInstance = hInstance ;// 当前实例为系统传递过来的实例,只能是这样,其它系统帮你做好了
wndclass.hIcon = LoadIcon (NULL, IDI_APPLICATION) ; //加载ICON图标,NULL加载系统的图标,第二个参数使系统里面图标的一个标识
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; //同上,不过是加载光标
wndclass.hbrBackground= (HBRUSH) GetStockObject (WHITE_BRUSH) ;// 设置窗口背景为白色
wndclass.lpszMenuName = NULL ; //因为没有菜单,所以设为空
wndclass.lpszClassName= szAppName ; //你为你设计的这个窗口类取个名字
if (!RegisterClass (&wndclass)) //注册你刚刚设计好的窗口
{
MessageBox ( NULL, TEXT ("This program requires Windows NT!"),
szAppName, MB_ICONERROR) ; //注册不成功,弹出消息框,显示引号里文字
return 0 ;
}
hwnd = CreateWindow( szAppName, // window class name
TEXT ("The Hello Program"), // window caption
WS_OVERLAPPEDWINDOW, // window style
CW_USEDEFAULT,// initial x position 默认的窗口左上角的X、Y点
CW_USEDEFAULT,// initial y position
CW_USEDEFAULT,// initial x size 默认窗口显示的宽和高
CW_USEDEFAULT,// initial y size
NULL, // parent window handle 没有父窗口
NULL, // window menu handle 没有菜单、菜单句柄为空
hInstance, // program instance handle 程序当前实例,由系统传递
NULL) ; // creation parameters
ShowWindow (hwnd, iCmdShow) ; //显示窗口
UpdateWindow (hwnd) ; //更新窗口
while (GetMessage (&msg, NULL, 0, 0)) //消息循环,获取消息
{
TranslateMessage (&msg) ; //翻译消息,
DispatchMessage (&msg) ;// 分发消息
}
return msg.wParam ; //返回消息里的一个参数,只有退出程序时该值才为0
}
//回调函数的定义
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
HDC hdc ; //定义设备上下文句柄
PAINTSTRUCT ps ; //一个结构体
RECT rect ; //定义一个矩形
switch (message)
{
case WM_CREATE: //接受到的消息,窗口刚刚创建好时发送
PlaySound (TEXT ("hellowin.wav"), NULL, SND_FILENAME | SND_ASYNC) ;//播放声音
return 0 ; //返回
case WM_PAINT: //接受到的消息,窗口发生变化时
hdc = BeginPaint (hwnd, &ps) ; //得到设备上下文句柄
GetClientRect (hwnd, &rect) ; //得到当前客户区矩形
DrawText (hdc, TEXT ("Hello, Windows 98!"), -1, &rect,
DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; //输出引号里文字,后面参数定义它输出的方式
EndPaint (hwnd, &ps) ; //释放设备上下文句柄
return 0 ;
case WM_DESTROY: //窗口销毁时的到的消息
PostQuitMessage (0) ; //退出程序
return 0 ;
}
return DefWindowProc (hwnd, message, wParam, lParam) ; //对没有定义处理方法的消息,系统默认处理
}
如何编写windows ce结构的应用程序
我选择编写的这一应用程序,虽然相对简单,但你却可以从中知道怎么去编写比较复杂的程序(比“Hello World.”复杂)。这一应用程序包括属性页和属性表,即所说的TAB控件,它含有自定义的图标和跳格符,能把参数选择保存到注册表中。
程序开发的一个关键之处是保持和微软用户界面相一致的特性。在开发过程中我尽可能的采用了微软的应用程序的字体和布局,商业开发人员更应该为他们的Windows CE应用程序设计出优美的界面。
获取代码
可以从这里下载这一例程的源代码
类结构
所有的代码加起来也有几千行,共分为5个文件。我选择用微软基础类库(MFC)来实现,软件也具有很好的扩展性。
CCNETConfig:这是程序的主线程,它起动与注册表的连接,建立与CPageTab1, CPageTab2, and CPageTab3的关联,然后利用属性表生成模态对话框,CCNETConfig是独立的。
CPropertySheet: CpropertySheet类基本上是空的,当你点击不同的标签时,MFC会处理不同的属性页,CpropertySheet也是独立的。
CPageTab: CpageTab类包含了与各自标签相关的代码,它完成属性页上数据的保存,传递,校验。
在默认状态下,Embedded Tools软件上传应用程序到/Windows/Start Menu目录下。如果你把应用程序上传到/Windows/Start Menu/Settings目录下,在文件夹中也可以找到图标。
这一结构程序具有三个属性页,如图C所示。CPageTab1处理的是与数据更新相关的任务,CpageTab2处理参数选择相关的任务,CpageTab3传送到cnet.com的任务。
从整体上看,程序并不是很复杂。程序员可以很容易地把代码移植到诸如无线802.11b驱动程序上。
每一个类都有它的特有成员变量表,这些变量能够通过MFC’s DDX保持编译环境的设置。在每一属性页的OnInitDialog函数中都执行UpdateData(FALSE)事件,然后在OnKillActive事件中通过UpdateData(TRUE)校验并把参数保存到注册表。
当OnKillActive事件被触发时程序就会把所有的信息保存到注册表,即使在程序发生异常的时候。而函数OnInitDialog则是对程序进行了初始化。
通过利用资源编辑器,我建立了如图D所示的三个属性表。标题栏遵循了其他程序的设计标准,标题栏下面的文字也采用了其他程序的字体和颜色。
字体下面的直线是采用1bit位图实现并当成一幅图片,除此之外,我还添加了检查框,静态文本框,编辑框,组合框等。
自定义静态文本框的字体和风格
为了获取静态文本框的合适字体,必需在CpageTab类中触发WindowProc事件,而只要发送WM_CTLCOLORSTATIC消息就可以更换静态文本框中的当前字体和字体的颜色了。
WM_CTLCOLORSTATIC把hDC和hWnd传送到静态文本框,在函数中的这些变量如Listing A.所示。
你可以看到,我使用了一个静态变量来生成字体,然后重载这一指针变量就可以更改这些字体。如果你不想改变字体,即不要重载PropertyPages中的WindowProc事件,代码的其他部分都会正常运行。
除了要生成合适的字体外,我还注重把界面设计成具有Windows CE系统专业的水平。
生成带有属性页的属性表
对于以上我生成的附带属性页的属性表,你一定会迷惑这一整个过程。我只是采用了MFC向导来自动生成四个独立的类,其中一个是派生于CpropertySheet类,其他三个是派生于CpropertyPage类。在CWinApp::InitInstance事件中,我在属性表中增加了属性页,如图Listing B所示。
我还举例说明了怎么样从CPropertySheet 和 CpropertyPage而不是从CPropertySheet 和CpropertyPage派生出对象。
我初始化了所有的变量并把页和表关联起来,之后调用DoModal事件就可以生成模态对话框。
当InitInstance返回FALSE,MFC不再执行窗体消息循环。我可以通过使用CPropertySheet::Create()而不是使用CPropertySheet::DoModal()来生成一个非模态对话框。如果我这样做,程序就返回TRUE,窗体消息循环就会进行。如果生成一个非模态对话框而返回FALSE,就会退出消息循环。
访问注册表
为了保存信息到注册表中,程序必需执行CpageTab类中的OnInitDialog和OnKillActive事件。Listing C中的代码说明了这一过程。
MFC能自动访问注册表,这一过程程序执行了GetProfileInt, GetProfileString, WriteProfileInt, 和 WriteProfileString函数。
图E显示了如何把界面上的参数选择和注册表入口关联起来。我采用EMbedded Tools 3.0软件中的Windows CE远程注册表编辑器来查看远距离设备上的注册表。
Windows网络与通信程序设计的目录
第1章 计算机网络基础1.1网络的概念和网络的组成1.2计算机网络参考模型1.2.1协议层次1.2.2TCP/IP参考模型1.2.3应用层(Application Layer)1.2.4传输层(Transport Layer)1.2.5网络层(Network Layer)1.2.6链路层(Link Layer)1.2.7物理层(Physical Layer)1.3网络程序寻址方式1.3.1 MAC地址1.3.2 IP地址1.3.3子网寻址1.3.4端口号1.3.5网络地址转换(NAT)1.4网络应用程序设计基础1.4.1网络程序体系结构1.4.2网络程序通信实体1.4.3网络程序开发环境第2章 Winsock编程接口2.1 Winsock库2.1.1 Winsock库的装入和释放2.1.2封装CInitSock类2.2 Winsock的寻址方式和字节顺序2.2.1 Winsock寻址2.2.2字节顺序2.2.3获取地址信息2.3 Winsock编程详解2.3.1 Winsock编程流程2.3.2典型过程图2.3.3 TCP服务器和客户端程序举例2.3.4 UDP编程2.4网络对时程序实例2.4.1时间协议(Time Protocol)2.4.2 TCP/IP实现代码第3章 Windows套接字I/O模型3.1套接字模式3.1.1阻塞模式3.1.2非阻塞模式3.2选择(select)模型3.2.1 select函数3.2.2应用举例3.3 WSAAsyncSelect模型3.3.1消息通知和WSAAsyncSelect函数3.3.2应用举例3.4 WSAEventSelect模型3.4.1 WSAEventSelect函数3.4.2应用举例3.4.3基于WSAEventSelect模型的服务器设计3.5重叠(Overlapped)I/O模型3.5.1重叠I/O函数3.5.2事件通知方式3.5.3基于重叠I/O模型的服务器设计第4章 IOCP与可伸缩网络程序4.1完成端口I/O模型4.1.1什么是完成端口(completion port)对象4.1.2使用IOCP的方法4.1.3示例程序4.1.4恰当地关闭IOCP4.2 Microsoft扩展函数4.2.1 GetAcceptExSockaddrs函数4.2.2 TransmitFile函数4.2.3 TransmitPackets函数4.2.4 ConnectEx函数4.2.5 DisconnectEx函数4.3可伸缩服务器设计注意事项4.3.1内存资源管理4.3.2接受连接的方法4.3.3恶意客户连接问题4.3.4包重新排序问题4.4可伸缩服务器系统设计实例4.4.1 CIOCPServer类的总体结构4.4.2数据结构定义和内存池方案4.4.3自定义帮助函数4.4.4开启服务和停止服务4.4.5 I/O处理线程4.4.6用户接口和测试程序第5章 互联网广播和IP多播5.1套接字选项和I/O控制命令5.1.1套接字选项5.1.2 I/O控制命令5.2广播通信5.3 IP多播(Multicasting)5.3.1多播地址5.3.2组管理协议(IGMP)5.3.3使用IP多播5.4基于IP多播的组讨论会实例5.4.1定义组讨论会协议5.4.2线程通信机制5.4.3封装CGroupTalk类5.4.4程序界面第6章 原始套接字第7章 Winsock服务提供者接口(SPI)第8章 Windows网络驱动接口标准(NDIS)和协议驱动的开发第9章 网络扫描与检测技术第10章 点对点(P2P)网络通信技术第11章 核心层网络封包截获技术第12章 Windows网络防火墙开发技术第13章 IP帮助函数第14章 Email协议及其编程……
学习《windows程序设计》需要什么基础
很多人从MFC开始学习,结果常常是一头雾水,知难而退;也有人毅力坚强,熬过了MFC的阵痛期,最后却是知其然而不知其所以然,并且思维被限制在MFC的框架之中,遇到稍微有点规模的程序就无从下手了。
以我个人的这些年的Windows开发经历,我建议Windows上的学习路线如下:
首先当然是语言的学习,比如C或C++(STL),它是平台无关的
然后可以从《Windows程序设计》(by
Charles Petzold)入门,从最原始的Windows API开始学习
接下来可以学习《Windows核心编程》(by Jeffrey Richter),
它会让你比较深刻的理解Windows的前台和后台机制
学完上面2本书,对Windows系统已经比较熟悉了,再要深入的话可以学下《Windows 图形编程》(by 袁锋)。
至此,已经可以用API的方式开发大部分Windows应用程序了,
接下来可以学一些常用库,比如MFC,WTL,ATL等,此时学习MFC和一开始就学习MFC已是截然不同的感觉,彼时痛苦难熬,此时会心一笑。
其他就是根据项目需要,专业知识的学习,比如COM技术,网络,D3D等。