Windows程序开发基础

一、Windows编程有两种方法


  1.windwos c方式(SDK),SDK编程就是直接调用windows的API进行编程; 
      WinSDK程序设计就是API方式的windows程序设计。SDK,全称Software Developers Kit,意思是软件开发工具箱。 


  2.c++方式:即对SDK函数进行包装,如VC的MFC,BCB的OWL等。MFC把这些API封闭起来,共有一百多个类组成. 
    MFC,全称Microsoft Foundation Classes,伪软把WinAPI进行封装的类库。它是一个类的集合,通过覆盖WinAPI,为编程提供了一个面向对象的界面。
      它使windows程序员能够利用C++面象对象的特性进行编程,类似BCB的OWL,Delphi的VCL组件。它把那些进行SDK编程时最繁琐的部分提供给程序员,
      使之专注于功能的实现。你不妨把它想象成类似TC提供的函数库吧。 


    3.WinSDK编程与MFC编程的区别
   (1)编程思想不同,winSDK编程是面向过程,MFC编程是面向对象
   (2)句柄与指针,如上所述,winSDK编程中大部分API函数都需要句柄,而MFC编程中用对象指针代替了句柄
   (3)默认值,winSDK编程,每个结构体、每个函数参数都要自己一一填充,而MFC很多函数都提供了默认参数、很多对象构造出来后就有默认成员变量值
   (4)画界面的不同,winSDK编程也可以加载界面资源,但比较麻烦,需要自己写很多代码,并且很多时候都需要用纯代码写界面。MFC由于有VisualStudio编
   译器的强大支持,有了“类向导”等神器,在画了一个窗体、控件后,编译器做了很多工作,帮我们写了不少代码,所以很方便。如果没有编译器帮我们做
   这些工作的话,我们手动一点点来的话,其实也是比较麻烦的。
   (5)AppWizard。在VisualStudio里,用AppWizard建立一个win32项目和建立MFC项目显然是不同的。对于win32项目,AppWizard做的很少很少,最多帮你弄好
   了消息循环和窗口过程等。而对于MFC项目的AppWizard,实在是强大,以至于我们抱怨“别给我生成那么多!简单点就可以,我只写个小程序!”。当然,
   如果我们只是写个超级简单的不需要界面甚至不需要消息循环的小程序,就不要用AppWizard了。用winSDK也可,MFC也可,自己建个空项目,手动添加.cpp。
   winSDK的话写个WinMain函数,MFC的话实例化CWinApp对象。不过这种情况的话,用winSDK更方便。


二、WinMain()函数


    dos下的C编程的main()一样,windows下的入口是WinMain()函数。WinMain()所起的作用:初始化,展示,销毁应用程序等。WinMain()一共有四个参数,
    第一个参数:应用程序的当前实例句柄。 第二个参数:应用程序的前一个实例句柄,别管它,对于Win32位而言,它一般是NULL. 第三个参数:指向任
    何传给程序的命令行参数。PSTR代表"指向字符串的指针"。 第四个参数:它告诉应用程序如何初始化窗口,如最大化,最小化等状态。 
  
三、句柄(handle): 
  在标准C库中句柄用来对文件输入输出。 
  在Windows环境中,句柄是用来标识项目的,这些项目包括: 
  *.模块(module) 
  *.任务(task) 
  *.实例(instance) 
  *.文件(file) 
  *.内存块(block of memory) 
  *.菜单(menu) 
  *.控制(control) 
  *.字体(font) 
  *.资源(resource),包括图标(icon),光标(cursor),字符串(string)等 
  *.GDI对象(GDI object),包括位图(bitmap),画刷(brush),元文件(metafile),调色板(palette),画 笔(pen),区域(region),以及设备描述表(device context)。 
  WINDOWS程序中并不是用物理地址来标识一个内存块,文件,任务或动态装入模块的,相反的,WINDOWS API给这些项目分配确定的句柄,并将句柄返回给应用
    程序,然后通过句柄来进行操作。 
  
  窗口句柄: 
  系统通过窗口句柄来在整个系统中唯一标识一个窗口,发送一个消息时必须指定一个窗口句柄表明该消息由那个窗口接收。而每个窗口都会有自己的窗口过程,
    所以用户的输入就会被正确的处理。 


四、命名方式
  所有的命名采用了匈牙利表示法。如消息的前缀使用msg.句柄使用h.函数使用fn等。 
  
五、MainFrm.cpp、MainFrm.h两个文件介绍 
  这两个文件将从CFrameWnd(SDI应用程序)或CMDIFrameWnd(MDI应用程序)派生CMainFrame类。如果在AppWizard的Application Options页(6步中的第4步)中选
    择了对应的可选项的话,CMainFrame类将处理工具条按钮和状态条的创建。MAINFRM.CPP文件还含有MFC应用程序提供的默认工具条按钮的对象ID——叫做butt-
    ons数组。 


六、Windows驱动方式
  
  1.DOS程序主要使用顺序的,过程驱动的程序设计方法。顺序的,过程驱动的程序有一个明显的开始,明显的过程及一个明显的结束,因此程序能直接控制程序事
    件或过程的顺序。虽然在顺序的过程驱动的程序中也有很多处理异常的方法,但这样的异常处理也仍然是顺序的,过程驱动的结构。 
  
  2.Windows的驱动方式是事件驱动,就是不由事件的顺序来控制,而是由事件的发生来控制,所有的事件是无序的。做为一个程序员,在你编写程序时,你并不知
    道用户先按哪个按纽,也不知道程序先触发哪个消息。你的任务就是对正在开发的应用程序要发出或要接收的消息进行排序和管理。事件驱动程序设计是密切围绕
    消息的产生与处理而展开的,一条消息是关于发生的事件的消息。 
  
七、Windows程序的两个主程序
  Windows程序则至少两个主程序, 
  一个是WinMain(), 
  int WINAPI WinMain( 
            HINSTANCE hInstance,    // handle to current instance 
            HINSTANCE hPrevInstance,  // handle to previous instance 
            LPSTR lpCmdLine,      // command line 
            int nCmdShow      // show state 
           ); 
  另一个是窗口过程函数WndProc,它的函数原型为: 
  long FAR PASCAL WndProc(HWND hWnd,WORD message,WORD wParam,LONG lParam); 
  
八、窗口函数与回调函数: 
  在Windows中,应用程序通过要求Windows完成指定操作,而承担这项通信任务的API函数就是Windows的相应窗口函数WndProc。应用程序不直接调用任何窗口函数,而
    是等待Windows调用窗口函数,请求完成任务或返回信息。为保证Windows调用这个窗口函数,这个函数必须先向Windows登记,然后在Windows实施相应操作时回调,所
    以窗口函数又称为回调函数。WndProc是一个主回调函数,Windows至少有一个回调函数。典型的回调函数有窗口过程、对话框过程和钩子函数。实际上,也许有不止一
    个的窗口过程。例如,每一个不同的窗口类都有一个与之相对应的窗口过程。 
  
九、C runtime函数库: 
  
  就跟它的名字一样,运行类型信息 
  主要有COject类和CRuntimeClass类来实现,用来存贮COject类和派生类的运行类型信息, 
  1.类的基本情况:如类的名字,存贮空间大小,用于运行类的类型确定. 
  2.ms在C++的标准上,添加动态创建的类对象功能,也就是时时提到的动态创建 
  3.串行化处理. 
  The OS does not know main(), so C-runtime is first called and transfer control to main 
  it also provide library for common usage, such as math functions 
  
十、PASCAL


    WinMain()函数的调用约定是PASCAL。 
  
  在这里PASCAL是一个调用约定,由于这种方式最早由PASCAL采用,所以这么叫。 
  在MSDN中的C++ Language Reference中,Calling Conventions这一章都是讲调用约定的。 
  
  约定:微软重定义了许多约定类型,为的是可以让代码更容易跨平台或者跨编译器。 
  其实,调用约定要解决两个问题,都是针对堆栈操作: 
  1。参数传递的顺序(本质是压栈的顺序) 
  2。谁负责平栈(调用者还是调用对象) 
  一个函数的声明、定义和实现中的调用方式一般都一致。 
  
  WINAPI标识符的定义是:#define WINAPI __stdcall, __stdcall指Window调用函数的一种方式,也就是如何在堆中存取函数参数的方式。许多Windows Api函数调用声明为
    __stdcall方式。 
  
  
十一、消息


  一个消息由一个消息名称(UINT),和两个参数(WPARAM,LPARAM)。当用户进行了输入或是窗口的状态发生改变时系统都会发送消息到某一个窗口。 消息机制: 系统将会维
    护一个或多个消息队列,所有产生的消息都回被放入或是插入队列中。系统会在队列中取出每一条消息,根据消息的接收句柄而将该消息发送给拥有该窗口的程序的消息循
    环。每一个运行的程序都有自己的消息循环,在循环中得到属于自己的消息并根据接收窗口的句柄调用相应的窗口过程。而在没有消息时消息循环就将控制权交给系统所以
    Windows可以同时进行多个任务。 
  
十二、预编译头文件


  VC++程序一般包含的头文件都比较复杂,如果每次都逐行分析可能会花很多时间,所以VC++默认设置是第一次编译时分析所有头文件,生成.pch文件,这个文件很大,但以后每次编译时就可以节省很多时间。如果删除了这个文件,下次编译时VC++会自动生成它。 
  StdAfx.h是每个MFC程序的类中必须包括的文件,它一般由AppWizard自动生成,包括编译MFC类所必须的定义。 
  
十三、Windows支持两种类型的对话框:模式和无模式对话框。 


  模式对话框一旦出现在屏幕上,只有当它退出时,屏幕上该应用程序的其余部分才能响应。 
  无模式对话框出现在屏幕上时,程序的其余部分也可以作出响应,它就象浮动在上面一样。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值