Windows图形界面:Windows程序设计笔记——一、第一个Windows程序

1.动态链接

早期,windows的主要部分只需在三个动态链接库中实现,代表了windows的三个主要子系统:Kernel(内核) User(用户) GDI。

Kernel:内存管理,文件I/O,任务管理等

User:用户界面,负责所有的窗口管理

GDI:图形设备接口,负责在屏幕或打印机上显示文本和图形

在windows程序中,调用windows函数和调用C语言库函数(如strlen),没什么区别。最主要的区别在于C语言库函数的机器代码会直接链接到你的程序代码中,而windows函数则是放在你的程序之外的dll中。

2.头文件

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

  • windef.h 基本数据类型定义文件
  • winnt.h 支持Unicode的类型定义
  • winbase.h 内核函数
  • winuser.h 用户图形界面函数
  • wingdi.h 图形设备接口函数

这些头文件定义了windows的所有数据类型、函数调用、数据结构以及常量标识符

3.程序入口

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    MessageBox(NULL, TEXT("Hello Windows!"), TEXT("HelloMsg"), 0);
    return 0;
}

windows程序的入口是WinMain

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)

在WinBase.h中声明如下

WinMain (
    _In_ HINSTANCE hInstance,
    _In_opt_ HINSTANCE hPrevInstance,
    _In_ LPSTR lpCmdLine,
    _In_ int nShowCmd
    );

绝大部分windows程序在命名上都采用“匈牙利标记法”系统。变量名前有一个短前缀,用以表示该变量的数据类型。i表示int,sz“以零结尾的字符串”(String Terminated with a Zero),LP代表常指针(Long Pointer)。

#define WINAPI   __stdcall

这条语句规定了一种函数调用的约定,表明如何生成在堆栈中放置函数调用参数的机器代码。

WinMain的第一个参数一般叫做实例句柄(Instance Handle).在Windwos程序中,句柄无非就是一个数值,程序里用它来标识某些东西。比如我们这个例子中,这个句柄就唯一标识了我们这个程序。

实际上在某些Windows程序中,把句柄当作参数调用是必须的。比如早期的Windows版本中,当多路并发运行同一个程序时,就需要为那个程序创建多个实例。同一个程序的所有实例都共享代码一起只读存储(即菜单或者对话框模板之类的资源)。一个程序可以通过查看hPreInstance参数从而知道是否有其他的实例正在运行。它也可以因此跳过某些零散杂务步骤,把一些数据从前一个实例搬到自己的数据区来。在32位Windows中,这一概念已不再采用,因此WinMain的第二个参数通常总是NULL。

WinMain的第三个参数是用来运行程序的命令行(Command Line)。有些Windows程序在启动时用它来把文件装入内存。

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章