`
iaiai
  • 浏览: 2196310 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

《Windows32 SDK教程》01章 SDK入门

 
阅读更多
现在我们要学的是Windows32的编程,与DOS不同的是,实现的目标是一个具有你所需要的功能的“窗口”。这个“窗口”时时刻刻都在与操作系统之间,通过一个称之为“消息队列”的东西传送数据。因此处理好各种消息便成了Win32编程的核心。

SDK编程是相对于MFC来说的,也就是用C和C++来调用WindowsAPI,这API是操作系统的东西,其他语言(如VB)也可以调用。因此,以前也有人将这种编程称为API编程。当然,这儿对C或C++进行了一些扩展,所谓扩展,就是增加了许多宏定义、模板,让你看了之后大吃一惊,真不知“何方神圣”倒底有何神通。

如果你C或C++还不会的话,请先学习C语言和C++语言,否则,你再刻苦也等于看电影,也许你看懂了但你肯定不会演电影。学习窗口编程之前,你要知道几个概念。
  • 实例(instance): 这是C++的内容,“类”相当于结构体的数据类型,用“类”这种类型去定义一个变量(如果是指针,则假定已经得到了空间),这个变量就是那个“类”的“实例”。它和C语言中的变量是一回事,不过只有用“类”定义的变量才称为“实例”。
  • 句柄(handle):这是C语言的内容,和文件句柄一样,它实际上是一个整数,用来标识是哪一个实例,也就是实例的标识符。通过句柄可以操作这个实例。
  • 回调(CALLBACK):这其实是C语言中的函数指针,函数指针一般在大项目搭框架时常常使用。也就是你设计好要得到什么,把接口定义好,具体怎么实现完全交给别人,别人只要把函数名传给你就OK。这个函数名就是地址,不过取这种地址的指针在定义上与普通指针有些不同。小雅在《C语言教程》的“函数指针”中有详细解说和例子。


一、WinMain()函数
WinMain()函数是窗口程序的入口函数,在这个函数中你就可以调用各种API函数来完成你的目标。①一般是先调用RegisterClassEx()函数用当前窗口句柄去向操作系统申请(或称登录)将要创建一个什么样的窗口,申请成功后,②再调用CreateWindowEx()函数创建一个窗口对象,这仅仅是一个外观,③还要调用ShowWindow()函数设置初期表示,即最大或最小或普通等。④最后还要调用UpdateWindow()函数向窗口传送WM_PAINT消息来画出窗口里面的内容。

窗口创建完后,这是一个“静止”的窗口,⑤因此还要在WinMain()函数的最后添加消息循环,最后才return。WinMain()函数完了之后,⑥还要再编写一个“窗口消息处理”函数。上面讲了一大堆API函数的调用也许有点昏头,但那些全是固定的,基本上不要编程。在你理解之后,只要修改少量参数便可,真正要编程的是这个“窗口消息处理”函数。

下面我们从简单入手,先不创建窗口,而只是调用一下通用对话框。主要是了解WinMain()函数。
#include <windows.h>

int APIENTRY WinMain(HINSTANCE hInstance,     //当前窗口实例句柄
                     HINSTANCE hPrevInstance, //前一个实例句柄,Win32下为NULL
                     LPSTR     lpCmdLine,     //命令行参数字符
                     int       nCmdShow       //窗口的显示方式
                    )
{
    MessageBox(NULL,"丸博欢迎您!", "http://www.quanxue.cn/", MB_OK);  //通用对话框

    return 0;  //函数返回值
}

初学者不明白的地方还很多,但大都可以就这样先用,以后慢慢理解,小雅当初问了很多“高手”,答案却让我更不明白,只好“慢慢理解”。这样拖了几年,现在小雅就一一解说,如有不对,上论坛指摘2句。

  • APIENTRY不是返回类型,这是为编译器准备的一个宏定义,告诉编译器将当前函数编译成64位机也能用的长调用。为什么要这样一个开关呢?VisualC++要兼容C语言、C++语言、16位的Windows版本等,同时还要为将来扩展为64位机作准备。虽然它和CALLBACK是同一宏定义,但编译时还是略有区别。
  • WinMain()函数在.Net上变成了_tWinMain(),这也是为了兼容而定义的宏定义。
  • HINSTANCE是实例句柄,象这样用H或h开头的东西(如HDC)都是句柄,其值是整数。如果你硬写成int型,编译器会分不清,因此出编译错误。
  • LPSTR是UNICODE型的字符串指针。
  • hInstance是当前窗口的实例句柄,hPrevInstance是16位机上用于识别当前窗口是否重复打开,当hPrevInstance不为NULL时为前一个窗口实例句柄,在32位机上hPrevInstance恒为NULL。
  • lpCmdLine是命令行传来的参数。
  • nCmdShow是初始显示方式,最大/最小/正常/隐藏等等。
  • MessageBox()函数是Win32的API函数,调用通用对话框。这不是我们要学习的窗口编程。


二、基本Win32程序

下面是生成一个窗口的最基本的程序,也是后面要介绍的内容,大家看了之后能找到上面讲的①-⑥,那就OK了。
#include <windows.h>

TCHAR szTitle[32]="丸博";  //窗口的标题
TCHAR szWindowClass[32]="Simple";  //窗口的名称

ATOM MyRegisterClass(HINSTANCE);
BOOL InitInstance(HINSTANCE, int);
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);

int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,
                     int       nCmdShow)
{
    MSG msg;

    MyRegisterClass(hInstance);        //注册窗口类

    if (!InitInstance (hInstance, nCmdShow)) //初始化窗口
    {
        return FALSE;
    }

    while (GetMessage(&msg, NULL, 0, 0)) //消息循环
    {
        TranslateMessage(&msg); //消息解释
        DispatchMessage(&msg);  //消息发送
    }

    //注意:不能用“return 0;”,因为有非正常退出的可能性
    return (int)msg.wParam;
}

//注册窗口类
ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wc;   //定义一个窗口类,其实是一个结构体

    wc.cbSize        = sizeof(WNDCLASSEX);        //结构体的字节长度
    wc.style         = CS_HREDRAW | CS_VREDRAW;   //窗口式样
    wc.lpfnWndProc   = (WNDPROC)WndProc;          //窗口处理函数
    wc.cbClsExtra    = 0;          //分配给窗口类结构之后的额外字节数,一般为0
    wc.cbWndExtra    = 0;          //分配给窗口实例之后的额外字节数,一般为0
    wc.hInstance     = hInstance;  //实例句柄
    wc.hIcon         = LoadIcon(hInstance, (LPCTSTR)IDI_APPLICATION);
    wc.hCursor       = LoadCursor(NULL, IDC_ARROW);            //光标
    wc.hbrBackground = (HBRUSH)(COLOR_APPWORKSPACE + 1);    //背景
    wc.lpszMenuName  = NULL;            //菜单
    wc.lpszClassName = szWindowClass;   //窗口名
    wc.hIconSm       = LoadIcon(wc.hInstance, (LPCTSTR)IDI_APPLICATION);

    return RegisterClassEx(&wc);
}

//初始化窗口
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
{
   HWND hWnd;

   //创建窗口
   hWnd = CreateWindow( szWindowClass,       //窗口名
                        szTitle,             //窗口标题
                        WS_OVERLAPPEDWINDOW, //窗口式样
                        CW_USEDEFAULT,		//窗口左上角的x坐标/CW_USEDEFAULT
                        CW_USEDEFAULT,		//窗口左上角的y坐标/CW_USEDEFAULT
                        CW_USEDEFAULT,		//窗口的宽度/CW_USEDEFAULT
                        CW_USEDEFAULT,		//窗口的高度/CW_USEDEFAULT
                        NULL,                //父窗口句柄
                        NULL,                //菜单句柄
                        hInstance,           //实例句柄
                        NULL);               //创建参数
   if (!hWnd)
   {
      return FALSE;
   }
   ShowWindow(hWnd, nCmdShow); //显示窗口
   UpdateWindow(hWnd);         //立即显示

   return TRUE;
}

//窗口消息处理
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;
}

分享到:
评论

相关推荐

    windows+SDK编程入门介绍

    windows+SDK编程入门介绍

    Windows_SDK入门浅谈

    同时,由于Windows广泛使用动态链接库(DLL),API函数被封装在这些库中,如gdi32.dll、user32.dll和kernel32.dll等。 当你首次接触Windows SDK编程,可能会遇到一个相对复杂的示例程序,比如基于Petzold的...

    Windows编程SDK入门

    《Windows编程SDK入门详解》 Windows编程SDK,简称WinSDK,是开发Windows应用程序的重要工具集,为开发者提供了丰富的API函数和头文件,使得开发者能够构建交互式的图形用户界面。本文将深入探讨Windows SDK中的...

    《windows SDK入门 以及 Windows 驱动》

    《Windows SDK入门以及Windows驱动》是一本面向初学者的指南,主要涵盖了Windows系统开发的基础知识,特别是关于Windows SDK(Software Development Kit)的使用和Windows驱动程序的开发。Windows SDK是微软提供的...

    微软Windows_Speech_SDK编程入门

    微软Windows_Speech_SDK编程入门微软Windows_Speech_SDK编程入门微软Windows_Speech_SDK编程入门微软Windows_Speech_SDK编程入门微软Windows_Speech_SDK编程入门微软Windows_Speech_SDK编程入门微软Windows_Speech_...

    魅族M8_SDK入门教程

    【魅族M8 SDK入门教程】是一篇针对初学者的指南,旨在帮助新手熟悉魅族M8设备的软件开发流程。教程分为多个部分,本文主要关注基础知识和开发环境的搭建。 1. **开发环境搭建**: - **VS2005/VS2008**:魅族M8 SDK...

    SDK教程及实例代码.rar

    开发者可以通过教程了解如何创建新项目、设置项目属性、调用API、处理回调事件等,这对于初学者来说是入门的重要资源。 在学习SDK时,首先需要理解SDK提供的核心功能和特性,比如它是否支持多平台、性能表现如何、...

    windowsphone SDK 精简版

    总之,Windows Phone SDK 7.1精简版是一个面向开发者的重要工具,它简化了Windows Phone应用的开发流程,同时也降低了入门门槛,使得更多的人能够参与到这个平台的开发中来。通过这个SDK,开发者可以利用各种功能...

    公司的书籍windows azure sdk 从入门到精通

    《Windows Azure SDK 从入门到精通》一书深入讲解了如何使用Windows Azure SDK进行云端开发。Development Fabric是书中重点介绍的一个关键工具,它允许开发者在本地环境中模拟Windows Azure Fabric,以便在实际部署...

    003-ESP32学习开发(SDK)-学习ESP32资料说明 - 杨奉武 - 博客园1

    【ESP32学习开发(SDK)】:ESP32是一款高性能、低功耗的Wi-Fi和蓝牙双模物联网微控制器,由乐鑫科技研发。它集成了强大的32位多核处理器,支持丰富的外设接口,如GPIO、ADC、DAC、SPI、I2C、UART等,广泛应用于智能...

    Windows SDK入门浅谈

    Windows SDK(Software Development Kit)是微软为开发者提供的一套用于创建Windows平台应用程序的工具集,它包含了编写Windows应用程序所需的各种组件、文档、示例代码和开发工具。SDK中的主要组成部分包括: 1. ...

    windows+SDK编程入门介绍共49页.pdf.zip

    本资料"windows+SDK编程入门介绍共49页.pdf.zip"显然是一个关于Windows SDK编程初学者的教程,旨在帮助开发者快速理解和掌握Windows SDK的基本用法和核心概念。 在Windows SDK编程中,以下几个关键知识点是入门阶段...

    白手起家Win32SDK应用程序[参照].pdf

    白手起家Win32SDK应用程序 本篇文章主要介绍了白手起家Win32SDK应用程序的知识点...本篇文章旨在帮助读者快速掌握Win32SDK应用程序的开发,提供了必要的预备知识和基础知识,指导读者快速入门Win32SDK应用程序的开发。

    windows SDK编程入门介绍.ppt

    Windows SDK编程入门主要涉及Windows平台下的应用程序开发,其中包括非Window编程和Window编程两种方式。非Window编程通常指的是控制台程序,适用于学习基本的C++编程思想。而Window编程则更为复杂,涉及到直接调用...

    Windows SDK编程资料

    本压缩包中的“Windows SDK编程资料”是一份专为入门至中等水平的开发者设计的学习资源,旨在帮助他们深入理解和掌握Windows平台上的软件开发。 在Windows SDK中,最重要的组成部分之一是头文件(.h),它们包含了...

    MS Media 编码器 SDK 开发教程

    在开发流媒体相关程序时,开发者可以利用微软官方网站提供的资源,例如Windows Media主页、Windows Media编码器主页以及Windows Media 9系列SDK主页等,这些网站提供了丰富的文档、SDK下载和相关技术讨论,是进行...

    windows程序设计教程

    《Windows程序设计教程》是一本深入探讨Windows操作系统环境下软件开发的专业教材。这门课程主要针对使用Visual Studio(VS)作为集成开发环境(IDE)的程序员,涵盖了从基础到高级的Windows编程概念和技术。 在...

    Kinect_for_Windows_SDK开发入门.doc

    《Kinect for Windows SDK开发入门》是一份详细指导开发者如何使用Kinect for Windows SDK进行编程的教程。该教程由一系列的文章组成,涵盖了从环境配置到高级应用的各种主题,旨在帮助初学者快速上手并深入理解...

    windows音视频SDK包

    Windows音视频SDK包是一款专为开发远程网络视频会议、在线远程教育、屏幕共享、电子白板、影音共享和在线直播等应用而设计的工具集。它包含了一系列的库、文档、示例代码以及安装程序,使得开发者能够快速集成音视频...

Global site tag (gtag.js) - Google Analytics