WIN_sdk 编程
- 格式:ppt
- 大小:173.50 KB
- 文档页数:35
安装过程:
1.开始—运行—输入cmd,进入命令提示符界面;
2.通过cd命令进入到安装程序所在目录下;
3.输入批处理命令PSDK-FULL.bat
4.输入批处理命令和程序完整路径,界面如下:
5.进入解压缩后的路径下,点击setup.exe,进入如下页面
6.选择Download下的Install菜单,进入如下界面
6.选择所有的SDK,即Windows SDK,然后点击Start Installation,进入如下界面
7.点击Continue,弹出一个对话框,如图
8.点击Accept按钮,弹出选择路径对话框,如图
9.设置盘符为D:\,其他的默认,点击continue,进入如下界面
10.点击Install Now按钮,会弹出一个提示有风险的对话框,点击确定即可,进入安装界面,
如图
11.等待几分钟,当所有选项前面均已打钩,表示安装完成,界面如下
点击Close完成安装过程。
题目
1.将文章中的英文字体全部改为Tahoma。
2.将文章各段的首行缩进设置为1厘米。
3.将标题设置成七彩霓虹的文字效果。
4.将文章中的所有API改成隶书2号空心。
5.将页面纸张方向设置为横向,纸张大小设置为16开。
注意:全文内容、位置不得随意变动,否则后果自负。
红框之内的文字不得操作,否则后果自负。
什么是WinSDK
大致说来windows编程有两种方法:1. windows c方式(SDK);
2.c++ 方式:即对SDK函数进行包装,如VC的MFC,BCB的OWL 等,如果要深入下去,还是要熟悉SDK。
两种方法有哪些区别呢:SDK编程就是直接调用windows的API 进行编程,但是有上千个API组成(win95的API有两千多个),这种数目太大了,对于编程显然不利。
而MFC把这些API封闭起来,共有一百多个类组成。
一般只需20多个windows类和另外20多个通用的非windows类就可“干活”了,这一改变无疑是有很大好处的。
尽管MFC如此方便,但是要学VC,直接去学MFC却是不明智的选择。
只有在熟悉了MFC的运行机制的情况下,才有可能深入下去。
那些如多少天精通什么什么的书籍其实讲的全是些如怎么使用VC这种工具的话题,学来学去学会了怎么使用VC这种工具,而不能深入MFC编程。
像VB这类工具就更令人感觉到太闷了,不过各有各的好处。
MFC虽然提高了程序员编程的效率,但是也失去了SDK编程的灵活性不好意思,跑题了……
API,全称Application Program Interface,意思是应用程序编程接口。
客户端DDK编译环境配置说明概要文档主要说明DDK编译环境的部署,如何使用该环境进行客户端代码的编译,环境中一些主要命令、如何扩展一些命令。
以及在从VC环境下移植过来后,代码需要改进的一些描述。
文章将着重对相关模块下的sources makefile进行描述。
主要分以下五个部分,各个部分的详细叙述请参见各章节。
1.DDK build server的部署2.DDK环境目录的介绍3.DDK编译工具和操作介绍4.编译过程描述以及tang工程编译分析5.VC源代码移植一些常见编译错误6.一些遗留移植和完善工作DDK build server的部署DDK build server是指存在ddk build环境的服务器,可供每个开发人员下载到自己的开发机器,经过简单的配置就能成为本地ddk编译换进的一套机制。
DDK build server可供公司各个项目组使用,方便的下载,配置并执行编译功能。
目前没有ddk build server部署,大家可以从机器192.168.12.103的共享目录中进行下载。
DDK环境目录的介绍从上图中可以看到红圈标识的几个文件和文件夹,下面一一进行介绍:Bin目录:包含了对应系统平台下的整个环境的工具和编译命令,已经进行环境设置的bat 等。
例如:cl.exe,mc.exe,midl.exe,rc.exe包括编译命令build.exe等。
Inc目录:包含了整个环境中的头文件,其中包含的子目录crt,atl,wtl,ddk,api,mfc等包含了各种不同编程框架,crt以及系统sdk的头文件。
各个子目录都,对应与相应的环境变量一一对应:Crt $( CRT_INC_PATH) = ddk下载目录\inc\crtSdk $( SDK_INC_PA TH)= ddk下载目录\inc\apiWtl $( WTL_INC_PA TH)= = ddk下载目录\inc\wtl80…Lib目录:包含了整个编译环境下的所有lib文件(除用户lib),其中包含的子目录atl,crt,mfc,以及不同操作系统对应的库目录。
Windows API编程入门教程学习各种高级外挂制作技术,马上去百度搜索(魔鬼作坊),点击第一个站进入,快速成为做挂达人。
大家好再次自我介绍一下我是beyondcode,这次心血来潮,计划着做一系列关于Windows API编程的教程,用于帮助一些在Windows API编程上有疑惑的,纳闷的,迷惑的新手朋友们。
先解释一些术语或名词吧SDK是Software Development Kit的简写,也就是软件开发包的意思,其中就包含了我们写程序要用到的一些头文件,库,工具,帮助文档之类的。
Windows API编程是指调用Windows的接口函数来进行程序的编写,例如MessageBox就是一个API函数或者说接口函数。
怎么说都可以,自己理解就行。
如果你连这个都不太懂,我想也不会搜到这篇文章了吧~·为什么做这个系列教程呢,请听我一一道来先,最近遇到一些事一些人,让我真的感觉在这方面的引导入门文章真的很是匮乏,加上Windows SDK头文件中那些复杂,庞大,'烦人'的宏定义与数据类型定义,对于一个新手来说(我所说的新手不单只刚接触编程的,还特指那些在其他语言领域有比较高造诣的朋友)一个纯SDK写的helloworld程序都算是一个有些困难和挑战的任务了吧。
本着帮助别人,高兴自己的原则,我有了这个打算,当然对自己以前所学,所经历做一次回忆,也是这次计划的一部分。
声明一下,本系列教程是面向广大初次接触WIN32SDK程序编写的新手朋友们的,如果你是高手,一笑而过吧~当然,除了一笑而过,也多谢你们提出指正文章中的错误,以免我误人子弟啊~~谢谢Ok废话不多说,进入正题,今天第一篇,讲什么?对于一个新人来说,第一次接触SDK 编程或者说API编程,什么最迷惑你们的,我们讲它,我觉得Windows SDK中那'烦人'的数据类型定义和宏定义应该算这个很角色吧。
其实微软的本意也是善良的,为了减轻程序员的负担,和为了编程的方便,才花了那么多心思与精力定义出了这么一大套数据类型与宏定义,这也是我为什么在之前说它烦人都是加上引号的原因,因为他不是真的烦人,熟练了,你不但不觉得它烦,反而离不开它了,呵呵,日久深情也就是这么来的。
设备网络SDK编程指南1. 简介设备网络SDK是一种用于编写设备网络通信的软件开发工具包。
本文档旨在为开发人员提供使用设备网络SDK进行编程的指南。
2. SDK安装和配置要开始使用设备网络SDK进行编程,需要先安装和配置SDK。
下面是安装和配置SDK的步骤:1.下载SDK安装程序。
2.运行安装程序,按照安装向导完成SDK的安装。
3.配置SDK的环境变量,确保系统能够找到SDK的相关文件和库。
3. 编写网络设备程序使用设备网络SDK进行编程可以方便地实现与网络设备的通信。
下面是编写网络设备程序的基本步骤:1.导入设备网络SDK的库文件。
2.创建设备对象。
3.配置设备的网络设置。
4.建立与设备的连接。
5.发送和接收数据。
6.关闭与设备的连接。
下面是一个简单的示例代码,演示了如何使用设备网络SDK进行编程:import devnetsdk# 创建设备对象device = devnetsdk.Device()# 配置设备的网络设置device.set_network_settings(ip='192.168.1.100', port=8000)# 建立与设备的连接device.connect()# 发送数据device.send_data('Hello, device!')# 接收数据data = device.receive_data()# 关闭与设备的连接device.disconnect()4. SDK文档和示例代码详细的SDK文档和示例代码可以在SDK的安装目录中找到。
文档包括SDK的各种功能和方法的说明,示例代码可以帮助开发人员更好地理解和使用SDK。
5. 开发调试和错误处理在使用设备网络SDK进行编程时,开发人员需要进行调试和处理可能出现的错误。
下面是一些开发调试和错误处理的常用方法:•使用日志记录来跟踪程序的运行情况和调试信息。
•使用异常处理来处理可能发生的错误,避免程序崩溃。
win32 sdk下调用webbrowser控件1. #include <atlbase.h>2. C ComModule _Module;3. #include <atlwin.h>4. #include <windows.h>5. #pragma comment(lib,"atl")6. #pragma comment(lib,"User32.lib")7.8.9. L RESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAMwParam,LPARAM lParam)10. {11. RECT rc;12. IWebBrowser2* iWebBrowser;13. VARIANT varMyURL;14. static CAxWindow WinContainer;15. LPOLESTR pszName=OLESTR("shell.Explorer.2");16. GetClientRect(hWnd, &rc);17. switch(message)18. {19. case WM_CREATE:20. WinContainer.Create(hWnd, rc, 0,WS_CHILD |WS_VISIBLE);21. WinContainer.CreateControl(pszName);22. WinContainer.QueryControl(__uuidof(IWebBrowser2),(void**)&iWebBrowser);23. VariantInit(&varMyURL);24. varMyURL.vt = VT_BSTR;25. varMyURL.bstrVal = SysAllocString(_T(""));26. iWebBrowser-> Navigate2(&varMyURL,0,0,0,0);27. VariantClear(&varMyURL);28. iWebBrowser-> Release();29. break;30. case WM_DESTROY:31. PostQuitMessage(0);32. break;33. default:34. return (int)DefWindowProc(hWnd,message,wParam,lParam);35. }36. return 0;37. }38.39.40. int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nShowCmd)41. {42. static TCHAR szAppName[]=TEXT("WebBrowser");43. static TCHAR szClassName[]=TEXT("WebBrowser");44. HWND hWnd;45. MSG msg;46. WNDCLASS wndclass;47. wndclass.style=CS_HREDRAW | CS_VREDRAW;48. wndclass.lpfnWndProc=WndProc;49. wndclass.cbClsExtra=0;50. wndclass.cbWndExtra=0;51. wndclass.hInstance=hInstance;52. wndclass.hIcon=LoadIcon(hInstance, IDI_APPLICATION);53. wndclass.hCursor=LoadCursor(NULL,IDC_ARROW);54. wndclass.hbrBackground=(HBRUSH)(COLOR_WINDOW+1);55. wndclass.lpszMenuName=NULL;56. wndclass.lpszClassName=szClassName;57.58.59. if(!RegisterClass(&wndclass))60. {61. MessageBox(NULL,TEXT("Error!"),szAppName,MB_ICONERROR);62. return 0;63. }64.65.66. hWnd=CreateWindow(szClassName,szAppName,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,67. 0,CW_USEDEFAULT,0,NULL,NULL,hInstance,NULL);68. ShowWindow(hWnd,nShowCmd);69. UpdateWindow(hWnd);70.71. while(GetMessage(&msg, NULL, 0, 0))72. {73. TranslateMessage(&msg);74. DispatchMessage(&msg);75. }76. return msg.wParam;77. }。
SDK使用说明范文一、SDK简介SDK(Software Development Kit,软件开发工具包)是一组开发工具和资源的集合,用于帮助开发者创建应用程序。
SDK提供了开发所需的应用程序接口(API)、示例代码、文档等。
SDK可以大大简化开发过程,提高开发效率。
二、SDK的安装和配置2.配置开发环境需要根据开发环境配置SDK。
例如,在Windows上,需要在系统环境变量中设置SDK的路径。
三、SDK的导入在开发工具中导入SDK,可以使用SDK提供的API进行开发。
1.创建新项目打开开发工具,创建一个新项目。
2.导入SDK在项目中添加SDK,可以通过添加依赖库或引入外部库的方式导入。
四、SDK的使用SDK提供了各种功能的API供开发者使用。
以下是一些常见的SDK使用方法。
1.初始化SDK在应用程序的入口处,调用SDK提供的初始化方法,完成SDK的初始化。
可以根据需要进行必要的配置。
2.登录与认证在用户登录模块中,调用SDK提供的登录与认证API,实现用户的身份认证与管理。
3.数据获取与处理使用SDK提供的API,获取所需的数据。
可以进行数据解析、处理与展示等。
4.事件与回调SDK通常提供事件与回调机制,用于处理异步操作或接收SDK返回的数据。
需要注册相应的事件监听器或回调函数。
5.功能扩展与定制SDK通常提供了一些扩展和定制功能的接口,开发者可以根据需要,自定义SDK的功能与行为。
五、SDK的调试与测试在开发过程中,调试和测试是不可或缺的环节。
1.调试开发者可以使用开发工具提供的调试功能,结合SDK的调试日志,来定位和解决开发中的问题。
2.测试开发者可以编写单元测试或集成测试,来验证SDK的使用是否符合预期,并检查各种边际情况下的功能表现。
六、SDK的更新与升级随着软件的发展和需求变化,SDK也需要进行更新和升级。
一般来说,开发者可以通过以下方式更新SDK:1.官方渠道更新开发者可以定期查看官方网站、论坛或邮件列表,了解最新版本的SDK发布信息。
sdk编译流程SDK(Software Development Kit)是一种软件开发工具包,提供了一系列的库、工具和文档,用于帮助开发者快速开发软件应用。
在编译流程中,SDK扮演了重要的角色,本文将介绍SDK编译流程的一般步骤。
一、环境准备在开始SDK编译之前,首先需要准备好开发环境。
这包括了操作系统、编程语言、编译器等。
根据不同的开发需求,可以选择不同的环境。
二、安装SDKSDK通常是由官方或第三方提供的,需要下载并安装到本地开发环境中。
安装过程中可能需要配置一些环境变量或路径,以便在编译过程中能够正确地找到SDK。
三、创建项目在SDK编译之前,需要先创建一个项目。
项目通常包括源代码、配置文件和资源文件等。
根据开发需求,可以选择不同的项目类型,如Android项目、iOS项目等。
四、配置项目配置项目是SDK编译的重要一步。
在这一步中,开发者需要根据实际需求,配置各种参数和选项,以确保编译过程的正确性和高效性。
配置项目可能涉及到依赖库的引入、编译选项的设置等。
五、编写代码在配置项目完成后,就可以开始编写代码了。
根据项目类型和需求,开发者可以使用相应的编程语言和框架进行开发。
在编写代码时,需要遵循一定的编码规范,保证代码的可读性和维护性。
六、编译代码编写代码之后,就可以进行编译了。
编译的过程是将源代码转换成可执行文件或库文件的过程。
在编译过程中,SDK会根据项目配置和编译选项,对源代码进行语法分析、优化和生成目标代码等操作。
七、构建项目编译完成后,还需要进行项目的构建。
构建的过程是将编译生成的文件进行打包、压缩和整理,以便于发布和部署。
在构建过程中,可能还需要进行一些额外的操作,如生成文档、生成安装包等。
八、测试和调试在项目构建完成后,需要进行测试和调试,以确保项目的质量和稳定性。
测试和调试的过程包括单元测试、集成测试、性能测试等。
通过测试和调试,可以发现和修复代码中的bug和问题。
九、发布和部署经过测试和调试后,项目就可以发布和部署了。
WIN CE6.0 STEP BY STEP Version 1.0一、系统定制1、这里假设您已经把软件环境都搭建完毕,打开VisualStudio2005,选择新建->项目->Platform Builder for CE 6.0。
2、下一步,选择Device Emulator:ARMV4I,如果有实际设备,也可选择对应设备开发板的CPU等型号进行配置。
3、下一步,选择你想开发的设备类型,这里选择PDA Device,继续4、下一步,选择Mobile Handheld。
5、选择你定制操作系统需要的应用程序。
默认,下一步。
6、选择你定制操作系统需要的网络配置。
默认,下一步。
7、下一步,完成配置。
8、选择项目->属性,对操作系统简单修改一下。
9、下图,可以选择SDK的默认开发语言,可自行修改。
10、下图Enable KITL(no IMGNOKIL=1)取消选定,否则可能会造成模拟器黑屏。
11、如有需要可选择Catalog Items View 对你的操作系统进行裁剪,比如加些应用程序、加些字体等。
12、配置完毕后,可进行编译,此处可能需要很长时间,请耐心等待,编译成功后在*\WINCE600\OSDesigns\OSDesign1\OSDesign2\RelDir\DeviceEmulator_ARMV4I_Release\(参考路径)文件夹下会生成一个NK.bin的文件,此文件即为你定制好的操作系统文件,如有硬件并且安装好启动程序,即可启动你自定制的操作系统。
这里我们准备用模拟器进行程序开发,因此,下面要生成一个模拟器类型的SDK。
二、生成SDK1、项目->Add New SDK….2、添加对应的路径、名称等信息。
3、确认你编译的操作系统为ARMV4I Emulator Debug版本。
4、其他一些基本设置略,如添加皮肤、设定分辨率等,最后点完成, Build此SDK5、Build结束后,可在此*\WINCE600\OSDesigns\OSDesign1\OSDesign1\SDKs\SDK1参考路径下找到您的SDK文件。
Windows编程基础基于Windows的编程方式有两种;一种是使用Windows的APIApplication Programming Interface,应用程序编程接口函数,通常用C/C++语言按相应的程序框架进行编程;这些程序框架往往就程序应用提供相应的文档、范例和软件开发工具包Software Development Kit,SDK,所以这种编程方式有时又称为SDK方式;另一种是使用“封装”方式,例如Visual C++的MFC方式,它是将SDK中的绝大多数函数、数据等按C++“类”的形式进行封装,并提供相应的应用程序框架和编程操作;事实上,无论是哪种编程方式,人们最关心的内容有三个:一是程序入口,二是窗口、资源等的创建和使用,三是键盘、鼠标等所产生的事件或消息的接收和处理;本章就来讨论这些内容;学习编程往往从简单的例子入手,例如一个C程序常有下列简单的框架代码:include <>int main{printf"Hello World\n"; / 输出 /return 0; / 指定返回值 /}事实上,该程序已包括C程序中最常用的include指令、必须的程序入口main函数、库函数printf调用和return语句;由于此程序是在早期的DOSDisk Operating System,磁盘操作系统环境的字符模型下运行的,因而printf函数所输出的都是字符流,也就是说,它在屏幕上输出一行文本“Hello World”;在Windows环境下,这里的屏幕就由控制台窗口来兼作,而基于Windows的上述C程序代码框架肯定是有所不同的;特别地,由于目前所在的Windows环境基本上都是32位,所以这里的Windows程序平台就是Win32,Windows编程可直接理解为是Win32编程;1.1.1 Windows等价程序等价的Windows程序可以写成:include <>int WINAPI WinMain HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int nCmdShow{MessageBox NULL, TEXT"Hello, World", TEXT"Hello", 0 ;return 0 ;}在深入剖析上述程序之前,先来看一看在Visual C++ 中的编辑、连接和运行的过程:①选择“开始”→“程序”→Microsoft Visual Studio →Microsoft Visual C++ ,运行Visual C++ ;第一次运行时,将显示如图所示的“每日提示”对话框;单击“下一条”按钮,可看到有关各种操作的提示;如果在“启动时显示提示”复选框中单击鼠标,去除复选框的选中标记“”,那么下一次运行Visual C++ ,将不再出现此对话框;单击“关闭”按钮关闭此对话框,进入Visual C++ 开发环境;②选择“文件”→“新建”菜单命令,打开应图“每日提示”对话框用程序向导,显示出“新建”对话框,如图所示;选择“工程”选项卡,从列表框中选中Win32 ApplicationWin32 应用程序项图中的标记1;③单击“位置”编辑框右侧的“浏览”按钮图中的标记2,从弹出的“选择目录”对话框指定项目所在的文件夹,如图所示图中的数字标记表示最经常的操作次序,下同;单击“确定”按钮,退出“选择目录”对话框,回到“新建”对话框中;需要说明的是,为了便于程序的管理和查找,本书所涉及的程序均放入Visual C++ 的工作文件夹“Visual C++程序”中,第1章程序放入子文件夹“第1章”中,第2章程序放入子文件夹“第2章”,依此类推;④在“新建”对话框的“工程名称”编辑框图中的标记3中,输入项目名称Ex_HelloMsg,保留“平台”下Win32复选框的默认“选中”状态,单击“确定”按钮进入下一步;⑤出现Win32 Application向导的“步骤1共1步”对话框,从中可选择要创建的应用程序类型:“一个空工程”、“一个简单的Win32程序”和“一个典型的"Hello World "程序”,如图所示;它们的区别在于:“一个空工程”仅创建Win32应用程序文件框架,不含任何代码;“一个简单的Win32程序”是在“一个空工程”基础上添加了程序框架有入口函数、include 指令等;“一个典型的‘Hello World’程序”在“一个简单的Win32程序”基础上增加了MessageBox函数调用,用来输出“Hello World”;图“新建”对话框“工程”选项卡图“选择目录”对话框⑥选中“一个空工程”,单击“完成”按钮,弹出“新建工程信息”对话框,如图所示;单击“确定”按钮,系统将按前面的选择自动创建此应用程序;图应用程序的向导对话框图“新建工程信息”对话框⑦再次选择“文件”→“新建”菜单命令,Visual C++将打开“新建”对话框并自动切换到“文件”选项卡,如图所示;在左侧的文件类型列表中选中C++ Source FileC++源文件,在右侧的“文件名”编辑框中输入“”或输入“”文件扩展名也可不输入,系统会自动添加cpp扩展名,cpp是C Plus Plus的缩写,是C++的意思;⑧单击“确定”按钮,系统将在创建的Win32项目工程Ex_HelloMsg中创建并添加一个新的文件,同时打开该文件窗口;现在可以在中输入前面例中的代码了;输完后,单击编译工具条上的“生成工具”按钮或直接按F7键,系统开始对Ex_HelloMsg项目工程中的文件进行编译、连接,同时在输出窗口中观察出现的内容,当出现errors, 0 warnings表示可执行文件已经正确无误地生成了;同时也可看到在文档窗口中所有代码的颜色都发生改变,这是Visual C++ 的文本编辑器所具有的语法颜色功能绿色表示注释,蓝色表示关键字等;⑨单击编译工具条上的“运行工具”按钮或直接按Ctrl+F5键,就可以运行刚刚生成的,结果如图所示;单击“确定”按钮,Hello对话框退出;图创建并添加程序文件图开发环境和运行结果1.1.2 头文件是一个include预处理指令开始,实际上在用C/C++编写的Windows应用程序的头部都可以看到这样的指令:include <>头文件是最主要的包含头文件,它还包含了其他一些Windows头文件; 例如:: 基本类型定义: 内核函数: 用户接口函数: 图形设备接口函数这些头文件定义了Windows的所有数据类型、函数调用、数据结构和符号常量,它们是Windows应用程序文档中的一个重要部分;1.1.3 程序入口函数在C/C++程序中,其入口函数都是main;但在Windows程序中,这个入口函数由WinMain 来代替;该函数是在中声明的,其原型如下:intWINAPIWinMainHINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd;可以看出,这个WinMain函数除了形参名、个数与main函数不同外,类型名也有了新的变化;下面就来分析:①WinMain函数被声明成为返回一个int值,同时WinMain函数名前还有WINAPI标识符的修饰;WINAPI是一种“调用约定”宏,它在中有如下定义:define WINAPI __stdcall所谓“调用约定”,就是指程序生成机器码后,函数调用的多个参数是按怎样的次序来传递,同时函数调用结束后堆栈由谁来恢复,以及编译器对函数名的修饰约定等的协议;函数调用约定“协议”有许多,其中由WINAPI宏指定的__stdcall是一个常见的协议,内容包括:参数从右向左压入堆栈;函数自身修改堆栈;机器码中的函数名前面自动加下划线,而函数后面接符号和参数的字节数;特别地,Visual C++的MFC方式却采用了__cdecl调用约定:参数从右向左压入堆栈;传递参数的内存栈由调用者来维护正因为如此可实现变参函数;机器码中的函数名只在前面自动加下划线;②WinMain函数的第一个和第二个参数都是HINSTANCE实例句柄类型;HINSTANCE中,H表示Handle,是“句柄”的意思;在Windows编程中,句柄是一个应用程序用来识别某些资源、状态、模块等的数字;由于句柄唯一标识着对应的资源、状态、模块等,因而使用句柄就是使调用相应的资源、状态、模块;当应用程序运行多次时,每一次都是应用程序的“实例”;由于同一个应用程序的所有实例都共享着应用程序的资源,因而程序通过检查hPrevInstance参数就可确定自身的其他实例是否正在运行;③WinMain函数的第三个参数lpCmdLine用来指定程序的命令行,其参数类型为LPSTR;但在中,却将其改为PSTR;这两种数据类型都是合法的,也都是指向字符串的指针类型;其中的STR是“STRING,字符串”的含义,是指以\0结尾的字符串,LP前缀表示“长指针”,在Win32中它与“P”前缀表示的“指针”含义相同;④WinMain函数的第四个参数nShowCmd用来指定程序最初显示的方式,它可以是正常、最大化或最小化来显示程序窗口;纵观上述参数和类型名可以发现它们的命名规则:●C/C++的类型名仍保留其小写,但新的类型都是用大写字母来命名;●参数名变量名都是采用“匈牙利表示法”的命名规则来定义的;它的主要方法是将变量名前后加上表示“类型”和“作用”的“前缀小写”,而变量名本身由“状态”、“属性”和“含义”等几个部分组成,每一个部分的名称可以是全称,也可以是缩写,但通常只有第一个字母是大写;例如,hPrevInstance则是由前缀h表示“句柄”类型+状态Prev表示“以前的”+属性Instance表示“实例”组成的;1.1.4 MessageBox函数MessageBox是一个Win32 API函数,用来弹出一个对话框窗口,显示短信息;该函数具有下列原型:int MessageBox HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType;其中,第一个参数hWnd用来指定父窗口句柄,即对话框所在的窗口句柄;第二、三个参数分别用来指定显示的消息内容lpText和对话框窗口的标题lpCaption,最后一个参数用来指定在对话框中显示的预定义的按钮和图标标识,它们是在定义的一组以MB_开始的常数组合;例如,下面是在中改变MessageBox的第四个参数;include <>int WINAPI WinMain HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int nCmdShow{MessageBox NULL, TEXT"Hello, World", TEXT"Hello",MB_ICONQUESTION | MB_ABORTRETRYIGNORE ;return 0 ;}程序运行后,结果如图所示;可见,MB_ICONQUESTION 用来指定在对话框中显示图标,而MB_ABORTRETRYIGNORE用来指定“终止”、“重试”和“忽略”按钮,类似这样的预定义标识还有很多,在以后讨论到MFC中的CWnd::MessageBox函数时还要讨论,故这里不再赘述;在程序中,调用MessageBox的实参中还涉及TEXT宏;在Windows编程中,TEXT宏是用来对UNICODE编码的字符串的支持;UNICODE是使用两个字节表示一个字符,这样单字节的ANSI字符和双字节的“汉字”的表示就统一起来了;在程序中使用图第四个参数的作用TEXT文本,无论在何Windows环境下均可显示正确的内容,而不会出现乱码的情形;另外,还有_TEXT 和_T宏等,在Visual C++中,它们的作用是等同的;窗口和消息MessageBox是通过创建的默认“窗口”来显示简单的信息:窗口标题、一行或多行文本、图标和按钮等;在Windows环境中,一个“窗口”就是屏幕上的一个矩形区域,它接收用户的输入,并以文本或图形方式来显示内容;事实上,“窗口”就是用户操作的区域界面,在编程中除创建等操作外,还要处理用户输入、窗口本身事件所产生的“消息”;1.2.1 程序框架代码为了能处理上述两个部分的内容:窗口创建和消息处理,Windows 提供了相应的程序框架,如下面的例子;include <>LRESULT CALLBACK WndProc HWND, UINT, WP ARAM, LP ARAM;客户区标题栏窗口边框其中,类名是已声明过的类的标识符,对象名可以有一个或多个,多个时要用逗号隔开;被定义的对象既可以是一个普通对象,也可以是一个数组对象或指针对象;例如:CStuscore one, Stu, Stus2;这时,one是类CStuscore的一个普通对象,Stu和Stus分别是该类的一个指针对象和对象数组;若对象是一个指针,则还可像指针变量那样进行初始化,例如:CStuscore two = &one;可见,在程序中,对象的使用和变量是一样的,只是对象还有成员的访问等手段;3.对象成员的访问一个对象的成员就是该对象的类所定义的数据成员和成员函数;访问对象的成员变量和成员函数与访问一般结构的变量的方法是一样的;对于普通对象,其访问格式如下:<对象名>.<成员变量><对象名>.<成员函数><参数表>例如,用来调用对象one中的成员函数getName,Stus0.getNo用来调用对象数组元素Stus0中的成员函数getNo;要注意,由于类的封装性,每个成员均有声明的访问属性,一个类对象只能访问该类的公有型成员,而对于私有型成员则不能访问,例如getName和getNo等公有成员可以由对象通过上述方式来访问,但strName、strStuNo、fScore等私有成员不能被对象来访问;若对象是一个指针,则对象的成员访问格式如下:<对象名>-><成员变量><对象名>-><成员函数><参数表>“->”是另一个表示成员的运算符,它与“.”运算符的区别是:“->”用来表示指向对象的指针的成员,而“.”用来表示一般对象的成员;需要说明的是,下面的两种表示是等价的对于成员函数也适用:<对象指针名>-><成员变量><对象指针名>.<成员变量>例如,two.getName与two->getName等价;可见,在C++中,类实际上是一种新的数据类型,它是对某一类对象的抽象;如同变量一样,用“类”也可定义一个对象,此时的对象称为类的实例;1.3.2 构造函数和析构函数事实上,一个类总有两种特殊的成员函数:构造函数和析构函数;构造函数的功能是在创建对象时,给数据成员赋初值,即给对象初始化;析构函数的功能是用来释放一个对象,在对象删除前,用它来做一些内存释放等清理工作,它与构造函数的功能正好相反;1.构造函数C++规定,在类的定义中是不能对数据成员进行初始化的;为了能给数据成员设置某些初值,这时就要使用类的特殊成员函数——构造函数;构造函数的最大特点是在对象建立时它会被自动执行,因此用于变量、对象的初始化代码一般放在构造函数中;C++规定,一个类的构造函数必须与相应的类同名,它可以带参数,也可以不带参数,与一般的成员函数定义相同,可以重载,也可以有默认的形参值;例如:include <>class CPerson{public:CPersonchar str, float h, float w // A:构造函数{strcpyname, str; height = h; weight = w;}CPersonchar str // B:构造函数{strcpyname, str;}CPersonfloat h, float w = 120; // C:构造函数public:void print{cout<<"姓名:"<<name<<"\t身高:"<<height<<"\t体重:"<<weight<<endl;}private:char name20; // 姓名float height; // 身高float weight; // 体重};CPerson::CPersonfloat h, float w{height = h; weight = w;}int main{CPerson one"DING";;CPerson two170, 130;;CPerson three"DING", 170, 130;;return 0;}include后面的是C++编译器自带的文件,称为C++库文件,它定义了标准输入/输出流的相关数据及其操作;cout表示标准输出流对象屏幕,“<<”是插入符,它将后面的内容插入到cout 中,即输出到屏幕上;程序运行的结果为:姓名:DING 身高:–+008 体重:–+008姓名:烫烫烫烫烫烫烫烫烫烫身高:170 体重:130姓名:DING 身高:170 体重:130分析和说明:①类CPerson定义了3个重载的构造函数程序中用A、B、C标明,这些构造函数的重载必须按其规定进行定义,要么参数个数不同,要么参数个数相同,但参数类型不相同;其中,构造函数CPersonfloat h, float w = 120,不仅设置了形参w的默认值,而且还将该构造函数的声明在类中进行,其定义在类体外实现;②在主函数main中,对象one的初始化等价于"DING",因而调用的是B构造函数,此时对象的私有数据成员name设定了初值“DING”,而height和weight初值没有指定,它们的初值取决于对象的存储类型,可能是默认值或无效值;③对象two的初始化等价于170, 130,因而调用的是C构造函数,此时对象的私有数据成员height和weight初值分别设定为170、130,而name初值没有指定,它可能是默认值或无效值;④对象three的初始化等价于"DING", 170, 130,因而调用的是A构造函数,此时对象的私有数据成员name、height和weight初值分别设定为"DING"、170和130;可见,构造函数提供了对象的初始化方式;若没有定义任何构造函数,则编译自动为类隐式生成一个不带任何参数的默认构造函数,由于函数体是空块,因此默认构造函数不进行任何操作,仅仅为了对象创建时的语法需要;例如,对于CPerson类来说,默认构造函数的形式如下:CPerson // 默认构造函数的形式{ }默认构造函数的目的是使下列对象定义形式合法:CPerson one; // 即: ; 会自动调用默认构造函数此时,由于对象one没指定任何初值,因而编译会自动调用类中隐式生成的默认构造函数对其初始化;若当类定义中指定了构造函数,则隐式的默认构造函数不再存在,因此,若对于前面定义的CPerson类来说,若有:C Person four; // 错误则因为找不到默认构造函数而出现编译错误;此时,在类中还要给出默认构造函数的具体定义,即定义一个不带任何参数的构造函数,称为显式的默认构造函数,这样才能对four进行定义并初始化;另外,构造函数的访问属性必须是公有型public,否则上述的类对象定义也是错误的;2.析构函数与构造函数相对应的是析构函数Destructor;析构函数是C++类中另一个特殊的成员函数,它只是在类名称前加上一个“~”符号逻辑非,以与构造函数功能相反;其格式如下:< ~类名>{ … }当对象的生存期结束后,或者当使用delete释放由new来分配动态内存的对象时,析构函数会被自动调用;这样,数据成员尤其是用new为其开辟的内存空间的释放代码就可放入析构函数的函数体中,以便对象消失后自动调用;需要说明的是:①每一个类最多只能有一个析构函数,且应为public,否则类实例化后无法自动调用析构函数进行释放,但不能被重载,没有任何参数,也不返回任何值,函数名前也不能有任何关键词包括void;例如:class CPerson{public:…~CPerson { }// 析构函数…};②与类的其他成员函数一样,析构函数的定义也可在类体外进行,但必须指明它所属的类,且在类体中还必须有析构函数的声明;例如:。
第9篇窗口标题栏上显示自定义图标(手动编辑代码)白云小飞本篇想通过手动直接编辑代码的方式(而不是可视化的方式)来操作使用自定义的图标。
(以在窗口标题栏上显示自定义图标为例)通过本篇,你将知道如何使用图标资源及实质,并有助于你理解在可视化方式编辑使用图标资源过程中的代码实质。
另外,可以触类旁通,明白VC中的Window应用程序对各种类似资源(如光标资源、位图资源、声音资源等)操作的一般机制。
一开始我们的思考:程序所要用到的各类图像、声音等资源应放在什么地方为好?一个程序可能需要使用各种图像、声音。
那么,你认为应把这些东西放在什么地方呢?一种很显然的做法:就是让这些图形、图像、声音仍以文件形式(如.bmp .jpg .ico .cur .wav等等扩展名的文件,)保存在磁盘中,不包含在应用程序(.exe)中。
当我的.exe程序执行时需要这些文件时再把它们从磁盘中加载到内存里并对它们操作。
如果你是想写一个看图软件或播放音乐之类的软件,这当然是一种最佳的做法啦。
但是,有时候你的程序可能要显示一个代表你程序的图像等等的情况。
由于前述的方法中,图形、图像、声音是以独立的文件形式,所以软件的使用者是很容易就改动及删除它们的,唉!我可不希望这样啊!那么,还有什么办法呢?还有一种可以想到的做法:就是让这些图形、图像、声音等数据在编译时就把它们编译进.exe文件中。
显然,由于程序要用到的各种图像、声音等的数据已经包含在.exe里面了,这样,软件使用者只要拥有这个.exe文件就可以。
同时使用者要想改动程序所用的这些图形、图像、声音也就不是那么容易。
啊!exe程序文件里居然也能存储各种类型图像、声音!嗯,这可是Windows的一个设计目标:可执行程序里不仅只含有程序代码,还可以存储各种图像、声音等的数据呢!也可能第一次让你有了这个念头!但不管怎么说,程序是可以这样设计的!好了,那么又如何创建一个包含有图标资源并使用这个图标的.exe文件呢?二图像、声音资源操作的一般步骤。