Chapter01 Windows起步

对于操作系统,Windows、Linux、Mac OS等PC操作系统,以及新兴的Android、IOS等移动操作系统,都让我时刻感受到计算机世界的快速变化。作为普通一员,Windows系统算是我们接触最为广泛的,我的程序员生涯也理所应当得与Windows系统连在了一起。虽然Windows系统正经受着越来越大的挑战,但对于它,我始终有一种难以割舍的感觉,也许是习惯了,即便它有再多的问题,也愿意工作、生活与Windows一起。

毕业快两年了,虽然在工作中写了几万行代码,但总感觉缺少些什么,或许是对Windows本身缺少更深刻的认识,我决定再次学习下《Windows程序设计》这本书,从中加深自己对程序设计的认识。同时能够整理下学习心得,与各位予以探讨、分享,如有疑点,跪求指出讨论,希望自己和你们都能从中吸收营养,如古人所说”择其善者而从之,其不善者而改之“。

1.Windows历史

从1983年11月到现在,Windows1.0、2.0、3.0、NT、XP以及现在用的比较多的WIN7,它也经历了从MS-DOS到图形化操作界面的巨大转变,期间的各种改进与教训,让我不禁感叹:一个成熟的产品,需要多少人多少年不懈的努力与创新,方能得到世界范围内的认同。至于国内操作系统大起大落、到毫无音讯,身为程序员,感到很是失落,只能说我们的路还有很长要走,希望少走弯路,几十年磨一剑,让我等程序员能够有自豪感与荣誉感,否则只能向西看齐了。

  说到操作系统的图形环境,包括Windows以及Macintosh,都应该归功于施乐公司(Xerox)的帕洛阿托研究中心(PARC)在20世纪70年代中期所进行的开创性工作-图形用户接口(GUI)。感兴趣的网友们,可以搜索下这家公司的资料,^_^。

2.Windows方方面面

早期Windows的多任务系统是”非抢占型“(Non-Preemptive)的,也就是说当时还不能用系统时钟把系统中正在运行的各个程序的处理时间分段,这些程序必须自觉放弃对处理器的控制,给予其他程序运行的机会。在Windows NT以及后来的系统中,多任务系统是”抢占型“(Preemptive)的,程序本身也可以分为多个线程,这些线程好像都在同时执行一样。

Windows环境中运行的程序可以共享存储在所谓的动态链接库(Dynamic-Link Libraries, DLL)文件中的进程,Windows提供了在运行时把程序和动态链接库中的例程链接起来的机制。Windows工作原理的核心就是”动态链接“概念,Windows自身带有一大套函数,应用程序就是通过调用这些函数来实现它的用户界面和在屏幕上显示文本与图形的。这些函数都是在动态链接库里实现的,这些文件的后缀名通常是.DLL或者.EXE。在Windows 98中,这些文件放在\WINDOWS\SYSTEM子目录下,而在Windows NT中,则放在\WINDOWS\SYSTEM和\WINDOWS\SYSTEM32子目录下(64位PC上这些文件在\WINDOWS\SYSTEM32、\WINDOWS\sysWOW64目录下

另外Windows系统三个主要的动态链接库是内核(KERNEL32.DLL)、用户(User32.DLL)、GDI(GDI32.DLL)。其中内核负责操作系统的传统工作,包括内存管理、文件输入/输出及任务管理等;用户指的是用户界面,负责所有的窗口管理;GDI就是图形设备接口,负责在屏幕或者打印机上显示文本与图形。

3.编程语言

现在支持Windows系统的变成语言,除了常见的C/C++,还有VB、JScript等脚本语言,我们刚开始都会有选择性的恐惧或者不知所措,这本书作者的观点可能会给我们提供些参考:应用程序本身的特性应该是决定采用何种编程工具的最主要因素。比如我们需要一个应用程序对Excel表格数据进行处理时,也许使用Excel自带的VBA项目工程(VBA语言,是Visual Basic的一种宏语言)来开发,比我们使用MFC做的更高效更有利,因为Excel自带的VBA项目本身对Excel数据处理就非常高效。根据个人的爱好,在《Windows程序设计》这本书的学习过程中,我用C++语言在Visual Studio2010平台上开发。

4.第一个Windows程序

"Hello, world"程序或许是我与同仁们接触最早的程序,但是它包含了程序的基本框架,仔细看看内部结构,并与C语言代码比较下,我认为对今后Windows程序很有帮助。

C语言代码如下:

#include <stdio.h>

int main()
{
      printf("Hello, world");
      return 0;
}

对应的Windows代码如下:

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPreInstance, PSTR szCmdLine, int iCmdShow)
{
	MessageBox(NULL, TEXT("Hello, world"), TEXT("HelloMsg"), 0);
	return 0;
}
比较:

1>头文件<windows.h>功能与<stdio.h>功能类似,包含程序运行需要的函数、数据结构;

2>WinMain主函数与main函数功能类似,提供程序运行的入口;

3>MessageBox函数与printf函数功能类似,提供字符串输出功能;

接下来,我们仔细剖析下Windows程序的基础框架:

1>头文件:<windows.h>是一个最重要的头文件,囊括了其他Windows头文件,部分文件描述如下:

WINDEF.H:基本数据类型定义

WINNT.H:支持Unicode的类型定义

WINBASE.H:内核函数

WINUSER.H:用户界面函数

WINGDI.H:图形设备接口函数

2>程序入口:Windows程序的入口时WinMain,该函数声明如下:

int WINAPI WinMain(          HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow
);
第一个参数:hInstance表示程序的当前实例句柄。在执行WinMain函数内部其他语句前,该句柄已经被赋值。

第二个参数:hPreInstance表示程序的之前实例句柄。一般情况下为NULL。详见MSDN对该参数的解释。

第三个参数:lpCmdLine表示程序指定的命令行字符串(以null结尾的字符串)。

第四个参数:nCmdShow表示程序窗口显示的方式,默认值为SW_SHOWNORMAL。

3>MessageBox函数:用来显示消息对话框,该函数声明如下:

int MessageBox(          HWND hWnd,
    LPCTSTR lpText,
    LPCTSTR lpCaption,
    UINT uType
);
第一个参数:hWnd表示窗口句柄,表示该消息窗口对应的父窗口句柄,如果没有指定的话,可以设置为NULL。

第二个参数:lpText表示消息提示内容字符串。

第三个参数:lpCaption表示消息标题字符串。

第四个参数:uType表示消息对话框的内容及行为,用MB_开头的一些常量组合(用或运算符(|)连接)。

对话框按钮常量如下:

#define MB_OK                       0x00000000L
#define MB_OKCANCEL                 0x00000001L
#define MB_ABORTRETRYIGNORE         0x00000002L
#define MB_YESNOCANCEL              0x00000003L
#define MB_YESNO                    0x00000004L
#define MB_RETRYCANCEL              0x00000005L
对话框图标常量如下:

#define MB_ICONHAND                 0x00000010L
#define MB_ICONQUESTION             0x00000020L
#define MB_ICONEXCLAMATION          0x00000030L
#define MB_ICONASTERISK             0x00000040L
对话框默认按钮常量如下:

#define MB_DEFBUTTON1               0x00000000L
#define MB_DEFBUTTON2               0x00000100L
#define MB_DEFBUTTON3               0x00000200L
#define MB_DEFBUTTON4               0x00000300L

5.总结

今天我们一起学习了Windows操作系统历史以及相关方面的简单介绍,最后展示了Windows程序的基础框架。自知时间不多,我写的内容不够详细,如果各位同仁需要更详细资料,请搜索网络或者MSDN查阅。

Bye, ^_^.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值