Rover12421's Blog

The End.

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++项目–>win32àwin32项目。

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主函数由操作系统来调用,而不是我们来调用的,当操作系统起动我们的程序的时候,操作系统会给我们的运行程序分配一个实例号。通过参数就传递进来了,如果起动程序时传递了一个命令行的参数,操作系统会将参数放到第三个参数当中传递进来.程序如何显示,显示的状态,这些都是由操作系统传递进来的,所以,参数都由操作系统来赋值。

创建一个完整的窗口,需要以下四个步骤

1)、 设计窗体类 (WNDCLASS)

2)、 注册窗体类 (RegisterClass(&wndclass))

3)、 创建窗体类 (CreateWindow)

4)、 显示及更新窗体类 (ShowWindow/UpdateWindow)

5)、 消息循环 (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”)); aint(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

Comments