白手起家Win32SDK应用程序
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()实现,该函数原型为:
Win32 SDK教程

解说
CS_HREDRAW
窗口客户区宽度发生改变时重绘窗口
CS_VREDRAW
窗口客户区高度发生改变时重绘窗口
CS_DBLCLKS
鼠标双击时系统所发的消息
CS_NOCLOSE
禁用系统菜单中的“关闭”命令
CS_OWNDC
为该窗口类的各窗口分配各自独立的设备环境
CS_CLASSDC
为该窗口类的各窗口分配一个共享的设备环境
一、WinMain()函数
WinMain()函数是窗口程序的入口函数,在这个函数中你就可以调用各种API函数来完成你的目标。①一般是先调用RegisterClassEx()函数用当前窗口句柄去向操作系统申请(或称登录)将要创建一个什么样的窗口,申请成功后,②再调用CreateWindowEx()函数创建一个窗口对象,这仅仅是一个外观,③还要调用ShowWindow()函数设置初期表示,即最大或最小或普通等。④最后还要调用UpdateWindow()函数向窗口传送WM_PAINT消息来画出窗口里面的内容。
MyRegisterClass(hInstance);//注册窗口类
if(!InitInstance (hInstance, nCmdShow))//初始化窗口
{
returnFALSE;
}
while(GetMessage(&msg, NULL, 0, 0))//消息循环
{
TranslateMessage(&msg);//消息解释
UINTstyle//窗口式样
WNDPROClpfnWndProc//窗口消息处理的函数名
intcbClsExtra//分配给窗口类结构之后的额外字节数,一般为0
intcbWndExtra//分配给窗口实例之后的额外字节数,一般为0
win32api的使用方法

win32api的使用方法
win32api的使用方法主要包括以下几种:
1. 调用win32api函数,如GetCursorPos()函数获取光标位置。
具体地,需要在代码中声明一个POINT结构体,然后使用DllImport属性导入动态链接库,最后调用GetCursorPos()函数并将返回的光标位置赋值给POINT 结构体中的X和Y属性。
2. 使用invoke语句调用API函数。
在MASM汇编语言中,可以使用invoke语句来调用API函数,并指定函数的参数。
编译器会检查参数的数量和类型是否正确,如果参数少了或者类型不匹配,会报错。
3. 在调用API函数之前,需要先声明该函数。
声明的格式包括函数名、原型、距离、语言和参数列表,其中参数列表包括每个参数的名称、数据类型和修饰符。
需要注意的是,win32api的使用需要一定的编程基础和经验,因此在学习使用win32api之前,建议先学习相关的编程语言和基础知识。
同时,win32api的使用也需要考虑到操作系统的版本和位数,不同的操作系统版本和位数可能会对API函数的可用性和行为产生影响。
因此,在使用
win32api时,需要注意选择正确的API函数并了解其用法和限制。
Windows32的SDK编程 第二章

在上一章的基础上,一样一样地学习SDK编程的内容,大家只要跟着教程多动手,多看帮助。
这三章攻克之后,后面就不难了。
一、注册窗口类
“ATOM MyRegisterClass(HINSTANCE hInstance)”中的ATOM是无符号整数类型,参数hInstance是当前窗口的句柄,这里的关键是API函数RegisterClassEx(&wc),先看一下这个函数的原型。
这个函数的参数是一个结构体,你想要申请一个什么样的窗口,要事先设置好,然后传给这个函数。
下面再看一下WNDCLASSEX的结构。
窗口式样style的值可用下表的值组合起来设置,窗口处理函数名lpfnWndProc
和hInstance不能设置错。
光标有2个hIcon和hIconSm,当取不到值时自动分配一个系统缺省值。
光标hCursor可选择下面的光标ID设置到结构体中去。
关于图标、背景、菜单后面有专门章节介绍。
下面在上一章的基础之上,修改部分数据,看看有什么变化。
二、初始化窗口
InitInstance()函数中,CreateWindow()函数创建一个窗口,这儿说的窗口是广义的窗口,事实上按钮也是窗口,也是由这个函数创建的。
其中最关键的是第三个参数,先看一下函数原型。
窗口式样有以下几种,先用简单易懂的值试一试,然后再逐步深入。
动手做是学习的关键。
下面我们在上一个例子的基础上修改2个地方,看看有什么变化。
运行之后窗口变成了最小化。
Win32 SDK编程(教程 总结)10

本文由leebls贡献 doc文档可能在WAP端浏览体验不佳。
建议您优先选择TXT,或下载源文件到本机查看。
语言也能干大事》第十六节: 《C 语言也能干大事》第十六节:数据库开发 3 本课程的参考教材:杨中科的《程序员的 SQL 金典》第四章 1、SELECT 基本用法 、 a) 检索所有列、检索指定列 b) 按条件过滤。
通配符、Between and select * from T_Employee where FSalary>4000 and FSalary<8000 select * from T_Employee where FSalary BETWEEN 4000 And 8000 c) 数据汇总 select SUM(FSalary),AVG(FSalary),MAX(FSalary),MIN(FSalary) from T_Employee select SUM(FSalary),AVG(FSalary),MAX(FSalary),MIN(FSalary) from T_Employee where FSalary<8000 select COUNT(*) from T_Employee where FSalary>5000。
满足条件的数据个数 d) 排序 Ascending:ASC,升序 Descending:Des,降序 select * from T_Employee order by FSalary desc 2、C 语言中访问数据库 、 a) ODBC 简介。
ODBC 是微软提供的访问数据库的一种标准接口,通过 ODBC 可以连接 MSSQLServer、MYSQL、DB2、 Oracle、Access 等各种数据库,通过统一的函数进行访问,也就是访问各种数据库都可以使用统一的函数。
屏蔽了 连接不同数据库的差异性。
b) 除了 ODBC 之外还有 ADO、ADO.net 等,Java 中有 JDBC 等。
Win32程序快速入门指南

Win32程序快速入门指南1.程序说明示例程序放在Win32ShapeOrg中1.1_tWinMain_tWinMain是程序入口。
while (GetMessage(&msg, NULL, 0, 0))开始为消息处理循环。
如果程序运行到此处将进入一个消息响应过程,即如果有消息就会进入消息响应函数LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) 1.2全局初始化如果要做全局初始化可以在tWinMain函数中while (GetMessage(&msg, NULL, 0, 0))前1.3消息响应机制win32程序是基于消息响应的,最核心的模块是消息响应函数LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)消息是依附在某个窗口的。
其中hWnd是窗口句柄,windows程序里,每一个窗口都有一个HWND类型的句柄用于标识这个窗口。
message是UINT类型的消息,实质上整数,消息的其它信息包含在wParam和lParam中1.4绘制函数WM_PAINT是绘制消息,所有和绘制相关的代码都放在WM_PAINT消息响应部分(具体在hdc = BeginPaint(hWnd, &ps);和EndPaint(hWnd, &ps);之间),win32所有绘制函数都带有一个HDC类型设备上下文句柄的参数。
InvalidateRect(hWnd, NULL, true);语句会发出绘制消息。
如果需要更新绘制画面,就可以调用此语句。
Windows绘制机制的基础是图像设备交互(GDI,Graphics Device Interface)。
Brush是用来填充的刷子,绘制的东西是实心的。
2《白手起家Win32SDK应用程序》第二篇创建Win32工程和主函数

2《白手起家Win32SDK应用程序》第二篇创建Win32工程和主函数第二篇创建Win32工程和主函数白云小飞1 在D:\创建一个空的工程(工程名为MyApp)要编写一个程序,我们就要首先用VC6应用程序向导创建一个工程,下面我将给你创建一个空工程(也就是没有任何源文件及代码的工程)1.1 操作:=>文件->新建…->”工程”标签->位置:”D:\”(你可以设置你想要创建的位置)->工程名:MyApp(你可以自己指定其它名)->选择”创建新的工作空间”->确定->一个空工程->完成1.2 请查看指定位置下生成的文件:打开D:\MyApp我们发现,它在D:\下生成了一个MyApp文件夹。
并在MyApp文件夹下生成了几个文件,如下:MyApp.dspMyApp.dswMyApp.ncbMyApp.opt其中,MyApp.dsp是项目文件和MyApp.dsw是工作区文件,它们是不能删除。
项目文件的作用:生成一个EXE或DLL程序的所有相关源文件、有头文件的位置信息都记录在MyApp.dsp项目文件中。
工作区文件的作用:如果一个复杂的软件工程可能是由多个EXE 和多个DLL程序组成,这样每个项目文件的位置信息又记录在MyApp.dsw工作区文件中。
当然,我们的这个工程只有一个EXE程序,所以只有一个项目,这个项目文件MyApp.dsp也同样要记录在MyApp.dsw中了。
MyApp.ncb和MyApp.opt虽删除后会自动生成,但是还是请不要这样做哦!以后我还会说它们的作用。
我们下次要编辑源程序时,只要打开工作区文件MyApp.dsw就可。
2 在D:\MyApp下创建一个C++源文件,文件名为MyAppMain (当然你也可以自己定义一个文件名),并同时加入到MyApp工程中2.1 操作:=>文件->新建…->”文件”标签->选”添加到工程”->选”MyApp”->文件名:MyAppMain->”位置”默认->确定2.2 查看指定生成的文件:可以看到,在D:\MyApp文件夹下生成了MyAppMain.cpp源文件。
5《白手起家Win32SDK应用程序》第五篇 利用已注册的窗口类来创建一个窗口

第五篇利用已注册的窗口类来创建一个窗口白云小飞一用CreateWindowEx函数来创建窗口1 参数及返回值说明:上篇中我们完成了向Windows系统进行窗口的“申请”工作(即注册一个窗口类)。
本篇就是要用这个窗口类来创建一个窗口。
下面这个API函数就是专门用来创建一个窗口的:HWND WINAPI CreateWindowEx(DWORD dwExStyle,LPCSTR lpClassName,LPCSTR lpWindowName,DWORD dwStyle,int X, int Y,int nWidth, int nHeight,HWND hWndParent ,HMENU hMenu,HINSTANCE hInstance,LPVOID lpParam);这是一个拥有一大串参数的函数。
(唉!我又要一个个地介绍了。
)DWORD dwExStyle:这是用来指定扩展样式标志,绝大多数情况,我们只要指定为NULL,所以我不想多说。
LPCSTR lpClassName:我们要用前篇中注册的窗口类来完成创建窗口,所以lpCassName所指字符串值要与前篇中注册时所用的窗口类名值相同(即wndclass.lpszClassName的值)。
本例中就是"WINCLASS1"字符串值。
LPCSTR lpWindowName:此指针所指的字符串会显示在标题栏上(即标题栏文字)。
DWORD dwStyle:这是用来指定窗口外观类型的。
以下是它可能的值(部分):表dwStyle可以设置的值WS_POPUP弹出式窗口WS_OVERLAPPED带有标题栏和边界的重叠式窗口。
WS_OVERLAPPEDWINDOW具有WS_OVERLAPPED、WS_CAPTION、WS_SYSMENU、WS_THICK、FRAME、WS_MINIMIZEBOX、WS_MAXIMIZEOBX样式的重叠式窗口WS_VISIBLE创建之后就立即显示窗口……(还有很多其它值呢!请自行参看其它参考书)还记得上篇中注册窗口类时窗口类结构体成员中有一项:wndclass.style = CS_VREDRAW | CS_HREDRAW | CS_OWNDC | CS_DBLCLKS;你可不要搞糊涂啦!wndclass.style所指的是针对窗口内在特性的类型,而CreateWindowEx参数中的dwStyle窗口类型是窗口外观的类型。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《白手起家Win32SDK应用程序》(1-4篇)-[※文章学习区]2007年10月10日1说在前面由于VC6及MFC的特点,我们许多人从标准C++学习到VC6MFC应用程序的编程学习的过度会有一个很大的夸跃,从而感到非常的吃力。
究其原因之一:MFC类库设计虽然精巧,但我们在使用MFC设计程序时,会发现MFC到处是API 函数的影子。
MFC并没有象Delphi的VCL类库,VB的控件库一样封装得让人几乎完全不用知道还有Win32API函数及其操作原理,所以要想利用VC6的MFC编程,我认为就一定要先学习如何直接用Win32API函数来编程。
对API编程中的一些关键的概念和原理要有一定认识,这样才会有一个比较平滑的过渡。
以上就是我写这个系列的初衷。
2我假设你已有的知识:这里我假设你已经掌握了如下的知识,如果你在如下方面知识有点不太清楚,那要去补一补罗,否则你看到相关的内容时会有麻烦的。
下面说是我对你知识的假设:2.1Windows系统的文件、文件夹、路径的概念2.2C语言的基本知识(基本以等级考试二级C语言为准,还要有所扩充)2.2.1指针的概念。
2.2.2函数指针概念。
2.2.3各种自定义类型(最重要的是struct类型)的概念。
2.2.4要知道函数的各种参数传递形式(值、地址、引用传递)。
2.2.5typedef及其应用。
2.2.6#include及其应用。
2.2.7十进制、二进制、十六进制。
2.2.8按位与、或、非运算的实质。
2.2.9宏定义概念、使用及意义。
(每个人总是学完了C或C++语法后才会开始用VC6进行Windows编程学习的。
但是你的基础又是如何呢?这是一个关键。
因此我对你的C知识做了具体的假设。
)2.3会安装VC6.0并安装到一台机上2.4VC6编译界面的各组成部分及基本操作(至少会用VC6写控制台程序)。
2.5VC6调试中至少要会设置断点哦。
(呵呵!我的要求不过份吧!)3还必须预备的知识:以上知识是你看本系列的前提,不过我还要给你预备一下我们再这个阶段学习中会遇到的新东西。
3.1你将会接触到的Win32API函数库:以前的DOS下或Windows的控制台程序下,你要在显示器上输出文字,要用printf(),或cout 的函数对象来完。
但如果你要显示一个图形或图象或为你的程序设计一个图形化的操作界面等等的,那可就惨了,一切都要你自已完成。
复杂得很了!(唉!谁叫DOS是字符界面的操作系统呢!)现在好了,在Windows下编程你可就轻松得多了。
因为Windows操作系统都为我们准备好了,它提供给我们多达数千个函数(啊!我要昏倒了。
这么多的函数要学。
),我们通过这些函数来操作Windows 系统提供给我们的各种功能。
比如我要在桌面上创建并显示一个窗口。
就只要调用几个相关的被称为API 的函数,让Windows来帮助我们完成这些事。
我们是通过这些函数与Windows系统交互的,所以这些函数被称作Win32应用程序接口函数,简称Win32API函数。
请不用害怕哟!其实,这么多的函数我们不必都马上一一学过,只要掌握了不多的具有代表性的函数的使用方法,并知道大体API函数都提供了哪些功能就可以了。
以后要用时再去查。
Window拥有现成的各种各样的系统功能,供我们的程序调用。
那么又是通过什么方式来调用这些系统功能呢?原来,Window还现成提供一个接口,好让我们的程序来使用这些系统功能,这个结口就是Win32API函数了(注:API是应用程序接口的英文缩写)。
Win32API函数是我们的应用程序与Windows 系统交互的唯一途径。
我并不打算这时就介绍任何一个具体的API函数。
你现在只要知道你又要接触一个函数库了——被称为Win32API的函数库,如同你以前所学的C/C++函数库。
哈哈,这真是太好了,我们不用再象DOS一样,自已来完成程序界面的绘制了。
我们现在又增加一个全新的函数库,只要调用几个相关API函数,剩下的一切由Windows来完成就可以啦!(当然还有很多其它功能。
)3.2“新”的数据类型:学完C、C++之后,我们就可以开始进入VC6的Windows编程学习了。
但是在接下来的学习中我们会发现在Windows编程中有许多“新”的数据类型。
看下面:BOOL、BYTE、INT、UINT、WORD、DWORD、FLOAT、CHAR、LPSTR、HINSTANCE、HWND、HMENU、HICON等等。
你看这些大写的数据类型,你以前有见过吗?还有很多哦!我们以后的学习过程中还会见到的。
(呵呵!你可要有思想准备了!)这真是让我们初学者迷惑呀!难道VC6中对C/C++的基本数据类型又有重大的扩充了吗?其实不用害怕,只是用新瓶装旧酒而已了。
在VC6的windef.h头文件中已有这些定义:typedef int BOOL;typedef unsigned char BYTE;typedef int INT;typedef unsigned int UINT;typedef unsigned short WORD;typedef unsigned long DWORD;typedef float FLOAT;在winnt.h中有typedef long LONG;typedef char CHAR;typedef CHAR*LPSTR,*PSTR;你看其中(粗体字)CHAR只不过是char的别名而已,也就是说它们是等价的。
只要你包含了相关的头文件,然后你就可以这样申明一个变量:INT i;//等同于int i;CHAR a;//等同于char a;LPSTR pa;//等同于char*pa;明白了吗?我想你一定会问:为什么要这样转义呢?我们直接用int、unsighed int、char等等不就行了吗?我一句两句也说不清,你只要知道,微软这样做一定是要道理的。
哦!还有这些HINSTANCE、HWND、HMENU、HICON我没说呢!今后你还会见到许多这样以H 为开头的数据类型,下面就让我在下一节的“句柄”概念中说给你听。
3.3“句柄”概念由windows系统创建出来的或加载的对象(如应用程序进程、线程、窗口、菜单、图标、光标等等的对象),windows系统都会分配给它们一个唯一的标识值,作为这些对象的标志,称之为句柄。
我们程序中对这些对象的操作其实就是对其句柄的操作。
请记住,句柄就是这些对象的“代号”了。
在编程序中,我们需要用相应的句柄变量来保存这些句柄值,那么用什么类型的句柄变量呢?就是我们前面提到过的HINSTANCE、HWND。
像其它变量一样(如:int a;)申明句柄变量,如下:HINSTANCE hst;//hst变量可以保存某个应用程序实例(即一个进程)的句柄。
HWND hwFirst;//hwFrist变量可以保存某个窗体句柄。
HMENU hMenu;//hMenu变量可以保存某个菜单句柄。
HICON hIcon;//hIcon变量可以保存某个图标句柄。
具体的使用让我以后再慢慢与你道来啦。
那么这些类型的实质又是什么?目前,它们都只是一个int类型(小语:我听说微软也许以后会改变它的类型)。
不过不管怎样,你现在只要把HINSTANCE、HWND、HMENU、HICON当做是一个独立的数据类型就可以了。
3.4消息标识Windows系统是一个基于消息的系统。
这样的机制导致我们的程序与以往DOS下的程序流程会有很大的不同。
(这可是很考我们的智慧喽!)从软件使用者角度看一个Win32窗口程序运行的过程:1)我们运行一个应用程序,程序创建并显示一个我们想要的程序窗口。
2)当我们对窗口进行操作时(如单击、双击、右击、按下键盘、最大化、最小化、关闭窗口等等),程序会完成特定的操作,如:单击最大化、最小化按钮时,窗口会最大化、最小化操作;对窗口中菜单项的选取时,会完成该菜单的相应功能。
从程序员的角度看一个Win32窗口程序运行的过程:1)我们运行一个应用程序,程序中我们通过Win32API函数创建并显示一个我们想要的程序窗口。
(由我们的程序来调用函数实现)2)当我们对窗口进行操作时(如单击、双击、右击、按下键盘、最大化、最小化、关闭窗口等等),窗口会自动产生一系列相应的消息(这是由操作系统实现的)。
3)具体地讲:当我们改变窗口大小时,会产生WM_SIZE消息;单击关闭按钮关闭窗口时,会产生WM_CLOSE消息;选取某一菜单项时,会产生WM_COMMAND消息;按下键盘时,会产生WM_CHAR、WM_KEYDOWN、WM_KEYUP消息;单击鼠标左键时,会产生WM_LBUTTONUP、WM_LBUTTONDOWN消息等等。
啊,很多很多,我也不必全部罗列出来了。
(我说过了,这些都是由操作系统实现的)4)windows系统会将这些消息排入我们窗口所在线程的消息队列中(你会明白线程是什么吗?)(也由Window操作系统实现),这样我们的程序才有机会获取并处理这些产生的消息。
5)我们的程序可以通过Window操作系统提供的API函数来获取这些消息及相关的信息。
然后通过我们学过的条件判断语句来判断是什么消息及其相关的操作信息并可编写相应的程序代码,从而实现对窗口操作的不同反应。
(由我们的程序来实现)看上述的过程描述,你可能要有点的抽象思维能力了。
你现在只要有对程序流程有如上的大体认知就可以了。
慢慢地我会将上述流程变成确实的程序代码噢!(等等,还是有个问题:这些WM_CLOSE、WM_COMMAND、WM_CHAR、WM_KEYDOWN、WM_KEYUP、WM_LBUTTONUP、WM_LBUTTONDOWN等等的以WM_开头的消息到底又是什么东西呢?)看VC6的头文件winuser.h中的片段:……#define WM_CLOSE0x0010……#define WM_LBUTTONDOWN0x0201#define WM_LBUTTONUP0x0202#define WM_LBUTTONDBLCLK0x0203#define WM_RBUTTONDOWN0x0204……#define WM_KEYDOWN0x0100#define WM_KEYUP0x0101#define WM_CHAR0x0102……#define WM_INITDIALOG0x0110#define WM_COMMAND0x0111#define WM_SYSCOMMAND0x0112……哦!这些WM_开头的所谓的消息只不过是一系列16进制整型数值的符号常量而已。
每一个不同的整型数值代表着一个窗口某一操作的标识,因此我们将这些数值或者说以WM_开头的符号常量称之为消息了。
也就说,我们在窗口中作各种不同的操作,Windows系统会产生各种相应的数值。