1、文章源自: C+ 入门精解二VC+常用技能术语的讲解 WINDOWS 运用程序设计用到的根本术语: 1.窗口 任何一个运用过 Windows 的人对窗口这个概念肯定不会生疏,窗口是 windows 运用程序的根本操作单元,用户经过它与运用程序发作交互,例如输入输出操作等等,从程序的内部作业本来来看,每一个窗口对应一个音讯处置行列,运用程序首要经过窗口音讯处置函数对用户的输入操作进行呼应与处置。要想从程序员的视点充沛知道窗口的意义,那么对WNDCLASS 这个数据布局进行充沛的知道是有必要的。2.实例 单个实例代表一个可履行程序在内存中的复制,若是一个运用程序履行许屡次,那么在内存中就有多少个复
2、制,也就能够阐明有多少个实例存在。3.句柄 句柄在 windows 环境下被界说成了一个无符号的整数,用于标识运用程序中不一样的目标和同类目标中的不一样实例。句柄能够看成是目标的编号,联络上面的实例,那么一个实例句柄就能够看作是单个运用程序在内存中复制的仅有身份编号,一般体系只能经过实例句柄去辨认不一样的运用程序,或许是一样运用程序的不一样副本。4.资源 Windows 运用程序包含许多资源,例如,菜单,图标,对话框等等,VC+ 环境下咱们不仅仅能够运用体系下原有的资源,咱们也能够界说自个的资源,这些资源被界说在.RC 文件中,经过运用程序最终的编译,这些资源文件和程序代码衔接在一起,构成一个
3、可履行的.EXE 文件或许是一个.DLL 的库文件。在运用这些资源的时分,经过 WIN API 函数学将这些资源调用运用。5.窗口音讯处置函数 窗口是人机交互的接口,当窗口承受到输入恳求的时分,就会把这一恳求交给某一个函数进行处置,而这个函数即是窗口音讯处置函数,它能够决定当一个音讯被承受到的时分采纳啥举动。音讯一般是由一系列的输入操作触发的,比方当我按下鼠标左键那么窗口音讯处置函数就会收到一个 WM_LBUTTONDOWN 的音讯信号。在窗口音讯处置函数中,咱们能够运用switch 和 case 布局进行操控, 针对此音讯作出咱们想要的操作。文章源自: 运用程序的任何输出操作都需求经过图形设
4、备接口(GDI)中的函数来完结操作,GDI 担任体系与用户或绘图程序之间的信息交流,并操控在输出设备上显现图形或许文字,它将程序员与具体的硬件设备隔脱离,让程序员不需求思考硬件设备操作的细节。7.回调函数 回调函数是 windows 操作体系自个调用的函数,用户是不能直接调用他们的。回调函数的界说有必要严厉的依照 windows 规范进行编写。在下面咱们即将看到的 HelloWin 程序中,WndProc 即是一个回调函数,它是是运用程序的窗口音讯处置函数,当注册窗口类的时分,要把窗口音讯处置函数的地址通知Windows,Windows 经过调用此函数进行音讯处置。 第三有些:HelloWin
5、 程序的具体剖析。 Windows 运用程序的根本运转机制与 HelloWin 程序具体解 总的来说最根本的 Windows 运用程序的运转履行次序总是以如下的根本次序履行的。次序布局: - 界说窗口类- 初始化窗口类- 窗口的实例化- 经过音讯循环获取音讯并将音讯发送给音讯处置函数做出相应的操作 由于 windows 运用程序运转的逻辑布局特别所以代码的具体解说笔者就不把程序于叙说分隔了了,这样有利于阅览与剖析。剖析代码如下: /程序作者:管宁 /站点:dev- /一切稿件均有版权,如要转发,请有必要注明出处和作者 #include #pragma comment(lib,“winmm.li
6、b“)/为了要播映声响,有必要导入这个库LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM);int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,PSTR szCmdLine, int iCmdShow)/*HINSTANCE 类型的意义为实例句柄。hInstance 现实上即是当时运用程序本身的标识代号,代号一般都是一个 32 位整数。hPrevInstance 与曩昔的 16 位运用程序有联系,表明指向前一个实例的句柄。文章源自: 类型的意义是指向以 0 完毕
7、的字符串指针。szCmdLine 前面的 sz 同样是表明指向以0 完毕的字符串指针,这个目标用于保管命令行。最终 iCmdShow 是一个整型数据,标记了程序开端的显现状况。为 SW_SHOWNORAML 的时分为一般巨细显现方法。为 SW_SHOWMAXIMIZED 的时分为最大化显现方法。为 SW_SHOWMINNOACTIVE 的时分程序将显现在任务栏上。*/static char szAppName = TEXT(“HelloWin“);/预先界说一个 c 个性字符串,稍后用于设置窗口类称号。WNDCLASS wndclass;/界说窗口类目标/*在这里不得不说一下的是,窗口类现实上
8、是 struct 布局体,内部有 10 个重量,他们是用来于初始化窗口类目标而用的。这个布局体在 winuser.h 头文件中界说,从方法上来说,分为 ASCII 版的WNDCLASSA 和 Unicode 版的 WNDCLASSW 两个。typedef struct tagWNDCLASSA UINT style;WNDPROC lpfnWndProc;int cbClsExtra;int cbWndExtra;HINSTANCE hInstance;HICON hIcon;HCURSOR hCursor;HBRUSH hbrBackground;LPCSTR lpszMenuName;LP
9、CSTR lpszClassName; WNDCLASSA, *PWNDCLASSA, NEAR *NPWNDCLASSA, FAR *LPWNDCLASSA;typedef struct tagWNDCLASSW UINT style;WNDPROC lpfnWndProc;int cbClsExtra;int cbWndExtra;HINSTANCE hInstance;HICON hIcon;HCURSOR hCursor;HBRUSH hbrBackground;LPCWSTR lpszMenuName;LPCWSTR lpszClassName; WNDCLASSW, *PWNDCL
10、ASSW, NEAR *NPWNDCLASSW, FAR *LPWNDCLASSW;*/- 窗口类目标初始化进程 - 文章源自: = CS_HREDRAW | CS_VREDRAW;/*设置窗口类目标的款式个性,CS_HREDRAW | CS_VREDRAW 这两个值是经过位运算的与运算结合起来的。表明了窗口在改动了水平缓笔直巨细的时分,窗口要逼迫改写。这些经过 define 界说的标识,能够在 WinUser.h 头文件中找到。#define CS_VREDRAW 0x0001#define CS_HREDRAW 0x0002#define CS_DBLCLKS 0x0008#define
11、CS_OWNDC 0x0020#define CS_CLASSDC 0x0040#define CS_PARENTDC 0x0080#define CS_NOCLOSE 0x0200#define CS_SAVEBITS 0x0800#define CS_BYTEALIGNCLIENT 0x1000#define CS_BYTEALIGNWINDOW 0x2000#define CS_GLOBALCLASS 0x4000#define CS_IME 0x00010000*/wndclass.lpfnWndProc = WndProc ;/指定窗口的处置函数为 WndProc,WndProc 将
12、处置 windows 音讯。wndclass.cbClsExtra = 0;/窗口类无拓展wndclass.cbWndExtra = 0;/窗口实例无拓展wndclass.hInstance = hInstance;/指定当时运用程序实例句柄 ,也即是程序当时的标识号。wndclass.hIcon = LoadIcon (NULL,IDI_APPLICATION);/*经过 LoadIcon 函数设置运用程序窗口标题的 icon 图标。HICON LoadIcon(HINSTANCE hInstance,LPCTSTR lpIconName);函数回来 HICON 类型的图标句柄。第一个参数表
13、明当时运用程序的窗口句柄,第二个参数表明图标。默许状况下,第一个参数为 NULL,第二个为 IDI_APPLICATION,表明运用体系默许供给的图标,能够在 WinUser.h 头文件中找到。#define IDI_APPLICATION 32512*/wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ;/*经过 LoadCursor 函数设置运用程序窗口光标款式。HCURSOR LoadCursor(HINSTANCE hInstance,LPCTSTR lpCursorName);函数回来 HCURSOR 类型的光标句柄。第一个参数表明当时运
14、用程序的窗口句柄,第二个参数表明光标。默许状况下,第一个参数为 NULL,第二个为 IDC_ARROW,表明运用体系默许供给的光标,能够在 WinUser.h 头文件中找到。#define IDC_ARROW MAKEINTRESOURCE(32512)文章源自: = (HBRUSH)GetStockObject (WHITE_BRUSH);/*经过 GetStockObject 函数设置运用程序窗口的布景色彩。HGDIOBJ GetStockObject(int fnObject);函数回来 HCURSOR 类型的 GDI 目标句柄,为了程序能够正确履行,有必要把HGDIOBJ 类型强迫转换
15、成 HBRUSH 画刷句柄。参数表明当时运用的画刷色彩。这些常量的界说能够在 WinGDI.h 头文件中找到。#define WHITE_BRUSH 0#define LTGRAY_BRUSH 1#define GRAY_BRUSH 2#define DKGRAY_BRUSH 3#define BLACK_BRUSH 4#define NULL_BRUSH 5#define HOLLOW_BRUSH NULL_BRUSH*/wndclass.lpszMenuName = NULL;wndclass.lpszClassName = szAppName;/窗口类目标的称号/-RegisterCla
16、ss (/*注册窗口类,参数为窗口类目标的指针。函数原形为:ATOM RegisterClass(CONST WNDCLASS *lpWndClass);*/- 实例化进程 -HWND hwnd ; /创立用于保管窗口句柄的目标,窗口句柄是体系辨认不一样窗口的依据,它仅仅个代号。hwnd = CreateWindow(szAppName, / 窗口类称号“你好国际“, / 窗口标题WS_OVERLAPPEDWINDOW, / 窗口款式CW_USEDEFAULT, / 初始的窗口 x 轴方位CW_USEDEFAULT, / 初始的窗口 y 轴方位CW_USEDEFAULT, / 初始的窗口 x
17、轴巨细CW_USEDEFAULT, / 初始的窗口 y 轴巨细NULL, / 父窗口句柄NULL, / 窗口功用表句柄hInstance, / 运用程序实例句柄NULL / 树立参数,这个参数能够存取后边程序中能够引用到的材料。);/*文章源自: CreateWindow 创立窗口的时分能够设置更多的细节,比方窗口标题这些。函数原形如下:HWND CreateWindow( LPCTSTR lpClassName,LPCTSTR lpWindowName,DWORD dwStyle,int x,int y,int nWidth,int nHeight,HWND hWndParent,HMENU
18、 hMenu,HINSTANCE hInstance,LPVOID lpParam);一旦窗口创立成功,那么 CreateWindow 将回来窗口句柄,也即是窗口代号,值保管在窗口句柄目标 hwnd 中。*/ShowWindow(hwnd, iCmdShow);/*在履行过 CreateWindow 函数后,在体系的内部窗口现已创立成功了。但为了要把窗口显现在桌面上,咱们还有必要调用 ShowWindow 函数。其函数原形如下:BOOL ShowWindow(WND hWnd,int iCmdShow);参数 1 是需求显现的窗口句柄,第二个则是传递给 WinMain 的 iCmdShow,用
19、来断定最开端窗口的显现方法。在这里窗口的显现方法,首要是指最大化,最小化这些。*/UpdateWindow (hwnd);/*UpdateWindow 这个函数的作用是用于重绘显现区域。由于若是 ShowWindow 函数的 iCmdShow 从 WinMain 取得的参数是 SWSHOWNORMAL,那么窗口的显现区域就会被布景画刷掩盖,调用 UpdateWindow 函数会经过发送给窗口音讯处置函数 WndProc 一个WM_PAINT 音讯,经过这个音讯完结重绘显现区域的作业。*/-/- 音讯循环 -/*当调用过 UpdateWindow 函数后,窗口现已显现在了桌面屏幕上,接下来要做的
20、作业是处置音讯。windows 运用程序能够承受各种音讯包含键盘,鼠标,等等。文章源自: 是经过监督各种输入设备,把发作的事情转化为音讯的,并将音讯保管在音讯行列中。最终当时的运用程序从自个的音讯行列中按次序检索音讯,并把每一个音讯发送到所对应的窗口音讯处置函数总去,这里是指 WndProc。*/MSG msg ;/树立音讯目标。/*MSG 是个布局体类型,在 WinUser.h 头文件中能够找到。typedef struct tagMSGHWND hwnd;/窗口句柄UINT message;/音讯辨认字,在 WinUser.h 头文件中能够找到,以 WM最初,这里就不悉数举出来了。WPAR
21、AM wParam;/32 位的音讯参数,其意义和值依据音讯的不一样而不一样。LPARAM lParam;/32 位的音讯参数,其值和音讯无关。DWORD time;/音讯进入音讯行列的时刻。POINT pt;/音讯进入音讯行列时分的鼠标坐标。#ifdef _MACDWORD lPrivate;#endif MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG;其间 POINT 也是个布局体类型,在 WinDef.h 头文件中能够找到typedef struct tagPOINTLONG x;LONG y; POINT, *PPOINT, NEAR *NPPOINT, FAR
22、 *LPPOINT;*/while (GetMessage (参数一是一个指向 msg 目标的指针,剩下的参数为 NULL 或 0 表明程序承受它自个树立的一切窗口的音讯。windows 从音讯行列取出的下一个音讯将填充 MSG 布局中的各成员重量。*/TranslateMessage (/把虚拟键盘音讯转换到字符音讯,满意键盘输入的需求,参数为 msg 音讯目标的指针。DispatchMessage (/*文章源自: DispatchMessage 调用完毕后,循环再次重复,从头回到GetMessage 处,接着获取音讯。若是音讯循环接收到 WM_QUIT 音讯则跳出音讯循环。*/-retu
23、rn msg.wParam;/回来音讯布局中的 wParam 成员信息。/*MSG 布局的 wParam 成员的值是传递给 PostQuitMessage 函数参数,一般是 0。由于 PostQuitMessage 函数是在完毕音讯循环有必要调用的函数。体系其实是履行了 return 0;完毕了 WinMain 函数退出了程序,很想操控台运用程序 main 完毕的时分的 return 0;,所以直接写 return 0;也不会致使程序过错。*/LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lPa
24、ram)/窗口音讯处置函数/*函数回来类型为 LRESULT,是一个长整数,润饰 CALLBACK 表明此函数为回调函数,函数的回来类型,和参数次序都有必要依照体系的规则设置。参数一为窗口句柄,第二个参数是无符号整型数据,用于标识承受的音讯,最终两个参数为 32 位的音讯参数,供给了更多关于音讯的信息。WPARAM 和 LPARAM 都表明的是长整数,该函数的四个参数与 MSG 布局的前四个成员一样。音讯处置函数,一般是 windows 自个调用的,当然程序作者也能够经过调用SendMessage 函数直接呼叫自个的窗口音讯处置函数,仅仅在这里暂时不评论。*/HDC hdc;/创立设备描述句柄
25、目标PAINTSTRUCT ps;/创立制作布局目标/*PAINTSTRUCT 布局包含了一些窗口音讯处置程序,能够用来更新窗口显现区域中的信息。布局如下:typedef struct tagPAINTSTRUCT HDC hdc; BOOL fErase; RECT rcPaint; BOOL fRestore; BOOL fIncUpdate; BYTE rgbReserved32; PAINTSTRUCT, *PPAINTSTRUCT; */文章源自: rect;/创立矩形布局目标/*此布局的界说如下:typedef struct _RECT LONG left; LONG top; L
26、ONG right; LONG bottom; RECT, *PRECT; */switch (message)/经过 switch 和 case 布局来断定处置啥样的音讯,若是不想处置某些音讯则把音讯传递给 DefWindowProc 函数处置。case WM_CREATE:/当窗口创立的时分取得 WM_CREATE 音讯PlaySound (TEXT(“C:online.wav“),NULL,SND_FILENAME|SND_ASYNC);/播映声响return 0;/窗口音讯处置函数若是正在处置音讯有必要回来 0case WM_PAINT:/通知窗口更新显现区域的信息/*当窗口刚开端树立
27、的时分,整个显现区域都是无效的,由于程序还没有在窗口上制作任何东西。第一条 WM_PAINT 音讯一般发作在调用 UpdateWindows 函数的时分,通知窗口音讯处置函数在显现区域制作一些东西。现实受骗用户把 wndclass.style 设置成 CS_HREDRAW | CS_VREDRAW 后,一旦用户改动窗口巨细,就会把显现区域当作无效,这时分就会收到WM_PAINT 音讯。*/*一般在处置 WM_PAINT 音讯的时分,总是以 BeginPaint 最初和EndPaint 完毕的。*/hdc = BeginPaint (hwnd, /*调用 BeginPaint 函数能够传回设备句
28、柄,这里指的是显现器的代号和显现器的驱动程序。由于在窗口显现区域要显现文字或许图形都需求用到设备句柄。它的函数原形为:HDC BeginPaint(HWND hwnd, / handle to windowLPPAINTSTRUCT lpPaint / paint information);它实践的功用是:当发现窗口显现区域的布景还没有被铲除的时分,则由 windows 来删去它。咱们前面在 wndclass 布局中设置了画刷为白色,这么以来体系就用文章源自: (hwnd,/设置窗口显现区域的尺度,一起它也担任取得窗口改动后的窗口显现区域的尺度信息。DrawText (hdc,TEXT(“中国
29、软件开发实验室,http:/dev-“),-1,/制作文字在窗口显现区域中/*DT_SINGLELINE|DT_CENTER|DT_VCENTER 表明的是文字显现的方法,这些在 WinUser.h 头文件中界说。*/EndPaint (hwnd,/完毕指定窗口的绘图return 0;case WM_DESTROY:/当窗口毁掉的时分会回来此信息,比方 ALT+F4 或封闭窗口的时分,体系默许调用 DestroyWindow()函数吊销窗口。PostQuitMessage (0);/*处置 WM_DESTROY 音讯有必要调用 PostQuitMessage 函数,该函数向音讯行列中发送 WM_QUIT 音讯,让程序退出音讯循环。运用程序能够在呼应这个音讯的一起做一些其它完毕的作业。*/return 0;return DefWindowProc (hwnd, message, wParam, lParam);/处置不于处置的音讯