Windows程序设计1 起步

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Windows程序设计1 起步相关的知识,希望对你有一定的参考价值。

  自学《Windows程序设计》(第五版 珍藏版),内容为学习笔记。

1 基础

  Windows是抢占式、多任务、多线程图形操作系统。Windows具有一个图形用户界面(Graphical User Interface, GUI),有时亦称为“虚界面”或“图形界面”。所有的GUI都用位图(bitmap)视频显示器显示图形。图形能够提高屏幕资源的利用率,提供一个以视觉传递信息的便利环境,并可使用 WYSIWYG(所见即所得)来显示为打印文件而准备的图形及格式化文本。

  Windows环境中运行的程序可以共享存储在所谓动态链接库(Dynamic-Link Libraries, DLL)文件中的例程。Windows提供了在运行时把程序和动态链接库中的例程链接起来的机制。其实Windows本身基本上就是一套动态链接程序库。

  Windows是一个图形界面,Windows程序可以在视频显示器或打印机上充分利用图形和格式化文本。图形界面不仅仅看上去更酷、更引人注目,而且能够在更高层次上与用户交流信息。

  针对Windows环境编写的程序用不着直接访问屏幕或打印机之类的图形显示硬件。Windows自己带有一种图形编程语言,称作图形设备接口(Graphical Device Interface, GDI),用来方便地显示图形和格式化文本。Windows把显示硬件虚拟化。这样只要配有合适的Windows设备驱动程序,针对Windows环境编写的程序就可以在任何显卡或打印机上运行。应用程序本身并不需要知道系统到底配备了什么类型的设备。

  Windows工作原理的中心思想就是“动态链接”概念。Windows自身带有一大套函数,应用程序就是通过调用这些函数来实现它的用户界面和在屏幕上显示文本与图形的。这些函数都是在动态链接库里实现的。这些文件的名称都带有后缀.DLL,或有时带有后缀.EXE。Win10系统中,这些文件通常放在C:\Windows\System32子目录下。

  在Windows程序中,调用Windows函数与调用C语言的库函数(如Strlen),没什么两样。最主要的区别就是C语言库函数的机器代码会直接链接到你的程序代码中,而Windows函数则是放在你的程序之外的DLL里。

  当Windows程序运行时,它通过一个叫做“动态连接”(dynamic linking)的进程与Windows接口。每个Windows的EXE文件包含它所要用的各个动态链接库以及库中的函数的引用地址(reference)。当一个Windows程序被装入内存之后,程序中的函数调用都被解析成DLL函数入口的指针,同时这些被调用的函数也被装入内存。

  当链接Windows程序以生成执行文件时,一定得链接你的编程环境所提供的特殊的“导入库”(import library)。这些导入库包含所有Windows函数调用要碰到的动态链接库的名字及引用信息。链接程序利用这些信息构建EXE文件中的表格,当装入程序的时候,Windows要靠这些表格来解析Windows函数调用。

 

2 配置Visual Studio 2017

  让Visual Studio 2017带上Windows API文档,即获取MSDN,具体参考http://blog.csdn.net/qq_33369475/article/details/74931006

 

3 第一个Windows程序

/*----------------------------------------------------------
	HelloMsg.C -- Displays "Hello, Win10!" in a message box
  ----------------------------------------------------------*/

#include<Windows.h>

int WINAPI WinMain(HINSTANCE hInstance,
				   HINSTANCE hPrevInstance,
				   PSTR szCmdLine,
				   int iCmdShow)
{
	MessageBox(NULL, TEXT("Hello, Win10!"), TEXT("HelloMsg"), 0);

	return 0;
}

3.1 头文件

  WINDOWS.H是一个最重要的包含文件,它囊括了若干其他Windows文件,其中的某些头文件又包含另外一些头文件。下列几个是最要也是最基本的头文件:

  • WINDEF.H 基本数据类型定义
  • WINNT.H 支持Unicode的类型定义
  • WINBASE.H 内核函数
  • WINUSER.H 用户界面函数
  • WINGDI.H 图形设备接口函数

3.2 程序入口

  正像main是C程序的入口一样,Windows程序的入口是WinMain。将光标移到WinMain处,按F1打开帮助。

  WinMain entry point--The user-provided entry point for a graphical Windows-based application.

  看看语法:

int CALLBACK WinMain(
  _In_ HINSTANCE hInstance,
  _In_ HINSTANCE hPrevInstance,
  _In_ LPSTR     lpCmdLine,
  _In_ int       nCmdShow
);

  CALLBACK宏和WINAPI本质都是一样的,在WINDEF.H中定义如下:

#define CALLBACK    __stdcall
#define WINAPI      __stdcall

  这是一种函数调用约定,表明如何生成在堆栈中放置函数调用参数的机器代码。绝大多数Windows函数调用都定义成WINAPI。

  _In_宏告诉我们这是个输入参数,同时还有_Out_,表示输出参数。这对宏并不参与编译和计算(空宏),但对API使用者起到提示作用。

  参数类型的定义细节先不要细究,感兴趣可以Alt+F12浏览。

  第一个参数叫“实例句柄”。在Windows程序中,句柄就是一个数值,程序里用它来标识某些东西。比如在该程序中,这个句柄唯一标识了这个程序。

  早期的Windows版本中需要hPrevInstance(原因见p15),在32位Windows中已经不再需要。因此第二个参数总是NULL。

  第三个参数类型改为了PSTR,LPSTR和PSTR在WINNT.H中都声明为指向字符串的指针。LP是16位的产物。该参数是用来运行程序的命令行。有些Windows程序在启动时用它来把文件装入内存。

  第四个参数用来指明程序最初如何显示:或正常显示,或最大化到全屏,或最小化显示在任务栏上。

  统一说命名,绝大部分Windows程序在变量命名上都采用所谓“匈牙利标记法”(Hungarian Notation)。在这一系统中,变量名前都有一个短前缀,用以表明改变量的数据类型。这里,i表示int,sz表示“以零结尾的字符串”(String Terminated with a Zero),考虑本质,故更改了后两个参数的名字。

3.3 MessageBox函数

  老办法,移入光标,按F1。

  MessageBox function--Displays a modal dialog box that contains a system icon, a set of buttons, and a brief application-specific message, such as status or error information. The message box returns an integer value that indicates which button the user clicked.

int WINAPI MessageBox(
  _In_opt_ HWND    hWnd,
  _In_opt_ LPCTSTR lpText,
  _In_opt_ LPCTSTR lpCaption,
  _In_     UINT    uType
);

  _In_opt_表示参数是可选的,就是可以为NULL。

  第一个参数通常是窗口句柄。

  第二个参数是将要在信息框里出现的文本字符串。

  第三个参数是将要在标题栏上显示的文本字符串。这些文本串都被打包在TEXT宏代码(Macro)里。一般来说,并不需要把所有的字符串都打包到TEXT中,之所以这样做是因为这样把程序转换成Unicode时会方便很多。

  第四个参数是以前缀MB_打头的一些常量的组合。WINUSER.H中定义了这些相关常量。主要用于控制图标、按钮等样式。MSDN中也可以仔细查看。

  返回值和按钮有关,即按下不同按钮会返回不同的值。

以上是关于Windows程序设计1 起步的主要内容,如果未能解决你的问题,请参考以下文章

python起步--windows系统下安装python解释器和PyCharm

GitHub起步---创建第一个项目

菜鸟关于Windows消息循环的疑问

Python起步

Go语言:Windows下最能凑合用的桌面GUI库(lxn/walk 起步教程)

Git起步--git安装与初次运行git前配置