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 x
Top y
Right x1
Bottem y1
POINT 点结构(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++项目-->win32win32项目。
2、应用程序设置windows应用程序-->空项目。
3、源文件-->添加新文件。
4、添加源代码。
三、Hello win的源代码:
#include <windows.h> //声明窗体的消息处理函数
HRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(
HINSTANCE hInstance,
//当前应用程序实例句柄
HINSTANCE hPrevInstance,//前一个应用程序实例句柄
PSTR
szCmdLine,
//命令行参数
int
iCmdShow
//当前系统的标准窗体显示模式
)
{
MSG msg;
//消息结构对象
//定义窗体类对象
WNDCLASS wndclass;
//设计窗体类对象
wndclass.cbClsExtra = 0;
//类扩展样式,为没有扩展样式
wndclass.cbWndExtra = 0;
//窗体扩展样式,为没有扩展样式
wndclass.hbrBackground =
(HBRUSH)GetStockObject(BLACK_BRUSH);//指定窗体的背景笔刷
//使用GetStockObject函数从系统内取得WHITE_BRUSH的句柄
wndclass.hCursor =
LoadCursor(NULL,IDC_CROSS);//指定光标句柄,使用LoadCursor从系统内加载
wndclass.hIcon =
LoadIcon(NULL,IDI_APPLICATION);//指定图标句柄,使用LoadIcon从系统加载
wndclass.hInstance = hInstance;
//指定应用程序实例句柄为当前实例句柄
wndclass.lpfnWndProc = WndProc;//指定窗体消息处理函数WndProc
wndclass.lpszClassName = "Hello"; //指定窗体类名称
wndclass.lpszMenuName = NULL;//指定菜单名称,NULL没有菜单
wndclass.style = CS_HREDRAW | CS_VREDRAW ;//窗体类样式,允许水平/垂直方向重绘
//注册窗体类
if(!RegisterClass(&wndclass))
{
MessageBox(NULL,"注册窗体失败,请确认是在win nt 系统下运行","错误",MB_OK);
return 0;
}
//创建窗体
HWND hWnd = CreateWindow(
"Hello",//窗体类对象名称
"我的第一个windows应用程序",
WS_OVERLAPPEDWINDOW,//指定窗体样式,无透明效果
CW_USEDEFAULT,
//窗体的X坐标
CW_USEDEFAULT,
//窗体的Y坐标
CW_USEDEFAULT,
//窗体宽度
CW_USEDEFAULT,
//窗体高度
NULL,
//父窗体句柄
NULL,
//菜单句柄
hInstance,
//应用程序实例句柄
NULL
//备用参数,没意义
);
//显示窗体
ShowWindow(hWnd,SW_SHOW);
//更新窗体
UpdateWindow(hWnd);
//消息循环
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
//
//函数:WndProc
//作用:用来处理窗体收到的所有消息
//返回类型:HRESULT(long类型)
//调用约定:CALLBACK系统回调函数
//参数:
//
HWND hWnd
收到消息的窗体句柄
//
UINT message
消息ID
//
WPARAM wParam
消息参数
//
LPARAM lParam
消息参数
/
HRESULT CALLBACK WndProc(HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam)
{
switch(message)
{
case WM_DESTROY:
MessageBox(NULL,"窗体销毁啦,程序马上没了","提示",MB_OK);
PostQuitMessage(0);
break;
case WM_CLOSE:
if(MessageBox(NULL,"是否关闭","提示",MB_OKCANCEL)==IDCANCEL)
return 0;
break;
case WM_CREATE:
break;
}
return DefWindowProc(hWnd,message,wParam,lParam);
}
四、Hello win的知识点:
1、包含windows.h文件。
#include <windows.h>
2、WinMain: Windows程序入口点。
返回值:int 类型。
关键字:WINAPI windowsAPI 函数
名称 :WinMain
3、WinMain的四个参数:
HINSTANCE hInstance:操作系统提供当前应用程序的实例句柄。
(* H:凡是以H开头的函数都是句柄(Handle).)
HINSTANCE:当前应用程序实例句柄
HINSTANCE hPrevInstance:操作系统提供前一个应用程序的前一个实例句
柄。
PSTR szCmdLine:字符串类型的指针,操作系统提供的命令行参数。
Int iCmdShow:当前系统默认显示的方式。
注意:当程序运行后,WinMain主函数由操作系统来调用,而不是我们来调用的,当操作系统起动我们的程序的时候,操作系统会给我们的运行程序分配一个实例号。通过参数就传递进来了,如果起动程序时传递了一个命令行的参数,操作系统会将参数放到第三个参数当中传递进来.程序如何显示,显示的状态,这些都是由操作系统传递进来的,所以,参数都由操作系统来赋值。
创建一个完整的窗口,需要以下四个步骤
设计窗体类 (WNDCLASS)
注册窗体类 (RegisterClass(&wndclass))
创建窗体类 (CreateWindow)
显示及更新窗体类 (ShowWindow/UpdateWindow)
消息循环 (message)
4、static TCHAR szAppName[]=TEXT("hellowin"); //应用程序名称
HWND hWnd; //窗体句柄
MSG msg; //消息结构
WNDCLASS wndclass; //窗体类对象
5、
wndclass.style=CS_HREDRAW|CS_VREDRAW;
//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);
//设置背景色为白色(利用GetStockObject来获取黑色画刷设为背景, 然后把
强制转换为HBRUSH类型)
wndclass.lpszMenuName=NULL;
//在程序中设置窗体有无菜单
wndclass.lpszClassName=szAppName;
//在程序中设置窗体标题栏文本.
//注册窗体:
RegisterClass(&wndclass)
//向操作系统注册窗体,参数要一个窗体类的指针。
//创建一个窗体
创建窗体时,首先定义一个窗体句柄
HWND hwnd;
hWnd=CreateWindow(szAppName,
TEXT("Hellowin程序,我的第一个WINDOWS程序"),
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
CW_USEDEFAULT,
NULL,
NULL,
hInstance,
NULL);
//创建窗体用关键字CreateWindow(
第一个参数是窗体类的名子,
第二个参数是标题栏上的文本,
第三个参数是窗体样式
第四个参数是窗体在屏幕上的x坐标 //用默认的就可以
第五个参数是窗体在屏幕上的y坐标 //用默认的就可以
第六个参数是窗体的高度 //用默认的就可以
第七个参数是窗体的宽度
//用默认的就可以
第八个参数是窗体的句
//在窗体没有父窗体的情况下,该参数设为空
第九个参数是窗体的菜单句柄
//在本窗体中没有菜单句柄,该参数设为空
第十个参数是应用程序实例句柄
第十一个参数是当窗体运行时,要一个窗体消息的一个指针,在本程序中,该参数设为空
//显示及更新窗体
显示窗体用:ShowWindow(hWnd,iCmdShow);
第一个参数是窗体句柄,表示将要显示的是那一个窗体
第二个参数是显示状态,表示将窗体如何的显示出来
更新窗体用:UpdateWindow(hWnd);
参数表明要更新那个窗体
以上就是对窗体的设计,注册,创建和显示及更新,下面就是对消息的处理:
MSG msg; //我们用MSG消息结构体定义了一个变量
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
GetMessage到消息队列中取得消息
第一个参数:要一个结构体变量的地址,当调用函数时,将自动填充结构体当中的内部的成员变量
第二个参数:要一个窗体的句柄,指要获取的是那一个窗体的消息,设为空的意思是要获取所有的消息
第三个参数:指定消息对列中最小的消息值,指定特定消息,和消息范围
第四个参数:指定消息对列中最大的消息值,指定特定消息,和消息范围
注意:将第三个参数和第四个参数设为0,将获取消息对列中所有的消息,也就
没有范围的过滤了,我们还可以获取指定范围内的消息(范围过滤),当然
不在范围内的消息,不会获取
GetMessage的返回值为bool类型,获取到消息,返回为真,否则返回0
TranslateMessage(&msg); //翻译消息,把获取来的消息翻译完后,在投入到消息 对列中.转换过程不会影响原有的消息对列,只会产生一个新的消息
DispatchMessage(&msg); //将收到的消息传递给窗体的回调函数(窗体过程序函数)中处理.作用是消息传递给操作系统,然后操作系去调用我们的过程序函数,也就是说我们在窗体的过程函数中处理消息
//回调函数(过程函数)
LRESULT CALLBACK WndProc(HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
//第一个参数:窗体句柄
//第二个参数:消息的标识
//第三个参数:消息的附加参数
//第四个参数:第二个消息的附加参数
LRESULT://返回值是一个Long类型
CALLBACK://回调函数,表明此函数由系统调用,不用人为调用
HDC hdc;
//HDC:设备描述表句柄
PAINTSTRUCT ps;
//定义一个结构体的变量,作用是用来刷新客户区的
RECT rect;
//定义一个矩形的结构体
switch(message)
{
case WM_PAINT:
hdc=BeginPaint(hWnd,&ps);
//GetClientRect(hWnd,&rect);
//DrawText(hdc,"Hello,Windows!",-1,&rect,DT_SINGLELINE|DT_CENTER|DT_V CENTER);
TextOut(hdc,100,100,”Hello win”,strlen(“Hello win”));
EndPaint(hWnd,&ps);
return 0;
case WM_DESTROY:
PostQuitMessage(0);
return 0;
}
//然后我们利用swicth循环来处理特定的消息
Switch(message)
WM_PAINT:只处理绘图消息,只能客户区绘图,执行条件:1、窗体最大化,最小化
2、窗体被其它窗体挡住时,3、人为调用。
//hdc=BeginPaint(hWnd,&ps); //BeginPaint获取Paint消息中,设备描述表句柄的方法
//EndPaint(hWnd,&ps); //EndPaint释放Paint消息中,设备描述表句柄的方法
TextOut(HDC,int,int,lpctstr,int) //在指定位置书写一个文本
case WM_DESTROY:
PostQuitMessage(0);
return 0;
WM_DESTROY: //当窗体消毁时,触发该消息
PostQuitMessage(0)://退出消息循环,该参数要一个退出消息的模式,给0按默认方式通出,如想按其它方式退出,请参看MSDN