Windows32的SDK编程 第三章
WIN_sdk 编程

•函数DefWindowProc是系统的默认处理过程, 以保证所有发送到该窗口的消息都能得到处 理
一个简单的Windows应用程序
我们先来分析程序代码段,然后再进行上机 操作 该段应用程序将生成一个简单的窗口 本例作为一 个简单的使用Windows API函 数进行编程的入门
#include <windows.h> //窗口函数说明 LRESULT CALLBACK WndProc(HWND,UINT,WPARAM, LPARAM); //------------下面为初始化窗口类----------------//WinMain函数说明 int WINAPI WinMain ( HINSTANCE hInstance, //应用程序当前实例句柄 HINSTANCE hPrevInst, //应用程序其他实例句柄 LPSTR lpszCmdLine, //指向程序命令行参数的指针 int nCmdShow //应用程序开始执行时窗口显示方式 //的整数值标识 )
wndclass.hIcon=LoadIcon(NULL, IDI_APPLICATION);//窗口的最小化图标为缺省图标 wndclass.hCursor=LoadCursor(NULL, IDC_ARROW); //窗口采用箭头光标 wndclass.hbrBackground=GetStockObject (WHITE_BRUSH) ; //窗口背景为白色 wndclass.lpszMenuName = NULL; //窗口中无菜单 wndclass.lpszClassName = lpszClassName ; //窗口类名为"窗口示例"
C.创建窗口:创建一个窗口类的实例由函数 CreatWindow()实现,该函数原型为:
windows sdk编程系列文章29 --- 直接从硬盘扇区读取文件内容.

windows sdk编程系列文章 --- 直接从硬盘扇区读取文件内容2008-09-05 15:43理论:基本概念就是通过文件句柄获取文件所在的簇列表。
然后直接打开硬盘,根据簇所在的位置,直接读取文件数据。
方法1:可以通过打开"\\\\.\\PHYSICALDRIVE0",读取MBR,然后根据MBR中的DPT,找到活动分区的偏移,定位到DBR。
然后将要定位簇的文件打开,获取文件句柄,将文件句柄传递给DeviceIoControl的FSCTL_GET_RETRIEVAL_POINTERS功能,就可以得到RETRIEVAL_POINTERS_BUFFER结构。
方法2:直接打开"\\\\.\\c:"就是定位到DBR了。
然后跟上面同样的操作。
对于一些基本概念,MBR, DPT,DBR,以及fat32和ntfs的文件结构,可以参考下面的链接了解。
/html/magnetism/200806/17-55.html代码:(vc6, ntfs 见光盘DirectAccessFile#define _WIN32_WINNT 0x0400#include#include#includeULONGLONG *GetFileClusters(PCHAR lpFileName,ULONG *ClusterSize,ULONG *ClCount,ULONG *FileSize{HANDLE hFile;ULONG OutSize;ULONG Bytes, Cls, CnCount, r;ULONGLONG *Clusters = NULL;BOOLEAN Result = FALSE;LARGE_INTEGER PrevVCN, Lcn;STARTING_VCN_INPUT_BUFFER InBuf;PRETRIEVAL_POINTERS_BUFFER OutBuf;CHAR Name[7];DWORD SecPerCl;DWORD BtPerSec;Name[0] = lpFileName[0];Name[1] = ':';Name[2] = 0;GetDiskFreeSpace(Name, &SecPerCl, &BtPerSec, NULL, NULL;*ClusterSize = SecPerCl * BtPerSec;hFile = CreateFile(lpFileName, FILE_READ_ATTRIBUTES,FILE_SHARE_READ |FILE_SHARE_WRITE | FILE_SHARE_DELETE,NULL, OPEN_EXISTING, 0, 0;if (hFile != INVALID_HANDLE_VALUE{*FileSize = GetFileSize(hFile, NULL;OutSize = sizeof(RETRIEVAL_POINTERS_BUFFER + (*FileSize / *ClusterSize * sizeof(OutBuf->Extents;OutBuf = (RETRIEVAL_POINTERS_BUFFER *malloc(OutSize;InBuf.StartingVcn.QuadPart = 0;if (DeviceIoControl(hFile, FSCTL_GET_RETRIEVAL_POINTERS, &InBuf,sizeof(InBuf, OutBuf, OutSize, &Bytes, NULL{*ClCount = (*FileSize + *ClusterSize - 1 /*ClusterSize;Clusters = (ULONGLONG *malloc(*ClCount *sizeof(ULONGLONG;PrevVCN = OutBuf->StartingVcn;for (r = 0, Cls = 0; r < OutBuf->ExtentCount; r++{Lcn = OutBuf->Extents[r].Lcn;for (CnCount = (ULONG(OutBuf->Extents[r].NextVcn.QuadPart - PrevVCN.QuadPart;CnCount; CnCount--, Cls++, Lcn.QuadPart++Clusters[Cls] = Lcn.QuadPart;PrevVCN = OutBuf->Extents[r].NextVcn;}}free(OutBuf;CloseHandle(hFile;}return Clusters;}void Read(PCHAR lpSrcName{ULONG ClusterSize, BlockSize;ULONGLONG *Clusters;ULONG ClCount, FileSize, Bytes;HANDLE hDrive;ULONG r;PVOID Buff;LARGE_INTEGER Offset;CHAR Name[7];Clusters = GetFileClusters(lpSrcName, &ClusterSize, &ClCount, &FileSize;if (Clusters{Name[0] = '\\';Name[1] = '\\';Name[2] = '.';Name[3] = '\\';Name[4] = lpSrcName[0];Name[5] = ':';Name[6] = 0;hDrive = CreateFile(Name, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, 0;if (hDrive != INVALID_HANDLE_VALUE{Buff = malloc(ClusterSize;for (r = 0; r < ClCount; r++, FileSize -= BlockSize{Offset.QuadPart = ClusterSize *Clusters[r];SetFilePointer(hDrive, Offset.LowPart,&Offset.HighPart, FILE_BEGIN;ReadFile(hDrive, Buff, ClusterSize,&Bytes, NULL;BlockSize = FileSize < ClusterSize ? FileSize : ClusterSize;}free(Buff;CloseHandle(hDrive;}free(Clusters;}}void main({Read("c:\\windows\\system32\\comctl32.dll";}分析:GetFileClusters 函数用于获取文件占用的簇列表,以及每个簇占用字节数,文件占用的簇数,文件大小等信息。
S32KSDK使用详解之S32SDK软件架构详解

S32KSDK使用详解之S32SDK软件架构详解S32KSDK(S32 Software Development Kit)是一款专门为S32K系列微控制器(MCU)开发而设计的软件开发包。
它提供了丰富的软件组件和工具,帮助开发者快速构建高效、安全、可靠的嵌入式应用程序。
S32KSDK软件架构是其核心,下面将对其进行详细的介绍。
1.RTOS和驱动层:这一层提供了实时操作系统(RTOS)和各种外设的驱动程序。
RTOS可提供任务管理、内存管理、事件机制等核心功能,驱动程序则负责提供对芯片外设的访问。
2.中间件层:中间件层向上层提供了一些常见的协议和服务,如CAN、USB、TCP/IP等。
这些中间件模块能够提供高效、稳定的数据通信功能,方便开发者在应用层进行调用。
3.通信层:通信层主要负责处理与外部设备的通信。
这里包括支持UART、SPI、I2C等多种通信接口的驱动程序和协议栈,便于与其他设备之间进行数据交换。
4.驱动库:驱动库层提供了对S32K芯片内部资源的访问和管理,包括GPIO、ADC、PWM等。
开发者可以通过驱动库快速对芯片功能进行配置和操作。
5.硬件抽象层:硬件抽象层是对底层硬件的抽象封装,提供统一的接口给上层应用程序使用。
它能屏蔽底层硬件的差异,方便移植和开发。
6.应用层:应用层是开发者进行应用程序开发的主要环节。
在这一层,开发者可以基于以上层次提供的功能模块进行应用程序的编写,实现各种功能和算法。
总结起来,S32KSDK的软件架构主要分为RTOS和驱动层、中间件层、通信层、驱动库、硬件抽象层和应用层。
通过这种层次划分和组织,开发者可以方便地构建复杂的嵌入式应用程序,并能够快速实现所需功能。
同时,S32KSDK还提供了丰富的示例代码和文档,帮助开发者更好地理解和使用SDK。
SDK编程经典解释

SDK编程经典解释什么是WinSDK:大致说来windows编程有两种方法: 1.windwos 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编程的灵活性.....不好意思,跑题了....本专题假定:C语言是windows的源语言,用C进行SDK编程是最合适的,你应该至少学过C语言,知道C语言的各种语法等,当我说到指针等类似概念的时候,你不至于茫然就行了。
你还应该安装了Visual C++6.0,低版本的就不用用了吧,D版的才几块钱吗?推荐与参考资料:1.Petzold的[programming windows by petzold],这是我看过的一本书(电子书),不过是E文的,我只看了一半,"下载空间"一栏能供了该电子书。
中文版的是[Windows 程序设计](包括上,下卷),Charles Petzold著,北京博彦发展有限公司译,北京大学出版社出版,本书唯一的缺点就是太贵,价格是160元。
Win32+SDK教程

//窗口左上角的 y //窗口的宽度 //窗口的高度 //父窗口句柄 //菜单句柄 //实例句柄 //创建参数
//窗口消息处理 LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { case WM_DESTROY: //关闭窗口 PostQuitMessage(0); //发送关闭消息 break; default: return DefWindowProc(hWnd, message, wParam, lParam); //缺省窗口处理函数 } return 0; }
Generated by Foxit PDF Creator © Foxit Software For evaluation only.
01章 SDK 入门 01 章 SDK 入门
现在我们要学的是 Windows32 的编程,与 DOS 不同的是,实现的目标是一个 具有你所需要的功能的“窗口”。这个“窗口”时时刻刻都在与操作系统之间, 通过一个称之为“消息队列”的东西传送数据。因此处理好各种消息便成了 Win32 编程的核心。 SDK 编程是相对于 MFC 来说的, 也就是用 C 和 C++来调用 WindowsAPI, 这 API 是操作系统的东西,其他语言(如 VB)也可以调用。因此,以前也有人将这种 编程称为 API 编程。当然,这儿对 C 或 C++进行了一些扩展,所谓扩展,就是增 加了许多宏定义、模板,让你看了之后大吃一惊,真不知“何方神圣”倒底有何 神通。 如果你 C 或 C++还不会的话,请先学习 C 语言和 C++语言,否则,你再刻苦 也等于看电影,也许你看懂了但你肯定不会演电影。学习窗口编程之前,你要知 道几个概念。 1. 实例(instance): 这是 C++的内容,“类”相当于结构体的数据类 型,用“类”这种类型去定义一个变量(如果是指针,则假定已经得 到了空间),这个变量就是那个“类”的“实例”。它和 C 语言中的 变量是一回事,不过只有用“类”定义的变量才称为“实例”。 2. 句柄(handle):这是 C 语言的内容,和文件句柄一样,它实际上是一 个整数,用来标识是哪一个实例,也就是实例的标识符。通过句柄可 以操作这个实例。 3. 回调(CALLBACK): 这其实是 C 语言中的函数指针,函数指针一般在大 项目搭框架时常常使用。 也就是你设计好要得到什么, 把接口定义好, 具体怎么实现完全交给别人,别人只要把函数名传给你就 OK。这个 函数名就是地址, 不过取这种地址的指针在定义上与普通指针有些不 同。小雅在《C 语言教程》的“函数指针”中有详细解说和例子。 一、WinMain()函数 WinMain()函数是窗口程序的入口函数,在这个函数中你就可以调用各种 API 函数来完成你的目标。①一般是先调用 RegisterClassEx()函数用当前窗口 句柄去向操作系统申请(或称登录)将要创建一个什么样的窗口,申请成功后,② 再调用 CreateWindowEx()函数创建一个窗口对象,这仅仅是一个外观,③还要 调用 ShowWindow()函数设置初期表示,即最大或最小或普通等。④最后还要调 用 UpdateWindow()函数向窗口传送 WM_PAINT 消息来画出窗口里面的内容。 窗口创建完后,这是一个“静止”的窗口,⑤因此还要在 WinMain()函数的 最后添加消息循环,最后才 return。WinMain()函数完了之后,⑥还要再编写一 个“窗口消息处理”函数。 上面讲了一大堆 API 函数的调用也许有点昏头,但那
windows环境下32位汇编语言程序设计附书代码

windows环境下32位汇编语言程序设计附书代码汇编语言是一种底层计算机语言,用于编写与计算机硬件直接交互的程序。
在Windows环境下,可以使用32位汇编语言进行程序设计。
本文将介绍一些常见的32位汇编语言程序,并附带相关的代码示例。
1.程序的基本结构:在32位汇编语言中,程序的基本结构由三个部分组成:数据段、代码段和堆栈段。
数据段用来声明和初始化程序中使用的全局变量和常量。
例如,下面的代码段声明了一个全局变量message,存储了一个字符串。
```data segmentmessage db 'Hello, World!',0data ends```代码段包含了程序的实际执行代码。
下面的代码段使用`mov`指令将message变量中的字符串存储到寄存器eax中,并使用`int 21h`来调用MS-DOS功能1来显示字符串。
```code segmentstart:mov eax, offset messagemov ah, 09hint 21hmov ah, 4chint 21hcode ends```堆栈段用来存储函数调用过程中的局部变量和返回地址。
2.入栈和出栈操作:在程序中,我们经常需要使用堆栈来保存和恢复寄存器的值,以及传递函数参数和保存函数返回值。
以下是一些常用的堆栈操作指令: ```push reg ;将reg中的值压入堆栈pop reg ;将堆栈顶部的值弹出到reg中```下面的示例演示了如何使用堆栈来保存和恢复寄存器的值:```code segmentstart:push eax ;将eax保存到堆栈mov eax, 10 ;设置eax的值为10pop ebx ;将堆栈顶部的值弹出到ebxadd eax, ebx ;将eax和ebx相加int 3 ;调试中断,用于程序的暂停mov ah, 4chint 21hcode ends```3.条件判断和跳转指令:汇编语言中的条件判断和跳转指令用于根据条件的成立与否来改变程序的执行流程。
SDK入门教程

SDK 第一节 Hello SDK一、概述:SDK(software Development kit 软件开发包) 。
我们从这堂课开始,要学习基于Windows操作平台上的程序设计。
我们平常用的软件如:RealONE Player、OFFICE2003、金山影霸、甚至我们现在所用到的Microsoft Visual Studio .NET 2003 等,在我们按装完操作系统时,这些软件是不存在的,是我们后来人工按装上的,也就是说这些软件都是基于Windows操作平台开发出来的软件,那么,我们在写程序的时候就要和操作系统打交道,就要利用微软给我们提供的接口来实现Windows操作平台的程序设计。
我们把接口称做API函数(Application Programming Interface 应用程序接口)。
微软把2800多个API函数通过包的形式提供给我们(也就是我们要学习的SDK)。
SDK的组成:Win32 API。
注意:概述一下API函数.Windows当中的新数据类型:1、结构:MSG 消息结构WNDCLASS 窗体类结构RECT 矩形结构:left xTop yRight x1Bottem y1POINT 点结构(x,y)2、句柄HINSTANCE 应用程序实例句柄HWND 窗体句柄HDC 设备描述表句柄3、数据类型WORD(unsigned short int)DWORD (unsigned long int )BYTE (unsigned char)TCHAR (wchar:宽字符集)UINT (unsigned int)WPARAM (unsigned int)LPARAM (unsigned int)LRESULT (long int)CALLBACK 回调函数二、Windows编程的第一个程序(Hello Win):1、建立VC++项目-->win32→win32项目。
2、应用程序设置→windows应用程序-->空项目。
win32 sdk下调用webbrowser控件

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. }。
Windows程序设计-第02章-Win32编程基础知识

在C语言的世界里,所有的程序都是用函数来装配的,main称之为主函数,是所有程序运行的入口。main函数可以无参,也可以有参,但标准的C语言,main函数是有参函数,其形式如下所示:
int main(int argc, char* argv[])
{
printf("Hello World!\n");
第2章
Windows编程,大家也通常称为win32编程,或win32 SDK编程,其含义是针对32位Windows操作系统。本章节回顾了C语言的入口函数,再引入Win32入口函数,通过win32开发所需要的相关知识,巩固对Win32编程的理解。
Win32编程具体的功能是什么?它是为Windows系统编写应用程序的工具或手段,目的是为了服务于系统用户。当然,Win32程序就是所有可以在Windows系统下运行的程序的统称。因为Windows是由很多窗口组成,所以这里所指的Windows程序,即为窗口程序。
char *
LPSTR, PSTR
const char *
LPCSTR, PCSTR
void
VOID
void *
LPVOID
Win32的数据类型众多,有上百个,记忆时可以使用一些技巧,切勿死记硬背,拿“LPCSTR、PCSTR”为例:
“LP”与“P”代表同一含义,即指针;
“C”代表“const”;
“STR”则代表字符串。
2.2
C语言有入口函数,当然Win32编程也有入口函数,虽然它们的写法有所不同,但同为入口函数,基本功能是一样的。不一样的是Win32的入口函数相对来说更为复杂,它为窗口应用程序提供相应的参数。为了让大家更好的了解Win32入口函数的参数,先来了解一下C语言的一些参数,表2.1描述了常用的数据类型。
Windows下的接口调用方法,设备驱动方法和COM编程技术

信息学院微机原理与接口技术自主学习报告报告名称:Windows下的接口调用方法,设备驱动方法和COM编程技术姓名:学号:专业:班级:时间:2010年6月15日星期二摘要Windows操作系统是一个采用图形界面的、多任务的操作系统。
这个系统不同于单用户的操作系统DOS,她的多任务特性,决定了系统的资源是有各个任务共享而不是独占的。
为此,Windows的体系结构也与DOS的体系结构完全相同。
AbstractWindows operating system is a graphical interface, multi-tasking operating system. This system is different from the single-user operating system, DOS, her multi-tasking features, determine the system's resources are shared in various tasks, rather than exclusive. To this end, Windows system structure and architecture of DOS is identical目录摘要...........................................................................................Abstract………………………………………………………………. 第一章Windos下的接口调用………………………………………2.1 接口调用的概念及特点……………………………………... 第二章设备驱动………………………………………………….3.1 为什么需要设备驱动………………………………………………3.2 什么是设备驱动程序…………………………………………….3.3 设备驱动程序编写简介…………………………………………….. 第三章COM编程技术…………………………………………..4.1 COM的概念……………………………………………………4.2 COM对象……………………………………………………..4.3 COM接口………………………………………………………4.31 从API到COM接口…………………………………………4.32 COM接口的定义和标识…………………………………..第四章结论………………………………………………………第一章Windos下的接口调用一、windows下的接口调用1、 Windows的体系结构在windows体系结构中,分为用户和系统内核两个不同的层次,这是windows操作系统为了对系统资源进行安全有效的管理,使用了cpu在不同运行空间的不同运行管理权,在windows系统的核心管理进程内包含虚拟内存管理、运行管理、系统任务分发管理等最重要系统的核心功能,也包括了一些与核心功能机密相关,为了提高系统效率的内核win32子系统功能。
第3课-网络安全基础编程

编译后在命令行下运行如下
3.2.2 面向对象的C++语言
面向对象程序设计语言可以将一些变量和函数 封装到类(Class)中
当变量被类封装后,称之为属性或者数据成员 当函数被类封装后,称之为方法或者成员函数 属性 类 方法
定义好的一个类,然后定义一个类的实例,这 个实例就叫做对象,在C++中可以用类定义对 象,使用方法如程序proj3_4.cpp所示。
*案例3-1 读取命令行参数
案例名称:读取命令行参数 参数个数 程序名称:proj3_3.cpp #include <stdio.h> int main(int argc, char *argv[ ]) { int i; for (i = 1; i < argc; i++) { printf("%s\n", argv[i]); } return 0; } 参数的值
*事件 、 句柄
事件
如在程序运行的过程中改变窗口的大小或者移动窗口等,都 会触发相应的“事件”,从而调用相关的事件处理函数。
例如:BUTTONCLICK事件,触发ONBUTTON CLICK()事件处理函数
句柄
句柄是一个指针,通过句柄就可以控制该句柄指向的对象。 编写程序总是要和各种句柄打交道的
句柄是系统用来标识不同对象类型的工具,如窗口、菜单等,这 些东西在系统中被视为不同类型的对象,用不同的句柄将他们区 分开来。 例如:HWND、HDC、HBRUSH、HMENU、HPEN等等
目前流行两大语法体系:Basic语系和C语系。同一个 语系下语言的基本语法是一样。两大语系如图所示。
C语系: C语言/C++语言/Java语言/Perl语言/C#/JavaScript Basic语系: Basic语言/VB6.0//VBScript/VBA
WindowsSDK编程API入门系列(转)

WindowsSDK编程API⼊门系列(转)之⼀ -那‘烦⼈’的Windows数据类型原创⽂章,转载请注明作者及出处。
⾸发Hello Everybody This is beyondcode⼤家好再次⾃我介绍⼀下我是beyondcode, 这次⼼⾎来潮, 计划着做⼀系列关于Windows API 编程的教程,⽤于帮助⼀些在Windows API编程上有疑惑的,纳闷的,迷惑的新⼿朋友们。
先解释⼀些术语或名词吧 SDK是Software Development Kit的简写,也就是软件开发包的意思,其中就包含了我们写程序要⽤到的⼀些头⽂件,库,⼯具,帮助⽂档之类的。
Windows API编程是指调⽤Windows的接⼝函数来进⾏程序的编写,例如MessageBox就是⼀个API函数或者说接⼝函数。
怎么说都可以,⾃⼰理解就⾏。
如果你连这个都不太懂,我想也不会搜到这篇⽂章了吧~·为什么做这个系列教程呢,请听我⼀⼀道来先,最近遇到⼀些事⼀些⼈,让我真的感觉在这⽅⾯的引导⼊门⽂章真的很是匮乏,加上Windows SDK头⽂件中那些复杂,庞⼤,'烦⼈'的宏定义与数据类型定义,对于⼀个新⼿来说(我所说的新⼿不单只刚接触编程的,还特指那些在其他语⾔领域有⽐较⾼造诣的朋友) ⼀个纯SDK写的helloworld程序都算是⼀个有些困难和挑战的任务了吧。
本着帮助别⼈,⾼兴⾃⼰的原则,我有了这个打算,当然对⾃⼰以前所学,所经历做⼀次回忆,也是这次计划的⼀部分。
声明⼀下,本系列教程是⾯向⼴⼤初次接触WIN32 SDK程序编写的新⼿朋友们的,如果你是⾼⼿,⼀笑⽽过吧~当然,除了⼀笑⽽过,也多谢你们提出指正⽂章中的错误,以免我误⼈⼦弟啊~~谢谢Ok 废话不多说,进⼊正题,今天第⼀篇,讲什么? 对于⼀个新⼈来说,第⼀次接触SDK编程或者说API编程,什么最迷惑你们的,我们讲它,我觉得Windows SDK中那'烦⼈'的数据类型定义和宏定义应该算这个很⾓⾊吧。
《Windows核心编程》读书笔记

第一部分程序员必读Szq整理使用第1章对程序错误的处理(1)常见的Windows函数的返回类型:VOID:无返回值型,该函数的运行不可能失败。
Windows函数很少此类型BOOL:函数运行失败则返回0,否则返回非0HANDLE:失败则返回NULL,否则返回一个可操作的对象的Handle。
注:有些函数会返回一个句柄值INVALID_HANDLE_VALUE,?它被定义为-1。
函数的Platform? SDK 文档将会清楚地说明该函数运行失败时返回的是NULL还是INVALID_HANDLE_VALIDPVOID :函数运行失败,则返回值是NULL,否则返回PVOID,以标识数据块的内存地址LONG/DWORD:这是个难以处理的值。
返回数量的函数通常返LONGDWORD。
如果由于某种原因,函数无法对想要进行计数的对象进行计数,那么该函数通常返回0或-1(根据函数而定)。
如果调用的函数返回了LONG/DWORD,那么请认真阅读 Platform SDK文档以确保能正确?检查潜在的错误。
(2)当某Windows函数运行错误时,可以通过调用 DWORD GetLast Error()函数获取调用该函数的关联线程的32位错误代码。
其具体的错误文本以列表形式存放于WinError.h头文件中,在VC中调试时,也可以通过在Watch 窗口键入“@err,hr”来获取所调用函数的运行错误代码和具体的错误文本。
(3)Windows还提供了一个函数,可以将错误代码转换成它的文本描述。
该函数称为FormatMessage,该函数的格式如下:DWORD FormatMessage(DWORD dwFlags,LPCVOID pSource,DWORD dwMessageID,DWORD dwLanguageID,PTSTR pszBuffer,DWORD nSize,va_list *Argument);2004年11月8号Trackback: /TrackBack.aspx?PostId=174570第一章程序员必读1.1定义自己的错误代码若你编写了一个希望其他人调用的函数,你的函数可能因为这样或那样的原因而运行失败,你必须向函数的调用者说明它已经运行失败。
SDK开发说明

SDK开发使用说明书1.1 概述在Microsoft的32 位Windows 操作系统中,数字摄像机应用接口库直接操作数字摄像机,并提供给用户一个简单明确的应用接口。
用户在编制自己的应用程序时,可以直接调用这些库函数来实现指定的功能。
结束(释放其资源)一般情况下,摄像机的开始操作和初始化参数的设置,最好在用户应用程序的初始化中完成,摄像机的结束操作应在应用程序退出前执行。
1.2 文件包含文件DSCAMSDK.H动态链接库DSCAMSDK.dll静态链接库DSCAMSDK.lib1.3 开发工具应用接口库支持32 位编程开发工具Microsoft Visual C/C++、Microsoft Visual Basic、Borland C/C++、Delphi、C++ Builder、Power Builder 等。
使用C/C++编程工具用户应在程序中调用相关的包含文件(.h.),并将静态链接库(.lib )文件加入到工程文件中,供编译程序在链接(Link )时使用。
需要说明的是,MS-Visual C/C++和C++Builder 定义了各自的静态链接库的文件格式,它们之间是不通用的。
使用MS-Visual Basic、Delphi、Power Builder 等编程工具调用应用接口库时,应按照调用动态链接库的方法,在程序中重新声明函数原型,这时要注意正确定义参数的数据类型1.4 应用程序的发布发布数字摄像机的应用程序。
首先,安装摄像机的设备驱动程序(安装步骤可参见〝安装数字摄像机设备驱动程序说明〞),并确认安装成功;然后,将要发布的应用程序安装到相应的工作目录。
这样,应用程序就可以运行了。
如果需要将驱动程序与二次开发的应用程序安装盘一并发布,请将随卡的驱动程序光盘或软盘中,相应操作系统目录下的驱动程序拷贝到准备发布的安装盘上即可1.5 API说明数字摄像机应用接口库包括数字摄像机的控制、采集图像到内存、错误处理、其它功能等功能。
海康最新播放库SDK编程指南(for Windows)V6.2.2.x

非常感谢您购买我公司的产品,如果您有什么疑问或需要请随时联系我们。 本手册可能包含技术上不准确的地方、或与产品功能及操作不相符的地方、或印刷错误。我司将根据 产品功能的增强而更新本手册的内容,并将定期改进或更新本手册中描述的产品或程序。更新的内容将会 在本手册的新版本中加入,恕不另行通知。
杭州海康威视数字技术股份有限公司 | 版权所有(C)
杭州海康威视数字技术股份有限公司 | 版权所有(C)
3
播放库 . SDK 编程指南
6.26. 单帧前进 PlayM4_OneByOne............................................................................... 23 6.27. 单帧回退 PlayM4_OneByOneBack....................................................................... 23 6.28. 以独占方式打开声音 PlayM4_PlaySound............................................................ 23 6.29. 关闭声音(独占方式)PlayM4_StopSound......................................................... 24 6.30. 以共享方式打开声音 PlayM4_PlaySoundShare................................................... 24 6.31. 关闭声音(共享方式)PlayM4_StopSoundShare..........................................
设备网络SDK编程指南(解码器)

设备(解码器)网络SDK编程指南(for Windows 8/7/2008/Vista/XP/2003/2000 32bit)V4.2声明非常感谢您购买我公司的产品,如果您有什么疑问或需要请随时联系我们。
●我们已尽量保证手册内容的完整性与准确性,但也不免出现技术上不准确、与产品功能及操作不相符或印刷错误等情况出现,如有任何疑问或争议,请以我司最终解释为准。
●产品和手册将实时进行更新,恕不另行通知。
●本手册中内容仅为用户提供参考指导作用,请以SDK实际内容为准。
目录声明 (I)目录 (II)1SDK简介 (1)2函数调用顺序 (3)2.1解码器接入调用流程 (3)2.2主动解码模块流程 (4)2.2.1解码实时流 (4)2.2.2远程文件回放 (5)2.3被动解码模块流程 (6)3函数调用实例 (7)3.1主动解码模块的示例代码 (7)3.1.1实时流解码 (7)3.1.2远程回放解码 (10)3.2被动解码模块的示例代码 (12)4函数说明 (15)4.1SDK初始化 (15)4.1.1初始化SDK NET_DVR_Init (15)4.1.2释放SDK资源NET_DVR_Cleanup (15)4.2异常消息回调 (15)4.2.1注册接收异常、重连等消息的窗口句柄或回调函数NET_DVR_SetExceptionCallBack_V30 (15)4.3SDK日志和信息 (17)4.3.1获取SDK的版本号和build信息NET_DVR_GetSDKBuildVersion (17)4.3.2获取当前SDK的状态信息NET_DVR_GetSDKState (18)4.3.3获取当前SDK的功能信息NET_DVR_GetSDKAbility (18)4.3.4获取SDK本地参数NET_DVR_GetSDKLocalConfig (18)4.3.5设置SDK本地参数NET_DVR_SetSDKLocalConfig (18)4.3.6启用写日志文件NET_DVR_SetLogToFile (18)4.4获取错误信息 (19)4.4.1返回最后操作的错误码NET_DVR_GetLastError (19)4.4.2返回最后操作的错误码信息NET_DVR_GetErrorMsg (19)4.5用户注册 (20)4.5.1用户注册设备NET_DVR_Login_V30 (20)4.5.2用户注销NET_DVR_Logout (20)4.6获取设备能力集 (20)4.6.1获取设备能力集NET_DVR_GetDeviceAbility (20)4.7显示通道配置和控制 (21)4.7.1获取显示通道信息NET_DVR_MatrixGetDisplayCfg_V41 (21)4.7.2显示通道配置NET_DVR_MatrixSetDisplayCfg_V41 (21)4.7.3显示通道控制NET_DVR_MatrixDiaplayControl (22)4.8参数配置 (22)4.8.1获取设备的配置信息NET_DVR_GetDVRConfig (22)4.8.2设置设备的配置信息NET_DVR_SetDVRConfig (23)4.8.3批量获取配置信息NET_DVR_GetDeviceConfig (23)4.8.4批量设置配置信息NET_DVR_SetDeviceConfig (24)4.9解码通道相关 (25)4.9.1获取解码通道配置信息NET_DVR_MatrixGetDecChanCfg (25)4.9.2配置解码通道NET_DVR_MatrixSetDecChanCfg (25)4.9.3获取解码通道视频制式NET_DVR_MatrixGetVideoStandard (25)4.9.4设置解码通道视频制式NET_DVR_MatrixSetVideoStandard (26)4.9.5获取当前解码通道状态NET_DVR_MatrixGetDecChanStatus (26)4.9.6获取解码通道开关NET_DVR_MatrixGetDecChanEnable (26)4.9.7设置解码通道开关NET_DVR_MatrixSetDecChanEnable (27)4.10主动解码 (27)4.10.1启动动态解码NET_DVR_MatrixStartDynamic_V41 (27)4.10.2停止动态解码NET_DVR_MatrixStopDynamic (27)4.10.3获取轮巡解码通道NET_DVR_MatrixGetLoopDecChanInfo_V41 (28)4.10.4设置轮巡解码通道NET_DVR_MatrixSetLoopDecChanInfo_V41 (28)4.10.5获取解码通道轮巡开关NET_DVR_MatrixGetLoopDecChanEnable (28)4.10.6设置解码通道轮巡开关NET_DVR_MatrixSetLoopDecChanEnable (29)4.10.7获取所有解码通道轮巡开关NET_DVR_MatrixGetLoopDecEnable (29)4.10.8获取当前解码通道信息NET_DVR_MatrixGetDecChanInfo_V41 (29)4.10.9远程回放文件解码配置NET_DVR_MatrixSetRemotePlay (30)4.10.10远程文件回放控制NET_DVR_MatrixSetRemotePlayControl (30)4.10.11获取回放状态NET_DVR_MatrixGetRemotePlayStatus (31)4.11被动解码 (31)4.11.1启动被动解码NET_DVR_MatrixStartPassiveDecode (31)4.11.2向被动解码通道发送数据NET_DVR_MatrixSendData (31)4.11.3停止被动解码NET_DVR_MatrixStopPassiveDecode (32)4.11.4获取被动解码状态NET_DVR_MatrixGetPassiveDecodeStatus (32)4.11.5被动解码播放控制NET_DVR_MatrixPassiveDecodeControl (32)4.12LOGO上传和显示控制 (32)4.12.1LOGO上传NET_DVR_UploadLogo (32)4.12.2LOGO显示控制NET_DVR_LogoSwitch (33)4.13场景操作 (33)4.13.1场景切换控制NET_DVR_MatrixSceneControl (33)4.13.2获取当前正在使用的场景模式NET_DVR_MatrixGetCurrentSceneMode (34)4.14透明通道 (34)4.14.1获取透明通道信息NET_DVR_MatrixGetTranInfo_V30 (34)4.14.2设置透明通道参数NET_DVR_MatrixSetTranInfo_V30 (34)4.15设备状态 (35)4.15.1获取解码设备状态NET_DVR_MatrixGetDeviceStatus_V41 (35)4.15.2获取设备运行状态NET_DVR_GetDeviceStatus (35)4.16设备维护管理 (36)远程升级 (36)4.16.1设置远程升级时网络环境NET_DVR_SetNetworkEnvironment (36)4.16.2远程升级NET_DVR_Upgrade (36)4.16.3获取远程升级的进度NET_DVR_GetUpgradeProgress (36)4.16.4获取远程升级的状态NET_DVR_GetUpgradeState (37)4.16.5关闭远程升级句柄,释放资源NET_DVR_CloseUpgradeHandle (37)恢复设备默认参数 (37)4.16.6恢复设备默认参数NET_DVR_RestoreConfig (37)导入/导出配置文件 (37)4.16.7导出配置文件NET_DVR_GetConfigFile_V30 (37)4.16.8导出配置文件NET_DVR_GetConfigFile (38)4.16.9导入配置文件NET_DVR_SetConfigFile_EX (38)4.16.10导入配置文件NET_DVR_SetConfigFile (38)4.17关机和重启 (39)4.17.1重启设备NET_DVR_RebootDVR (39)4.17.2关闭设备NET_DVR_ShutDownDVR (39)5错误代码及说明 (40)1SDK简介设备网络SDK是基于设备私有网络通信协议开发的,为嵌入式网络硬盘录像机、视频服务器、网络摄像机、网络球机、解码器、多屏控制器、报警主机等产品服务的配套模块,用于远程访问和控制设备软件的二次开发。
Windows SDK

Hello World
• 用VC建立Win32 Application • stdafx.h:包含了编写基本windowssdk程 序所需要的头文件 • stdafx.cpp来编译生成预编译文件(以.pch 结尾的文件)
Windows程序基本结构
• WinMain 1、作为程序的入口点 2、定义窗口类 3、进行消息循环 • WndProc 1、窗口函数 2、进行本窗口的消息处理
Windows程序基本结构
• RegisterClass 1、注册窗口类 2、窗口类别定义了该类窗口的基本特征和 窗口消息处理程序 • CreateWindow 1、建立一个窗口 2、返回值窗口句柄Hwnd,是建立内存的地 址
Windows程序基本结构
• ShowWindow/UpdateWindow 显示窗口 • GetMessage 消息循环,从消息队列中取消息 • DispatchMessage 分发消息给窗口消息处理程序 • WndProc 消息被取出后,就通过DispatchMessage由 windows来呼叫消息处理程序。
希望
• 通读《Windows程序设计》 • 实践出真知
谢谢!
显示图片
• SelectObject (hdcMem, hBitmap) ; • BitBlt (hdc, 100, 100, cxSource, cySource, hdcMem, 0, 0, SRCCOPY) ; • DeleteDC (hdcMem) ; ------------------------------------------• FillRect()填充整块颜色
定时器
• SetTimer 设置定时器 • KillTimer 停止定时器 • WM_TIMER 定时器的消息处理 • 定时器CallBack处理函数
windows sdk编程系列文章 -- RichEdit控件基础知识之三

windows sdk编程系列文章---- RichEdit控件基础知识之三例子:见光盘FirstWindow31下面的例子是一个简单的编辑器,你可以用来打开一个cpp源文件,编辑它,然后保存。
它使用了RichEdit 控件 2.0 或者更高的版本.#include "Windows.h"#include "tchar.h"#include "Richedit.h"#define IDR_MAINMENU 101#define IDM_OPEN 40001#define IDM_SAVE 40002#define IDM_CLOSE 40003#define IDM_SAVEAS 40004#define IDM_EXIT 40005#define IDM_COPY 40006#define IDM_CUT 40007#define IDM_PASTE 40008#define IDM_DELETE 40009#define IDM_SELECTALL 40010#define IDM_OPTION 40011#define IDM_UNDO 40012#define IDM_REDO 40013#define IDD_OPTIONDLG 101#define IDC_BACKCOLORBOX 1000#define IDC_TEXTCOLORBOX 1001#define RichEditID 300TCHAR ClassName[] = _T("IczEditClass");TCHAR AppName[] = _T("IczEdit version 1.0");TCHAR RichEditDLL[] = _T("riched20.dll");TCHAR RichEditClass[] = _T("RichEdit20A");TCHAR NoRichEdit[] = _T("Cannot find riched20.dll");TCHAR CppFilterString[] = _T("Cpp source code(*.cpp)\0*.cpp\0All Files (*.*)\0*.*\0"); TCHAR OpenFileFail[] = _T("Cannot open the file");TCHAR WannaSave[] = _T("The data in the control is modified. Want to save it?");BOOL FileOpened = FALSE;COLORREF BackgroundColor = RGB(255,255,255) ;COLORREF TextColor = RGB(0,0,0);TCHAR FileName[256];TCHAR AlternateFileName[256];DWORD CustomColors[16];HINSTANCE g_hInstance;HMODULE hRichEdit;HWND hwndRichEdit;HMENU hMenu;DWORD CALLBACK StreamInProc(DWORD hFile,LPBYTE pBuffer,long NumBytes,long *pBytesRead){return (ReadFile((HANDLE)hFile,pBuffer,NumBytes,(LPDWORD)pBytesRead,0) ^ 1);}DWORD CALLBACK StreamOutProc(DWORD hFile,LPBYTE pBuffer,long NumBytes,long *pBytesRead){return (WriteFile((HANDLE)hFile,pBuffer,NumBytes,(LPDWORD)pBytesRead,0) ^ 1);}BOOL CheckModifyState(HWND hWnd){if(SendMessage(hwndRichEdit,EM_GETMODIFY,0,0)){int nResult = MessageBox(hWnd,WannaSave,AppName,MB_YESNOCANCEL);if(nResult == IDYES){SendMessage(hWnd,WM_COMMAND,IDM_SAVE,0);}else if(nResult == IDCANCEL)return FALSE;}return TRUE;}void SetColor(){CHARFORMAT cfm;SendMessage(hwndRichEdit,EM_SETBKGNDCOLOR,0,BackgroundColor);RtlZeroMemory(&cfm,sizeof(cfm));cfm.cbSize = sizeof(cfm);cfm.dwMask = CFM_COLOR;cfm.crTextColor = TextColor;SendMessage(hwndRichEdit,EM_SETCHARFORMAT,SCF_ALL,(LPARAM)&cfm);}INT CALLBACK OptionProc( HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam ){CHOOSECOLOR clr;switch(Msg){case WM_INITDIALOG:break;case WM_COMMAND:if(HIWORD(wParam) == BN_CLICKED){switch(LOWORD(wParam)){case IDCANCEL:SendMessage(hWnd,WM_CLOSE,0,0);break;case IDC_BACKCOLORBOX:RtlZeroMemory(&clr,sizeof(clr));clr.lStructSize = sizeof(clr);clr.hwndOwner = hWnd;clr.hInstance = (HWND)g_hInstance;clr.rgbResult = BackgroundColor;clr.lpCustColors = CustomColors;clr.Flags = CC_ANYCOLOR | CC_RGBINIT;if(ChooseColor(&clr)){BackgroundColor = clr.rgbResult;InvalidateRect(GetDlgItem(hWnd,IDC_BACKCOLORBOX),0,TRUE);}break;case IDC_TEXTCOLORBOX:RtlZeroMemory(&clr,sizeof(clr));clr.lStructSize = sizeof(clr);clr.hwndOwner = hWnd;clr.hInstance = (HWND)g_hInstance;clr.rgbResult = TextColor;clr.lpCustColors = CustomColors;clr.Flags = CC_ANYCOLOR | CC_RGBINIT;if(ChooseColor(&clr)){TextColor = clr.rgbResult;InvalidateRect(GetDlgItem(hWnd,IDC_TEXTCOLORBOX),0,TRUE);}break;case IDOK:{DWORD dwRet = SendMessage(hwndRichEdit,EM_GETMODIFY,0,0);SetColor();SendMessage(hwndRichEdit,EM_SETMODIFY,dwRet,0);EndDialog(hWnd,0);}break;}}break;case WM_CTLCOLORSTATIC:if(GetDlgItem(hWnd,IDC_BACKCOLORBOX) == (HWND)lParam){return (int)CreateSolidBrush(BackgroundColor);}else{if(GetDlgItem(hWnd,IDC_TEXTCOLORBOX) == (HWND)lParam)return (int)CreateSolidBrush(TextColor);}break;case WM_CLOSE:EndDialog(hWnd,0);break;default:return FALSE;}return TRUE;}LONG CALLBACK ProcWinMain( HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam ){CHARRANGE chrg;OPENFILENAME ofn;EDITSTREAM editstream;HANDLE hFile;switch(Msg){case WM_CREATE:{hwndRichEdit=CreateWindowEx(WS_EX_CLIENTEDGE,RichEditClass,NULL,ES_MULTILINE | WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | ES_NOHIDESEL, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,hWnd,(HMENU)Ric hEditID,g_hInstance,NULL);SendMessage(hwndRichEdit,EM_LIMITTEXT,-1,0);SetColor();SendMessage(hwndRichEdit,EM_SETMODIFY,FALSE,0);SendMessage(hwndRichEdit,EM_EMPTYUNDOBUFFER,0,0);}break;case WM_INITMENUPOPUP:if(LOWORD(lParam) == 0){if(FileOpened){EnableMenuItem((HMENU)wParam,IDM_OPEN,MF_GRAYED);EnableMenuItem((HMENU)wParam,IDM_CLOSE,MF_ENABLED);EnableMenuItem((HMENU)wParam,IDM_SAVE,MF_ENABLED);EnableMenuItem((HMENU)wParam,IDM_SAVEAS,MF_ENABLED);}else{EnableMenuItem((HMENU)wParam,IDM_OPEN,MF_ENABLED);EnableMenuItem((HMENU)wParam,IDM_CLOSE,MF_GRAYED);EnableMenuItem((HMENU)wParam,IDM_SAVE,MF_GRAYED);EnableMenuItem((HMENU)wParam,IDM_SAVEAS,MF_GRAYED);}}else if(LOWORD(lParam) == 1){if(SendMessage(hwndRichEdit,EM_CANPASTE,CF_TEXT,0))EnableMenuItem((HMENU)wParam,IDM_PASTE,MF_ENABLED);elseEnableMenuItem((HMENU)wParam,IDM_PASTE,MF_GRAYED);if(SendMessage(hwndRichEdit,EM_CANREDO,CF_TEXT,0))EnableMenuItem((HMENU)wParam,IDM_REDO,MF_ENABLED);elseEnableMenuItem((HMENU)wParam,IDM_REDO,MF_GRAYED);SendMessage(hwndRichEdit,EM_EXGETSEL,0,(LPARAM)&chrg);if(chrg.cpMin == chrg.cpMax){EnableMenuItem((HMENU)wParam,IDM_COPY,MF_GRAYED);EnableMenuItem((HMENU)wParam,IDM_CUT,MF_GRAYED);EnableMenuItem((HMENU)wParam,IDM_DELETE,MF_GRAYED);}else{EnableMenuItem((HMENU)wParam,IDM_COPY,MF_ENABLED);EnableMenuItem((HMENU)wParam,IDM_CUT,MF_ENABLED);EnableMenuItem((HMENU)wParam,IDM_DELETE,MF_ENABLED);}}break;case WM_CLOSE:if(CheckModifyState(hWnd))DestroyWindow(hWnd);break;case WM_DESTROY:PostQuitMessage(0);break;case WM_SIZE:MoveWindow(hwndRichEdit,0,0,LOWORD(lParam),HIWORD(lParam),TRUE);break;case WM_COMMAND:if(lParam == 0){switch(LOWORD(wParam)){case IDM_OPEN:RtlZeroMemory(&ofn,sizeof(ofn));ofn.lStructSize = sizeof(ofn);ofn.hwndOwner = hWnd;ofn.hInstance = g_hInstance;ofn.lpstrFilter = CppFilterString;ofn.lpstrFile = FileName;ofn.nMaxFile = sizeof(FileName);ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY| OFN_PATHMUSTEXIST;if(GetOpenFileName(&ofn)){hFile=CreateFile(FileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);if(hFile != INVALID_HANDLE_VALUE){editstream.dwCookie = (DWORD)hFile;editstream.pfnCallback = StreamInProc;SendMessage(hwndRichEdit,EM_STREAMIN,SF_TEXT,(LPARAM)&editstrea m);SendMessage(hwndRichEdit,EM_SETMODIFY,FALSE,0);CloseHandle(hFile);FileOpened = TRUE;}elseMessageBox(hWnd,OpenFileFail,AppName,MB_OK | MB_ICONERROR);}break;case IDM_CLOSE:if(CheckModifyState(hWnd)){SetWindowText(hwndRichEdit,0);FileOpened = FALSE;}break;case IDM_SAVE:{hFile=CreateFile(FileName,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTR IBUTE_NORMAL,0);if(hFile != INVALID_HANDLE_VALUE){editstream.dwCookie = (DWORD)hFile;editstream.pfnCallback = StreamOutProc;SendMessage(hwndRichEdit,EM_SETMODIFY,FALSE,0);CloseHandle(hFile);}elseMessageBox(hWnd,OpenFileFail,AppName,MB_OK | MB_ICONERROR);}break;case IDM_COPY:SendMessage(hwndRichEdit,WM_COPY,0,0);break;case IDM_CUT:SendMessage(hwndRichEdit,WM_CUT,0,0);break;case IDM_PASTE:SendMessage(hwndRichEdit,WM_PASTE,0,0);break;case IDM_DELETE:SendMessage(hwndRichEdit,EM_REPLACESEL,TRUE,0);break;case IDM_SELECTALL:chrg.cpMax = -1;chrg.cpMin = 0;SendMessage(hwndRichEdit,EM_EXSETSEL,0,(LPARAM)&chrg);break;case IDM_UNDO:SendMessage(hwndRichEdit,EM_UNDO,0,0);break;case IDM_REDO:SendMessage(hwndRichEdit,EM_REDO,0,0);break;case IDM_OPTION:DialogBoxParam(g_hInstance,MAKEINTRESOURCE(IDD_OPTIONDLG),hWnd,&O ptionProc,0);break;case IDM_SAVEAS:RtlZeroMemory(&ofn,sizeof(ofn));ofn.lStructSize = sizeof(ofn);ofn.hwndOwner = hWnd;ofn.hInstance = g_hInstance;ofn.lpstrFilter = CppFilterString;ofn.lpstrFile = AlternateFileName;ofn.nMaxFile = sizeof(AlternateFileName);ofn.Flags = OFN_FILEMUSTEXIST | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST;if(GetSaveFileName(&ofn)){hFile=CreateFile(AlternateFileName,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FI LE_ATTRIBUTE_NORMAL,0);if(hFile != INVALID_HANDLE_VALUE){editstream.dwCookie = (DWORD)hFile;editstream.pfnCallback = StreamOutProc;SendMessage(hwndRichEdit,EM_SETMODIFY,FALSE,0);CloseHandle(hFile);}elseMessageBox(hWnd,OpenFileFail,AppName,MB_OK | MB_ICONERROR);}break;case IDM_EXIT:SendMessage(hWnd,WM_CLOSE,0,0);break;}}break;default:return DefWindowProc(hWnd,Msg,wParam,lParam);}return 0;}int WINAPI WinMain( HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){WNDCLASSEX wc;MSG msg;HWND hWnd;g_hInstance = hInstance;hRichEdit = LoadLibrary(RichEditDLL);if(!hRichEdit){MessageBox(0,NoRichEdit,AppName,MB_OK|MB_ICONERROR);return 0;}wc.cbSize = sizeof(WNDCLASSEX);wc.style = NULL;wc.lpfnWndProc = ProcWinMain;wc.cbClsExtra = NULL;wc.cbWndExtra = NULL;wc.hInstance = hInstance;wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);wc.lpszMenuName = MAKEINTRESOURCE(IDR_MAINMENU);wc.lpszClassName = ClassName;wc.hIcon = wc.hIconSm = LoadIcon(NULL,IDI_APPLICATION);wc.hCursor = LoadCursor(NULL,IDC_ARROW);RegisterClassEx(&wc);hWnd = CreateWindowEx(NULL,ClassName,AppName,WS_OVERLAPPEDWINDOW, CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,NULL, hInstance,NULL);ShowWindow(hWnd,SW_SHOWNORMAL);UpdateWindow(hWnd);while(GetMessage(&msg,NULL,0,0)){TranslateMessage(&msg);DispatchMessage(&msg);}FreeLibrary(hRichEdit);return msg.wParam;}。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
03章窗口消息处理
Windows窗口就是通过消息来与操作系统互动,窗口不能直接与使用者交流,使用者移动鼠标、敲键盘都是通过操作系统与窗口通信的,因此WinMain()函数中的消息循环很重要,没有它窗口便不能工作,而窗口消息处理函数更为重要,也是我们编程的主要对象。
一、消息循环
消息循环共用到3个函数,
GetMessage()的返回值一直不为0,直到接受WM_QUIT时才为0(也就是false)。
DispatchMessage()是将消息传给窗口消息处理函数。
对初学者来说,这3个函数写法比较固定,小雅不作详细说明。
因为内容多了反而把人的思想搞乱,但初学者不要认为只能这样写。
对消息的正确理解是比较关键的,不要编了很多程序,仍不知消息究竟是什么。
我们一起看一下消息的结构体。
注意:上面消息循环中的三个函数用的消息是这个结构体的类型,而下面要阐述的消息处理函数的参数,用的是结构体中的第2-4元素即message、wParam、lParam。
二、消息处理函数
Windows中消息的种类大致有2种,即系统消息和应用程序消息,消息的前缀也多种多样。
不过日常用到的消息大都以“WM_”开头,而且许多消息的wParam和lParam 都为0(也就是不使用),一般只有“WM_COMMAND”菜单命令或键盘鼠标的消息才使用wParam和lParam。
Windows中消息虽然很多,但并不是每一消息都要编程处理,我们一般把不需要特别处理的消息交给缺省消息处理函数DefWindowProc(),例子中的default部分便是。
另外,有一函数必须处理,也就是关闭窗口消息WM_DESTROY,这时必须调用PostQuitMessage(0)来向操作系统发送一条终止程序的消息。
用的最多的消息可能是WM_PAINT,当窗口改变大小、或有别的窗口从这个窗口面前经过,这个窗口中的文字或图案被冲掉,这就必须重新描画。
因此,窗口中要显示的文字或图像一般都是在WM_PAINT中实现的。
下面我们以在窗口上显示一行字作例子,不过,这时要稍微知道一点GDI(Graphic Device Interface)的知识。
三、GDI的基础知识
要在窗口描画文字或图像,首先要先取得设备文本(Device Contexts)。
取设备文本一般有2种方法,BeginPaint()函数和GetDC()函数。
描画结束后必须调用EndPaint()函数和ReleaseDC来释放设备文本。
后面2章将继续介绍GDI的基础知识。
要在窗口的某个位置描画文字,必须取窗口的有效区域(ClientRect),因为窗口的边框、菜单、工具条、状态条等部分是不能利用的。
例如,要在窗口的正中间写一个字,用窗口宽度和高度的一半来取正中位置是不对的,除非这个窗口无任何边框、菜单、工具条、状态条等。
正确的方法是先定义一个区域变量(类型为RECT),
然后用GetClientRect()函数取出窗口有效区域放入这个变量中。
最后,调用DrawText()函数在矩形区输出文字。
DrawText()将在下一章细说,所谓区域类型RECT其实就是一个存放矩形块座标的结构体,下面是RECT的原型。
使用BeginPaint()函数、EndPaint()函数时会同时得到一个结构体,里面有画图时的一些状态,一般为系统保留使用,小雅在初学VC时就想,不修改仅仅使用应该可以的吧?例如,窗口有效区域,不调用GetClientRect()函数,而直接从这个结构体中就可取出使用。
下面例子中11行的“ps.rcPaint”这样也能得到正确结果。
事实上,这段程序是错误的!当改变窗口位置大小时程序没错,一旦窗口的一部分被其它窗口遮盖过(如下图红线部分),显示就不对了。
原因是什么呢?其实是未真正了解这个“ps”的作用,ps中的rcPaint是窗口需要重新刷新的部分,并不是在任何情况都等于窗口的有效区域。
下面部分是更正后的程序,另外,将以前的程序修改了窗口名、大小、背景等。