C语言编制程序学习,Windows程序设计

  刚开始上学Windows程序设计,磕磕碰碰,先做个小笔记缓缓神经,首假诺将MessageBox这些Windows
API函数的。

C语言是面向进度的,而C++是面向对象的

目录

  MessageBox函数是多多益善人刚开头攻读Windows程序设计依旧是Windows
API际遇的首先个放置函数,这几个函数使用的措施是:

C和C++的区别:

二.一       Windows数据类型.. 一

  Message博克斯(NULL, TEXT(“弹出框内容”),
TEXT(“标题”), MB_OK);

C是一个结构化语言,它的关键在于算法和数据结构。C程序的宏图重点记挂的是怎样通过一个进度,对输入进行演算处理获得输出控制)。

2.壹.一       Windows数据类型示例.. 一

  初次之外,它还有多少个姐妹:

C++,首要思考的是如何协会三个指标模型,让那几个模型能够适合与之相应的难点域,那样就可以透过取得对象的图景新闻获得输出或落到实处进度控制。
所以C与C++的最大不一致在于它们的用来缓解问题的思想方法不平等。之所以说C++比C更先进,是因为“
设计那些定义已经被融入到C++之中 ”。

二.壹.二       Windows 数据类型与正式C 数据类型的关系.. 五

  MessageBoxA(NULL, “弹出框内容”,
“标题”, MB_OK);   // TEXT可有可无

C与C++的最大分别:在于它们的用来缓解难题的想想方式不1样。之所以说C++比C更升高,是因为“
设计这些定义已经被融入到C++之中
”,而就语言本人而言,在C中越来越多的是算法的定义。那么是还是不是C就不重大了,错!算法是先后设计的底蕴,好的铺排假使未有好的算法,一样特别。而且,“C加上好的筹划”也能写出越来越好的事物。

二.1.3       Windows 数据类型与Windows API 5

  MessageBoxW(NULL, L””, L””, MB_OK);  
                    // 那几个L用来代表Unicode,不得以省略

图片 1

二.一.四       Windows 中的数据结构.. 陆

  其实之所以有那多少个是因为微软特殊必要满意Windows
九八之后对汉字等其余语言编码的供给,那种须要通过Unicode完毕,但是微软本意不是要大家采纳Unicode来编制程序,而是通过动用“通用”方式,约等于MessageBox();函数,完毕不一样的编码首要依旧通过IDE集成开发环境下转移分歧的编码格局。回到MessageBox();,前些天比较感冒的是,怎么在MessageBox();中落到实处变量的打字与印刷呢?

上次大家说了怎样是windows编制程序?精晓到Windows API
编制程序、Windows编制程序、Windows SDK 编制程序是二个概念。

2.二       Windows API 的效益分类.. 7

  仿佛C语言中平日选择printf函数,这一个函数挺有趣的,应为函数输入的参数是未曾限定个数的,也就是是随机改变的。例如:

前几天大家选取C语言来贯彻您的首先个实在的Windows程序。

二.贰.1       系统宗旨服务.. 7

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 int main(){
 5
 6     int x=100, y=200, z=300;    
 7     
 8     printf("%d %d %d.\n", x, y, z);
 9     system("pause");
10     return 0;
11 }

windows.h 头文件介绍:

2.二.二       系统一管理理.. 九

 

编纂Windows程序,首先要含有 windows.h 头文件。windows.h
还包罗了其余部分Windows头文件,例如:

二.2.三       用户界面.. 九

  这么些printf函数不仅能够选取七个参数打字与印刷,还能用来直接打字与印刷变量,可是MessageBox却不能够一向打字与印刷,这些引起笔者的向来思量。小编先想到的是树立二个缓冲区,利用那些缓冲区取打字与印刷字符数量。当然打字与印刷的函数得使用sprintf了

windef.h:基本类型定义

贰.2.四       图像和多媒体.. 15

  

winbase.h:内核函数

2.2.5       网络.. 15

 1 int main(){
 2     
 3     int a = 12;
 4     char szBuffer[100];             // 使用一个字符数组来做缓冲区
 5 
 6     sprintf(szBuffer, "helloworld %d.\n", a);
 7     _snprintf(szBuffer, 100, "helloworld %d.\n", a);
 8         // 使用_snprintf函数比较安全,因为可以输入限定字符的个数  
 9 
10     printf("%s.\n", szBuffer);
11     puts(szBuffer);                            // 可以使用printf中的%s将szBuffer打印出来,或者用puts直接输出
12     //printf("helloworld.\n");
13 
14     system("pause");
15     return 0;
16 }

wingdi.h:用户接口函数

2.二.陆       别的作用.. 一5

 

winuser.h: 图形设备接口函数

2.3       Windows API核心DLL. 16

  那么些缓冲区的法子假设用在MessageBox函数里面,就足以兑现打字与印刷变量的点子,比如以下代码:

那个头文件定义了Windows的拥有数据类型、函数原型、数据结构和符号常量,也便是说,全体的Windows
API都在那些头文件中宣称。

2.3.1       Kerne132.dll 16

#include <windows.h>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){
    int a = 12;

    TCHAR szBuffer[100];                  // 通用版本
    _stprintf(szBuffer, TEXT("hello 通用 %d"), a);
    MessageBox(NULL, szBuffer, TEXT("通用"), MB_OK  | MB_ICONINFORMATION);

    return 0;
}

在C语言中,程序都以“黑屏”的,称为控制台程序(Console
Application)。那套教程要讲的是带界面包车型大巴Windows程序(Windows
Application),也叫做GUI程序(GUI Application)。

2.3.2       User32.dll 16

 

控制台程序以 main() 为入口函数,Windows程序以 WinMain()
为入口函数,动态链接库以 DllMain()
为入口函数,分裂的入口函数决定了分化品种的顺序。

2.3.3       Gdi32.dll 16

  可是每便都写个缓冲区来存放在,并且1不下心忘记行使_snprintf函数,那就GG了,很恐怕发生缓冲区溢出的高危。因此,那里运用printf原先函数设计的原理,我们也来统一筹划三个Message博克斯Printf();函数,用那个函数来兑现格式化输出的效益,要贯彻那些函数,首先得参考printf();函数的兑现原理。

WinMain() 函数的原型为:

2.3.4       标准C函数.. 17

int my_printf(const char * szFormat, ...){

    int iReturn;
    va_list pArgs;

    va_start(pArgs, szFormat);
    iReturn = vprintf(szFormat, pArgs);
    va_end(pArgs);

    return iReturn;
}


int main(){

    int x=100, y=200, z=300;

    printf("hello %d, %d, %d.\n", x, y, z);        
    my_printf("test_my_printf,哈哈%d %d.\n", x, y);

    system("pause");
    return 0;
}

int WINAPI WinMain(

2.3.5       其他Dll 17

 

HINSTANCE hInstance, // 当前窗口句柄

二.四       Unicode和多字节.. 一七

  …代表的意趣是流传的参数是可变参数个数的,va_start(pArgs,
szFormat);表示指向szFormat之后的一个参数,这几个函数的好多东西作者前些天也还没明白过来,之后再来补充,可是今后仿效那一个函数我们得以本人写个MessageBoxPrintf();函数,具体代码如下:

HINSTANCE hPrevInstance, //
前多个窗口句柄,Win3贰下为NULL(Win1陆留下的废料,近年来已弃用)

2.4.1       W版本和A版本的API 21

// 自己做一个格式化的messageboxprintf对话框
int CDECL MessageBoxPrintf(TCHAR * szCaption, TCHAR * szFormat, ...){

    TCHAR szBuffer[1024];
    va_list pArglist;

    va_start(pArglist, szFormat);
    _vsnprintf(szBuffer, sizeof(szBuffer)/sizeof(TCHAR), szFormat, pArglist);
    va_end(pArglist);

    return MessageBox(NULL, szBuffer, szCaption, MB_OK | MB_ICONINFORMATION);
}


int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow){

    int x=100, y=200, z=300;
    int cxScreen, cyScreen;

    cxScreen = GetSystemMetrics(SM_CXSCREEN);
    cyScreen = GetSystemMetrics(SM_CYSCREEN);

    // MessageBoxW(NULL, L"helloworld", L"biaoti", MB_OK);
    // MessageBoxA(NULL, TEXT("helloworld"), TEXT("biaoti"), MB_OK);
    MessageBoxPrintf(TEXT("我的标题"), TEXT("hello %d %d %d"), x, y, z);    // 把这个函数做好后,直接就可以输出
    MessageBoxPrintf(TEXT("我的屏幕大小"), TEXT("我的屏幕宽度是:%d.\n高度是:%d.\n"), cxScreen, cyScreen);


    return 0;
}

LPST哈弗 lpCmdLine, // 命令行参数

2.4.2       Unicode与ASGII的转换.. 22

  相当于自身统一筹划出来二个近似printf的小工具,因为微软真正并未有安插Message博克斯中实行格式化输出的函数。

int nCmdShow // 窗口展现格局

2.4.三       对Windows程序设计规范的提议.. 2二

);

2.5       小结.. 23

先不用解决难点过于急躁精晓那一个参数的意义,笔者先给大家写1个简便的不带黑屏的、真正的Windows程序:

 

#include

 

int WINAPI WinMain(

 

HINSTANCE hInstance,

二.1    Windows数据类型

Windows API 使用了许多 Windows 自个儿定义的数据类型。读者也许相比较熟稔 C
语言或 C++语言的数据类型。要烂熟应用 Windows API 必须要熟习 Windows
数据类型。这么些数据类型是Windows 特有的。在 SDK 的相关头文件中有定义。

在很多的Windows 数据类型中,最常用的有
DWO本田CR-VD、HANDLE、LPTST科雷傲、WO景逸SUVD、BYTE、CHA瑞鹰 等。在 Windows 系统中,DWO翼虎D
用于表示无符号整型的数量,意为 double word,33位。

在相似情形下 BYTE 是 8 位的,而 WOPAJEROD 是 1陆 位,DWO中华VD 正是 3二 位的。

Windows 系统的应用程序中还持有贰个故意的数据类型-HANDLE,平日 HANDLE
类型的变量用于唯壹标识3个“对象”,如窗口、控件、文件等,Windows
平西安存在诸多那样的对象,对象是程序操作的目的。HANDLE 也是一个 三10个人的数据类型。

HINSTANCE hPrevInstance,

二.一.一    Windows数据类型示例

实例二-一应用了三种为主的 Windows 数据类型,演示 Windows
数据类型在先后中的使用方法。

  1. 实例2-一 常用Windows数据类型演示(DWO大切诺基D/LPSTHighlander/CHA安德拉/INT)

本实例定义了多少个常用常量的 Windows 数据类型,包蕴 DWORubiconD,LPST宝马7系 和
CHALacrosse,并演示了怎么着选用它们进行了复制、相比较大小等操作。

/* ************************************
*《精通 Windows API》 
* 示例代码
* windata.c
* 2.1.1  常用的 Windows 数据类型
**************************************/
/* 头文件  */
#include <windows.h>
#include <stdio.h>
/* ************************************
* 功能  Windows 数据类型演示
**************************************/
int WINAPI WinMain( 
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow
)
{
//定义字符串
LPSTR szString = "Windows data type, string.";
//定义字符数组
CHAR lpString[120];//要大于 szString 的长度
//定义 DWORD 类型的数据
DWORD dwMax = 0xFFFFFFFF;
DWORD dwOne = 0x1;
//定义 INT 类型的数据
INT iMax = 0xFFFFFFFF;
INT iOne = 0x1;
//显示字符串
MessageBox(NULL,szString,"LPSTR",MB_OK);
//复制内存,将字符串复制到数组中(包括 NULL 结束符)
CopyMemory(lpString, szString,lstrlen(szString)+1);
//显示复制的字符串
MessageBox(NULL,lpString,"CHAR[]",MB_OK);
//比较 DWORD 并显示结果
if(dwMax>dwOne)
{
MessageBox(NULL,"DWORD 类型的数据 OxFFFFFFFF > 0x1","DWORD",MB_OK);
} 
//比较 INT 并显示结果
if(iMax<iOne)
{
MessageBox(NULL,"INT 类型的数据 OxFFFFFFFF < 0x1","INT",MB_OK);
}
return 0;
}

 

 

在那一个顺序中,使用了 四 种 Windows 数据类型,分别是 LPST帕杰罗、CHASportage、DWO瑞虎D 和
INT。

LPST福特Explorer 类型的多少是字符串,也正是字符指针,CHA宝马X三 是字符,DWO卡宴D 是 叁十一人的无符号整数,INT 是 3二 位有标志整数。程序运转后会弹出 5个对话框。那表达 dw马克斯>dwOne 是确立的。i马克斯<iOne 也是起家的。dwMax与 i马克斯 的数值是均等的,dwOne 与 iOne
的数值也是相同的。然而比较结实分裂,是因为两岸的数据类型差异等。

 

  1. 查阅Windows数据类型的概念

在 Visual Studio
中能够查阅数据类型的定义。在数据类型的档次名(比如“DWOLANDD”)上单击右键,选用“转到定义”,如图
二-1 所示。

 图片 2

图2-1

能够从 SDK 的头文件中见到各品种的类型定义。

“INT”的定义如下:

 typedef int                 INT;

 

“DWO猎豹CS陆D”的定义如下:

 typedef unsigned long       DWORD;

 

“CHAPRADO”的定义如下:

 typedef char CHAR;

 

    从中能够窥见,这么些 Windows 数据类型皆以从标准 C
的数据类型经过类型重定义而来。INT 数据类型是有标志整型,DWO翼虎D
数据类型是无符号整型。 那就表达了为啥在实例 2-壹 中 INT 数据类型的变量
i马克斯 实际是“-一”,而 DWOKugaD 类型的变量 dwMax实际是“42949672九五”,所以相会世如上的比较结实。

  1. 最普遍的Windows数据类型

表二.1 常用的大旨Windows数据类型

类型

描述

BOOL

布尔型变量(值只能是True或False)

BYTE

字节类型(8位)

CHAR

8比特字节(ANSI)

CONST

常量,相当于标准C中的”const”关键字

DWORD

32字节无符号整型数据

DWORD32

32字节无符号整型数据

DWORD64

64字节无符号整型数据

FLOAT

浮点数据类型

HANDLE

对象的句柄,最基本的句柄类型

HICON

图标的句柄

HINSTANCE

程序实例的句柄

HKEY

注册表键的句柄

HMODULE

模块的句柄

HWND

窗口的句柄

INT

32位符号整型数据类型

INT_PTR

指向INT类型数据的指针类型

INT32

32位符号整型

INT64

64位符号整型

LONG

32位符号整型,相当于C语言的标准数据类型long

LONGLONG

64位符号整型

LONG32

32位符号整型

LONG64

64位符号整型

LPARAM

消息的L参数

WPARAM

消息的W参数

LPCSTR

Windows(ANSI)字符串常量

LPCTSTR

根据环境配置,如果定义了UNICODE宏,则是LPCWSTR类型,否则是LPCSTR类型

LPCWSTR

UNICODE字符串常量

LPDWORD

指向DWORD类型数据的指针

LPSTR

Windows(ANSIC)字符串常量

LPTSTR

根据环境配置,如果定义了UNICODE宏,则是LPTSTR类型,否则是LPSTR类型

LPWSTR

UNICODE字符串常量

SHORT

无符号短整型(16位)

SIZE_T

表示内存大小,以字节为单位,其最大值是CPU最大寻址范围

TCHAR

如果定义了UNICOD,则为WCHAR,否则为CHAR

UCHAR

无符号CHAR

UINT

无符号INT

ULONG

无符号LONG

VOID

无类型,相当于标准C语言的void

WCHAR

16位Unicode字符

WINAPI

Windows API的函数调用方式,常见于SDK头文件中对API函数的声明中,相当于__stdcall(更严格讲,不是数据类型,而是函数调用约定)

WORD

16位无符号整型数据

  1. Windows数据类型名称命名的原理

Windows 数据类型的命名都很有规律。

大旨数据类型包涵 BYTE、CHAWrangler、WOSportageD、SHORubiconT、DOW奥迪Q7D、INT 等。

指针类型的下令形式相似是在其针对性的数据类型前加“LP”或“P”,比如针对
DWO汉兰达D的指针类型为“LPDWOTiggoD”和“PDWOEnclaveD”。

各样句柄类型的通令方式一般都以在目的名前加“H”。Windows
系统中有过多对象,全体表示三个指标的数据类型都是句柄,每一种对象都对应着一种句柄类型,比如与位图(
BITMAP)对应的句柄类型为“HBITMAP”,与菜单(MENU)对应的句柄类型为“HMENU”,与窗口(WINDOW)对应的句柄类型为“HWND”。无符号类型一般是以“U”早先,比如“INT”是符号类型,“UINT”是无符号类型,“LONG”是标志类型“ULONG”是无符号类型等。

LPSTR lpCmdLine,

二.一.2    Windows 数据类型与规范C 数据类型的关系

查看 Windows 数据类型的定义能够观看,全部的 Windows 数据类型都以由 C
数据类型经过类型重定义获得的。如 DWO凯雷德D 实质上正是 unsigned long
数据类型,3二 位的无符号整型:

typedef unsigned long       DWORD;

 

实际上 VC 编写翻译器是1个整机的 C 编写翻译器,其余并未过多的扩展。Windows
数据类型也不是 VC 的内建品种,而从业内 C 类型重定义获得。

int nCmdShow

二.一.三    Windows 数据类型与Windows API

Windows API 函数的参数、重回值或局地重要的常量使用的数据类型都以 Windows
数据类型。如:

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

 

MessageBox 函数的重返值是 int 型的,是规范 C
数据类型,可是全数的参数都选择了Windows 数据类型。如 HWND 是1种 W
indows 数据类型,用于表示窗口的句柄;LPCTSTOdyssey 也是Windows
数据类型,表示字符串常量;UINT 也是 Windows 数据类型,为无符号整型。

){

二.1.4    Windows 中的数据结构

Windows 中包含很种种数据结构类型,在区别类型的 API
中会使用到不一样的数据结构,由于数据结构的多少很多,将在持续章节具体的实例中牵线达成每一种功效所接纳的数据结构。数据结构常常会作为1些
API 的参数输入。

typedef struct _WIN32_FILE_ATTRIBUTE_DATA{
DWORD    dwFileAttributes;
FILETIME  ftCreationTime;
FILETIME  ftLastAccessTime;
FILETIME  ftLastWriteTime;
DWORD    nFileSizeHigh;
DWORD    nFileSizeLow;
} WIN32_FILE_ATTRIBUTE_DATA,*LPWIN32_FILE_ATTRIBUTE_DATA;

 

相当于:

typedef struct _WIN32_FILE_ATTRIBUTE_DATA{
DWORD    dwFileAttributes;
FILETIME  ftCreationTime;
FILETIME  ftLastAccessTime;
FILETIME  ftLastWriteTime;
DWORD    nFileSizeHigh;
DWORD    nFileSizeLow;
};
typedef _WIN32_FILE_ATTRIBUTE_DATA WIN32_FILE_ATTRIBUTE_DATA;
typedef _WIN32_FILE_ATTRIBUTE_DATA *LPWIN32_FILE_ATTRIBUTE_DATA;

 

Windows SDK 中,结构体也有温馨的命名规范。壹般情况下,Windows
系统中选用全大写来命名结构体、共用体,并使用“_”来分隔单词,在布局名加“LP”或“P”表示针对数据结构的指针。

// 调用API 函数MessageBox

二.二    Windows API 的法力分类

Windows API
所能完结的作用包蕴过多地点,在拓展应用程序的付出时,开发人士只怕会使用到文件、进度、内部存款和储蓄器、权限、系统消息等系统的中坚服务和系统管理类的
API,大概会用到图形用户界面、控件等函数和对象,大概须求在界面上制图图像处理多媒体信息等,还包罗开始展览网络通讯支出等。

int nSelect = MessageBox(NULL, TEXT, TEXT(), MB_OKCANCEL);

二.贰.一    系统基本服务

系统基本服务是 Windows API
最中心的内容,是最常使用到的程序接口。系统大旨服务API 包涵以下多少个方面。

  1. 文件系统

对文本的基本操作包蕴文件的创办、打开、读写、关闭、删除,文件属性的设置与收获,目录操作,以及磁盘分卷的操作,还包含镜像文件、加密文件系统等。

  1. 内部存款和储蓄器管理

注重是内在的分配、共享、释放等内容,蕴含虚拟内部存款和储蓄器管理、分页机制、堆管理等。

  1. 进度、线程和模块

包含进程主程序(
exe)、模块、动态链接库(dll)的编纂;线程的基本概念,线程成立、遍历、同步等操作;进程与权力;线程与纤程等剧情。

  1. 设施 I/O、驱动程序控制

席卷设备对象等基本概念。加载与卸载驱动程序,控制驱动程序,与驱动程序通讯等。

  1. 调剂与错误处理

包罗如何开发调节和测试器,程序运营错误的处理,日志的记录、Windows
可执行文件的结构等。

  1. Windows 系统新闻

席卷注册表的操作,如打开注册表,读取、写入键值,创立、删除键;还包罗系统中央音信的收获和装置,如系统目录、系统版本、总结机名等。

  1. 进程间通讯

包罗使用共享文件举办进度间通讯的形式,使用音讯实行进度间通讯的方法,使用邮槽、管道等举行进程间通讯的法子,使用互联网共享举行进程间通讯的办法。

  1. 定时器与新闻机制

新闻机制是 Windows 系统中很首要的一种体制。大概拥有的 Windows
应用程序都在与消息打交道,而 Windows
的新闻机制又是借助于定时器的。所以精通 Windows 音信机制是上学Windows
应用程序开发的显要内容。

  1. 其他

Windows
的种类主题服务还包罗品质监视、电源管理、索引与数码存款和储蓄等,也将在本书中有着关联。

  1. 实例 2-二 将系统目录音信写入 systemroot.txt

本实例使用了 Windows 系统中心服务中的部分
API,完毕将系统目录路径写入文件中。在此间不对完毕原理做过多的诠释,只是使读者对
Windows 系统服务 API 有发轫的问询。

/* ************************************
*《精通 Windows API》 
* 示例代码
* basic.c
* 2.2 Windows API 的功能分类
**************************************/
/* 头文件  */
#include <windows.h>
/* ************************************
* 功能  获取系统目录信息,并存储到文件中
**************************************/
int main(int argc, TCHAR argv[])
{
//文件句柄
HANDLE hFile;
DWORD dwWritten;
//字符数组,用于存储系统目录
TCHAR szSystemDir[MAX_PATH];
//获取系统目录
GetSystemDirectory(szSystemDir,MAX_PATH);
//创建文件 systemroot.txt
hFile = CreateFile("systemroot.txt",
GENERIC_WRITE,
0,NULL,CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
//判断文件是否创建成功
if(hFile != INVALID_HANDLE_VALUE)
{
//将系统目录系统信息写入文件
if(!WriteFile(hFile,szSystemDir,lstrlen(szSystemDir),&dwWritten,NULL))
{
return GetLastError();
}
}
//关闭文件,返回。
CloseHandle(hFile);
return 0;
}

 

运维程序,在先后所在的目录会生成文书“systemroot.txt”,文件内容为系统目录。

if(nSelect == IDOK){

2.2.二    系统一管理理

系统一管理理是 Windows 系统中很首要的始末。Windows 系统提供了以下方面包车型地铁 API
供应用程序开发职员使用,包涵:管控台接口、程序安装、系统复苏、职责调度、Windows
运程管理。

MessageBox(NULL, TEXT(“你点击了“分明”按钮”), TEXT, MB_OK);

二.二.三    用户界面

用户界面开发是 Windows 应用程序开发的重大内容。Windows
用户界面重要包罗多个部分,Windows Shell 和 Windows 图形用户界面。Windows
图形用户界面包涵窗口对象的相干内容,界面财富,控件、用户数据交流(粘贴板等)和用户输入的拍卖。

  1. 窗口化

归纳1些为主数据概念和对象:窗口类、音讯对列、窗口进程(新闻处理函数)、窗口属性等。
重要回顾的 API
有窗口类注册的函数、窗口建立与关闭函数、窗口属性修改函数等。

  1. 资源

能源是 Windows
应用程序中很要紧的壹项内容,在可执行文件中,专门有用于存款和储蓄能源的节。
那里所说的能源是界面能源,包涵图标、菜单、字符串、版本消息、对话框、动态光标、插入号(Carets)等。财富的拍卖涉嫌众多
API 函数。

  1. 用户输入处理

席卷对话框、键盘加快器(飞速键)、键盘输入、鼠标输入、原始数据输入等。这几个概念是先后通过用户界面与用户展开交互的基本概念。

  1. 数据沟通

回顾 Atom
表(包蕴了若干字符串和标识符)、粘贴板、数据复制、动态数据交接等基本概念,是用户和应用程序通过用户界面进行数据调换的最首要载体。

  1. Windows 图形界面通用控件

Windows 系统提供了不少于 30 种的控件供应用程序选拔,在那之中最常用的两种包罗艾德it控件(文本框)、Button 控件(按钮)、ListView 控件(列表)、ToolTip
控件(提醒框)、ComboBox 控件(下拉摘取框)、Tree-View
控件(树)、Rich-Edit 控件(多效率文本框)、Tab 控件(分页)、Process
控件(进程条)等。

  1. Windows Shell

Windows 桌面浏览器(explorer.exe)的功用强大,Windows Shell
应用程序能够接纳WindowsShell
桌面包车型地铁程序接口达到管理连串、定制图标和默许程序、扩充桌面成效等目标。

  1. 实例 贰-三 窗口成立以及消息处理 basic.c

    / **《精通 Windows API》

    • 演示代码
    • window.cpp
    • 二.二 Windows API 的功力分类
      **/
      / 预处理 /
      / 头文件 /
      #include
      / 全局变量 /
      HINSTANCE hinst;
      / 函数扬言 /
      int WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int);
      LRESULT CALLBACK MainWndProc(HWND, UINT, WPARAM, LPARAM);
      /* **
    • 效益 展现贰个窗口
      **/
      int WINAPI WinMain(HINSTANCE hinstance,
      HINSTANCE hPrevInstance,
      LPSTLacrosse lpCmdLine,
      int nCmdShow)
      {
      WNDCLASSEX wcx; // 窗口类
      HWND hwnd; // 窗口句柄
      MSG msg; // 音讯BOOL fGotMessage; // 是或不是中标获得信息hinst = hinstance; // 应用程序实例句柄,保存为全局变量
      // 填充窗口类的数据结构
      wcx.cbSize = sizeof(wcx); // 结构体的大小
      wcx.style = CS_HREDRAW |
      CS_VREDRAW; // 样式:大小改变时重绘界面
      wcx.lpfnWndProc = MainWndProc; // 窗口音信处理函数
      wcx.cbClsExtra = 0; // 不接纳类内部存款和储蓄器wcx.cbWndExtra = 0; // 不行使窗口内部存款和储蓄器
      wcx.hInstance = hinstance; // 所属的应用程序实例句柄
      wcx.hIcon = LoadIcon(NULL,
      IDI_APPLICATION); // 图标:默认
      wcx.hCursor = LoadCursor(NULL,
      IDC_ARROW); // 光标:默认
      wcx.hbrBackground = (HBRUSH)GetStockObject(
      WHITE_BRUSH); // 背景:蓝色wcx.lpszMenuName = NULL; // 菜单:不使用
      wcx.lpszClassName = “MainWClass”; // 窗口类名
      wcx.hIconSm = (HICON)LoadImage(hinstance, // 小图标
      MAKEINTRESOUTiggoCE(五),
      IMAGE_ICON,
      GetSystemMetrics(SM_CXSMICON),
      GetSystemMetrics(SM_CYSMICON),
      LR_DEFAULTCOLOPRADO);
      // 注册窗口类
      if(!RegisterClassEx(&wcx))
      {
      return 1;
      }
      // 创设窗口
      hwnd = CreateWindow(
      “MainWClass”, // 窗口名
      “CH 二-三”, // 窗口标题WS_OVE昂CoraLAPPEDWINDOW, // 窗口样式
      CW_USEDEFAULT, // 水平地点 X:默认CW_USEDEFAULT, // 垂直地点 Y:暗许
      CW_USEDEFAULT, // 宽度:默认
      CW_USEDEFAULT, // 中度:暗中认可(HWND) NULL, // 父窗口:无
      (HMENU) NULL, // 菜单:使用窗口类的菜系
      hinstance, // 应用程序实例句柄
      (LPVOID) NULL); // 窗口创建时数据:无
      if (!hwnd)
      {
      return 一;
      }
      // 展现窗口
      ShowWindow(hwnd, nCmdShow);
      UpdateWindow(hwnd);
      // 消息循环
      while (
      (fGotMessage = GetMessage(&msg, (HWND) NULL, 0, 0)) != 0
      && fGotMessage != -1)
      {
      TranslateMessage(&msg);
      DispatchMessage(&msg);
      }
      return msg.wParam;
      }
      /* **
    • MainWndProc
    • 功用 窗口消息处理函数,
      对具有的信息都施用私下认可处理函数
      **/
      LRESULT CALLBACK MainWndProc(HWND hwnd,
      UINT uMsg,
      WPARAM wParam,
      LPARAM lParam
      )
      {
      switch (uMsg)
      {
      case WM_DESTROY:
      ExitThread(0);
      return 0;
      default:
      return DefWindowProc(hwnd, uMsg, wParam, lParam);
      }
      }

 

实例中,首先注册了窗口类,然后成立了3个窗口,创设窗口时钦定的窗口的天性和窗口新闻的处理函数。函数音信的处理函数大多调用系统暗中同意函数来拍卖。如下:

D:\002>cl window.cpp user32.lib gdi32.lib
用于 80x86 的 Microsoft (R) 32 位 C/C++ 优化编译器 15.00.21022.08 版
版权所有(C) Microsoft Corporation。保留所有权利。
window.cpp
Microsoft (R) Incremental Linker Version 9.00.21022.08
Copyright (C) Microsoft Corporation. All rights reserved.
/out:window.exe
window.obj 
user32.lib
gdi32.lib

 

运作效果:

 图片 3

}else{

贰.二.肆    图像和多媒体

Windows 的图像引擎和多媒体编制程序有各样接口,包蕴最中央的
GDI、GDI+,以及越来越高级的OpenGL、DirectX 等图像引擎编制程序接口。DirectX 和
OpenGL
在游玩开发、动画制作等方面利用相比常见,使用它们实行应用程序开发必要越发的
SDK。本书只讲解 GDI,对壹般的应用程序开发,已经丰富使用。

GDI
的基本概念包蕴图像(Image)、位图(Bitmaps)、笔(Pen)、画刷(Brush)、文本和字体(
Text and
Fonts)、线(Line)、区域(Regions)、形状(Shapes)等。其主旨的功力是对呈现设备开始展览控制、获取和修改相关布署,在计算机显示器上显得用户所急需出示的内容。

MessageBox(NULL, TEXT(“你点击了“撤废”按钮”), TEXT, MB_OK);

2.2.5    网络

用户使用 Windows API 能够支付基于各样互连网协议的应用程序,例如 TCP\UDP
Socket、HTTP、DHCP、奥迪Q五PC、QOS、蓝牙5.0,以及写真、点对点文件传输、即插即用设备管理等。
仍是能够举办互连网管理,包括网络的着力新闻,使用 IP helper
获取网络布署和网络新闻、进行网络监视等。
同时微软还提供了拓展网络安全编制程序的片段接口,主若是防火墙 Windows、防火墙
API,以及部分 Windows 自带的互联网应用程序的接口,包含 IE、Outlook 等。

}

二.二.六    别的职能

Windows API
能实现的职能还有许多,限于篇幅无法1切介绍。有一些内容本书未涉及,但是Windows API 也提供了相关接口。

  1. 数码存款和储蓄和做客、数据库

蕴涵微软的“动态数据存取组件”技术(MDAC,包括了 ADO、ODBC)、OLE
数据库、XML 标准、微软 XML、可增添存在引擎等多地点内容。重要是 Windows
系统内的数据库文件、Windows.系统对数据库的拜访接口等技巧。

二.音讯与同盟

新闻与搭档大多是 Windows
系统自带的有些应用程序所提供的花费接口。个中最要害的剧情是“同盟数据对象”(
CDO)。CDO 包蕴了好种种 Windows 数据传输典型应用,包涵 Mssager
(MSN)、邮件 SMTP (Outlook)应用接口等。

3.Web 开发

IIS(Intemet Information
Server,网络音讯服务)等应用程序提供的开发接口,使用户能够直接在
Windows 平台上开始展览 Web 开发,开发的程序运营于 ns
框架下。“数据存在与走访”、“音信与同盟”、“Web 开发”等都得以归为 COM
开发的限制内。COM 是 Windows
应用程序接口的一种,具有一定的接口格局,大多是 Windows
系统中自带的应用程序所提供的开支接口的集结。

return 0;

2.3    Windows API核心DLL

在 Windows 的系统目录中,存在着累累的动态链接库文件(DLL 文件)。这一个 DLL
文件中 蕴含了 Windows API 函数可执行程序。DLL
将各函数“导出”,那样应用程序就足以找到 DLL中的函数地址,当应用程序调用
Windows API 时,程序会运转到 DLL 中。API
函数根本设有于多少个为主的动态连接库文件中。Keme13二.dll 是最要害的
DLL,Windows 系统最重大的种类服务 API 函数都留存于 Kerne132.dll
中。User3二.dll 首要不外乎图形用户界面中所使用到的壹部分函数接口。 GDI3二.dll
中,主要包涵 Windows 图形引擎中的接口函数。

当用户调用1个 API 时,系统会通进程序文件中的导入表结构找到须要调用的
API 函数位于哪个 DLL,显明函数的地方,以便应用程序能够成功调用 API
函数。

}

2.3.1    Kerne132.dll

Keme13贰.dll 包涵了系统中央服务中最大旨的 API
函数,如文件系统、进度与线程、内部存款和储蓄器管理等。 Windows XPSP二系统中,Keme132.d11 有 950个导出函数,例如,CreateFileA、CreateProcessA、OpenThread、SetFileTime
等。本书将在继续章节中通超过实际例介绍这么些 API的应用。

运作结果:

2.3.2    User32.dll

User32.dll 是 Windows
图形用户界面包车型客车重点支撑。一些关键的图形用户界面函数由User3贰.dll
函数导出。Windows XP SP二 系统中,User32.dll 有 7三1一个导出函数,例如CreateWindowExW、RegisterClassA 等。

图片 4

2.3.3    Gdi32.dll

Gd132.dll 是 Windows GDI 应用程序设计接口,Gdi3二.dll
导出了与此相关的好多函数,如 GetTextColor、LineTo、TextOutA 等。

点击“分明”或“撤废”按钮,又会弹出多少个新的提醒框。大家能够亲自运转一下,会有真正的经验。

2.3.4    标准C函数

规范 C 程序是一种标准,任何援助 C 语言应用程序开发的系统都应当提供 C
语言库函数的 调用。在系统环境下选择正规 C
举办程序支付时,用户所利用的库函数实际上是由操作系统提供的。就是出于种种主流操作系统都提供了一套标准
C 库所定义的函数接口,标准 C
函数库才会有那般普遍的超越操作系统平台。所以 C
程序照旧凭借于操作系统开发人士为其促成接口,而 C
库函数的贯彻依旧借助于操作系统提供的调用接口,如正式 C 函数 fopen
函数在Windows 系统中的完结就凭借于 API CreateFile 函数(CreateFile
完结了文件的创导和开辟等操作)。

Windows 系统的 C 标准库函数接口首要存在于crtdll.dll 中。实际上,C
标准函数库必须由操作系统为其提供接口,不然使用标准 C
开发的次序不也许在特定的系统上运行。 Windows XP SP二 系统中,crtdll.dll 有
526 个导出函数,如 fopen、printf. strlen等。

本来未有main()函数,未有#include 的C语言程序也是足以运作的!

2.3.5    其他Dll

理所当然,Windows 系统中的 DLL 文件远远不止那多少个,Windows
系统提供了非凡丰盛而且功效强大的 API,上文已经介绍了 Windows API
所首要正视的多少个 DLL,其余的 DLL
库文件由于过于庞杂,就不壹一介绍,将在持续的章节中存有涉及。读者只必要了然调用
Windows API 的基本原理就能够了。

MessageBox()
函数是很多API中的3个,用于弹出3个钦点风格的对话框,其原型为:

二.4    Unicode和多字节

Windows 既能够动用 Unicode
字符集又能够动用守旧的字符集(如多字节编码)来兑现对各种语言的支撑,以适应国际市镇的必要。与价值观的字符集编码相比较,Unicode
是社会风气通用的字符编码标准,使用 1陆 位数据表示三个字符,壹共可以代表 6553多种字符,能够包涵现代总括机中所使用的拥有字符,包括各类字母、文字、在出版业中行使的特殊符号等。
古板的字符集,如 Windows ASNI 字符集,使用 八 位数据或将紧邻的多少个 6位的多寡整合在共同表示卓殊的语言字符。Windows 系统采用了 ASNI
字符的恢宏情势,假若叁个字节是负数,则将其继承的3个字节组合在1起表示二个字符。那种编码情势的字符集也叫做“多字节”字符集。

在 Windows 系统中,Unicode 字符编码和多字节字符编码都足以利用。

  1. 实例 二-四 Unicode 与多字节编码演示

    / **《精通 Windows API》

    • 示范代码
    • StringCode.c
    • 贰.④ Unicode 和多字节
      **/
      / 预处理 /
      / 头文件 /
      #include
      /* **
    • 效益 Unicode 与多字节编码演示
      **/
      int WINAPI WinMain(
      HINSTANCE hInstance,
      HINSTANCE hPrevInstance,
      LPST途达 lpCmdLine,
      int nCmdShow
      )
      {
      //定义 LPWSTOdyssey 类型的宽字符串
      LPWST汉兰达 szUnicode = L”This is a Unicode String;”;
      //定义 LPSTPAJERO 类型的窄字符串
      LPSTTucson szMutliByte = “This is not a Unicode String;”;
      //定义 LPTSTPAJERO 类型的自适就字符串
      LPTSTHummerH二 szString = TEXT(“This string is Unicode or not depends on the option.”);
      //使用 W 版本的 API 函数,以宽字符串为参数。
      MessageBoxW(NULL,szUnicode,L”<字符编码 一>“,MB_OK);
      //使用 A 版本的 API 函数,以窄字符串为参数。
      Message博克斯A(NULL,szMutliByte,”<字符编码 二>“,MB_OK);
      //使用自适用的 API 函数,选取相适应的字符串类型为参数。
      MessageBox(NULL,szString,TEXT(“<字符编码 三>“),MB_OK);
      return 0;
      }

 

在本实例中,一共动用了 3种档次的字符串变量,每系列型的字符串变量的开始化是见仁见智的,如表 二.二所示。

表贰.2 字符串与开首化

类型

变量类型

初始化形式

Unicode

LPWSTR

L”string”

多字节

LPSTR

”string”

根据开发环境的设置自动适应

LPTSTR

TEXT(”string”)

本实例首先采用“多字节”方式举办编写翻译。能够使用二进制编辑器来查看编写翻译获得的可执行文件,上例中定义的字符串分别存款和储蓄为以下形式。使用2进制编辑器查看,能够从
exe可执行文件中找到如下新闻。读者能够相比 ASCII 编码表查看。

“This is a Unicode String;”使用 Unicode 格局的十6进制编码:

54 00 68 00 69 00 73 00 20 00 69 00 73 00 20 00 61 00 20 00 55 00 6e 00 69 00 63 00 6f 00 64 00 65 00 20 00 53 00 74 00 72 00 69 00 6e 00 67 00 3b 00

 

 图片 5

“This is not a Unicode String;”使用 ASCII 格局的十陆进制编码:

54 68 69 73 20 69 73 20 61 20 55 6e 69 63 6f 64 65 20 53 74 72 69 6e 67 3b

 

 图片 6

“This string is Unicode or not depends on the option.”的ASCII
格局的十陆进制编码:

54 68 69 73 20 73 74 72 69 6e 67 20 69 73 20 55 6e 69 63 6f 64 65 20 6f 72 20 6e 6f 74 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 6f 70 74 69 6f 6e 2e

 

随后是“<字符编码 一>”和 Unicode 编码、“<字符编码
2>”和“<字符编码
3>”的多字节编码。对汉字字符,二种编码的法门是例外的,如“字符编码”七个字,二种编码分别为:

Unicode编码

57 5b 26 7b 16 7f 01 78

 

 图片 7

和多字节ASCII

d7 d6 b7 fb b1 e0 c2 eb

 

 图片 8

读者能够分析设置使用 Unicode
字符集后编写翻译实现的可执行文件与安装为多字节字符集后编写翻译得到的可执行文件有啥样差异。

 

  1. 在工程安顿中甄选编码格局

设置的艺术是在Visual
Studio工程属性中挑选“配置属性”→“常规”→“字符集”选项中展开精选。

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

2.4.1    W版本和A版本的API

Windows 接济 Unicode 和 ASCII 编码的字符。Windows 系统 API
凡是以字符串作为参数的举不胜举拥有 W 和 A
多个本子以贯彻三种差异编码的字符处理。

上边以 MessageBox 为例介绍二种不一样版本 API 函数的选拔。在 User3贰.dll
中程导弹出的函数实际上未有 MessageBox,唯有 MessageBoxA 和
MessageBoxW,那两边是同3个 API,实现了平等的功效。分歧的是,MessageBoxA
以多字节字符串作为参数输入,MessateBoxW 以Unicode 字符串作为参数输入。

能够从 User32.dll 的导出函数看到八个分歧版本的 API 函数。在 Platform SDK
中,MessageBox 函数扬言所在的头文件中发现如下概念(以下代码来自于
Microsoft Platform SDK):

WINUSERAPI
int
WINAPI
MessageBoxA(
__in_opt HWND hWnd,
__in_opt LPCSTR lpText,
__in_opt LPCSTR lpCaption,
__in UINT uType);
WINUSERAPI
int
WINAPI
MessageBoxW(
__in_opt HWND hWnd,
__in_opt LPCWSTR lpText,
__in_opt LPCWSTR lpCaption,
__in UINT uType);
#ifdef UNICODE
#define MessageBox MessageBoxW
#else 
#define MessageBox MessageBoxA
#endif // !UNICODE

 

能够看看,在先后开展编写翻译和接二连三时,假若程序在 UNICODE 环境下,会使用
MessageBoxW,不然使用 MessageBoxA。

软件开发人士能够自行设定使用 Unicode
编码或都多字节编码文件,不影响程序的不奇怪化职能。

但要是在编写程序时,使用的字符集与代码中选用的函数不等同、定义的字符串变量不相配,将会挑起编写翻译错误或然运转程序显示乱码,甚至恐怕引起程序运维错误,那点索要引起注意。

WINAPI 为宏定义

2.4.2    Unicode与ASGII的转换

Windows 专门提供了若干个 API
来完毕对字符编码的变换工作。ideCharToMultiByte、MultiByteToWideChar、UnicodeToBytes
函数能够成功这一个工作。

WideCharToMultiByte 函数将 Unicode 字符串转换为多字节字符串,以适应 A
版本的API,MultiByteToWideChar 函数将多字节字符串转换为了 Unicode
字符串,以适应 W 版本的 API 的参数方式须要。

#define WINAPI
__stdcall,表示函数调用情势,临时能够不理睬,不影响代码编写,只需求通晓MessageBox()重回值为
int,表示按下的按钮。

二.四.3    对Windows程序设计规范的建议

各样程序员都有温馨的规范化编制程序习惯。代码的正经不是本书的第三,所以那里只交付1些微软平日接纳代码规范,MSDN
的演示中,SDK 的头文件和例子中大致都是利用的那种方法。

变量名:平常使用所谓的“匈牙利(Magyarország)命名法”,变量名由“类型缩写(小写)”+“变量描述(单词首字母大写)”构成,如字符串类型的变量能够命名称为szFileName,DWO奥迪Q5D 类型的多少能够命名称为 dwFileSize,指针类型能够命名称叫lpBuffer,句柄类型的变量能够命名字为 hLogFile 等。

函数名:各单词的首字母大写,如 EnumerateFilesInDrectory、ShowFileSize
等。

种类名:全大写,各单词以下划线分隔,如 WIN3二_FILE_
ATTRIBUTE_DATA、DWORD、 HANDLE 等。

常量:同类型名的命名情势。

宏:多与体系名命名格局相同,有的也与函数名命超方式相同。
大括号与代码段:一般大括号独立占1行,大括号内的代码段缩进。假如代码段仅一行(如
if-else 后的说话),也提议选取大括号。

在调用或概念函数时,就算函数太长,能够分行写,将每种参数写壹行。1般多于
三个参数的函数要求分行写,以美貌和福利阅读为准绳。

在本书的以身作则中,都将尽心利用那么些规范化的点子。

 

参数表明

2.5    小结

PDF下载:

摘自:《理解Windows.API-函数、接口、编制程序实例》 人民邮政和邮电通讯出版社

范文庆、周彬彬、安靖创作

 

hWnd:该新闻框的父窗口句柄,假如此参数为NULL,则该新闻框未有兼具父窗口。大家不用急于领悟那一个参数,后续会详细讲解。

lpText:音讯框的内容。LPCTSTBMWX伍 是自定义数据类型,等价于 const char *。

lpCaption:消息框的标题。

uType:对话框的按钮样式和图标。

uType 帮助的按钮样式:

图片 9

这几个按钮都以宏定义

#define MB_OK 0x00000000L

#define MB_OKCANCEL 0x00000001L

#define MB_ABORTRETRYIGNORE 0x00000002L

#define MB_YESNOCANCEL 0x00000003L

#define MB_YESNO 0x00000004L

#define MB_RETRYCANCEL 0x00000005L

你也足以品尝用数字来代表按钮,例如:

MessageBox(NULL, TEXT(“你好,欢迎源世界你!”), TEXT, 一);

也会变卦与地方一样的对话框。

除去按钮,uType 还帮助图标(图标对用户有提示功效):

图片 10

这一个图标也都以宏定义:

#define MB_ICONHAND 0x00000010L

#define MB_ICONQUESTION 0x00000020L

#define MB_ICONEXCLAMATION 0x00000030L

#define MB_ICONASTERISK 0x00000040L

假如指望同时定义按钮和图标的体制,能够使用或运算|,例如:

MessageBox(

NULL,

TEXT,

TEXT,

MB_OKCANCEL | MB_ICONINFORMATION

);

把上边的MessageBox换来那些就ok了。运转结果

与地点的对话框相比较,多出了2个图标,同时还是能够听见提示音。是或不是多了八个提示标志在文字的先头啊。

再看来一下MessageBox() 的重回值。

MessageBox()
重回被按下的按钮,以数字代表,这么些数字都被定义成了宏,如下所示:

图片 11

对应的宏定义为:

#define IDOK 1

#define IDCANCEL 2

#define IDABORT 3

#define IDRETRY 4

#define IDIGNORE 5

#define IDYES 6

#define IDNO 7

图片 12

小编推荐七个学C语言/C++的读书裙【 七三零,1叁零,2二一】,无论你是大牌照旧小白,是想转行依然想入行都足以来询问壹起前行一起读书!裙内有开发工具,很多干货和技术资料分享!

总结:

对此刚刚学完C语言的,学windows编制程序的,那些都以满满的干货,一定要记住喔。从您学windows编制程序初始,你就早已告别了可耻的windows
do界面,只要一步一步走,写三个不错的window程序不在话下。那么些都以然后学习总得控制的,先收藏吧!

这些是C/C++能做的

服务器开发工程师、人工智能、云总括工程师、音讯安全、大数据
、数据平台、嵌入式工程师、流媒体服务器、数据控解、图像处理、音频录制开发工程师、游戏服务器、分布式系统、游戏协理等

图片 13图片 14图片 15

Post Author: admin

发表评论

电子邮件地址不会被公开。 必填项已用*标注