对窗口创建的详细解释

比眉伴天荒 2022-08-20 07:23 252阅读 0赞

对窗口创建的详细解释

============

  在昨天的学习中, 我们已经初步完成了一个窗口的创建, 虽然我们对于代码中的许多语句可能还不理解, 但这暂时并不会影响到我们的学习。再次来回顾昨天那个窗口的代码部分:

ContractedBlock.gif Create myWindow -

·调用了哪些Windows API

  通过这段代码, 我们完成了在客户区(窗口的白色区域)中心显示一段字符串, 此外, 我们还处理了系统发来的部分消息, 在这个过程中我们使用了Windows的诸多函数, 这些函数分别为:












































































函数名 函数描述

GetStockObject

获取一个图形对象

LoadIcon

为程序加载图标

LoadCursor

为程序加载光标

RegisterClass

为程序窗口注册一个窗口类

MessageBox

显示消息对话框

CreateWindow

创建一个窗口

ShowWindow

在屏幕上将窗口显示出来

UpdateWindow

重绘窗口客户区

GetMessage

从消息队列获取消息

TranslateMessage

将虚拟键消息转换为字符消息

DispatchMessage

将消息发送给消息处理函数

BeginPaint

准备对窗口进行绘图

GetClientRect

获取窗口客户区尺寸

DrawText

绘制一个文本字符串

EndPaint

结束对窗口的绘图

PostQuitMessage

向消息队列插入”退出”消息 

DefWindowProc

执行系统默认的消息处理 

对于这些函数的详细说明, 可以到百科查询, 或者到MSDN Library文档中查询(推荐)。

·大写标识符说明

  在上面的程序中出现了许多类似于XX_XXXX的大写标识符, 如:

























CS_HREDRAW

CS_VREDRAW

IDI_APPLICATION

IDC_ARROW

MB_OK

MB_ICONERROR

WS_OVERLAPPEDWINDOW

CW_USEDEFAULT

DT_SINGLELINE

DT_CENTER

DT_VCENTER

WM_CREATE

WM_PAINT

WM_LBUTTONDOWN

WM_DESTROY

这些标识符均为数值常量, 在WINUSER.H头文件中有定义, 该程序中用到的一些标识符前缀含义为:








































前缀

含义

CS

类风格选项

CW

创建窗口选项

DT

文本绘制选项

IDI

图标的ID

IDC

光标的ID

MB

消息框选项

WM

窗口消息

WS

窗口风格

对于这些大写标识符暂时没必要强记下来, 只需要对其有个大致的印象即可, 不会影响到我们的学习。

·”新”数据类型

  在调用的函数中, 一些函数的参数类型是我们以往在C控制台编程中所没有见到过的, 例如在代码的第三行对回调函数的声明中:

  1. LRESULT CALLBACK WndProc( HWND, UINT, WPARAM, LPARAM ) ; //声明用来处理消息的函数

其中的”LRESULT”、”UINT”、”WPARAM”、”LPWARAM”, 以及主函数WinMain中的”PSTR”之类的类型都是我们所没有见过的, 这些”新”数据类型都是什么呢?

其实这些”新”数据类型是为了程序书写时的简便而使用typedef或#define对C已有的数据类型重新定义的, 在WINDEF.H/WINNT.H头文件中有定义, 如:

复制代码

  1. typedef unsigned int UINT;
  2. typedef char CHAR;
  3. typedef CHAR *LPSTR, *PSTR;
  4. typedef UINT WPARAM;
  5. typedef long LONG;
  6. typedef LONG LPARAM;
  7. typedef LONG LRESULT;

复制代码

可以看出, UINT实际上就是unsigned int型; PSTR就是一个char *型, WPARAM被定义为UINT型, 也就是unsigned int型; LPARAM和LRESULT被定义为long型;

由此观之, “新”数据类型, 并不新。

在声明消息处理函数WndProc时, 在函数名前面我们还是使用了一个”CALLBACK”标识符, 这个标识符其实就是函数的调用规则, 在WINDEF.H中有定义:

  1. #define CALLBACK __stdcall

在前些天的学习中, 我们还知道在WinMain主函数的前面有个WINAPI调用规则, 在WINDEF.H中也被定义为 __stdcall。

·结构类型

  结构体, 在C语言的学习中我们已经对这种数据类型十分熟悉了, 在上述创建窗口的过程中我们使用了四种结构类型来创建结构体的对象, 这些结构体在WINUSER.H/WINDEF.H中有定义, 现在我们只需对其进行一下印象中的认识, 对于结构体的成员暂时不去讨论, 这四种结构体分别为:

1>. MSG消息结构

MSG在WINUSER.H中的定义:

复制代码

  1. typedef struct tagMSG {
  2. HWND hwnd;
  3. UINT message;
  4. WPARAM wParam;
  5. LPARAM lParam;
  6. DWORD time;
  7. POINT pt;
  8. #ifdef _MAC
  9. DWORD lPrivate;
  10. #endif
  11. } MSG, *PMSG, NEAR *NPMSG, FAR *LPMSG;

复制代码

2>. WNDCLASS窗口类结构

WNDCLASS在WINUSER.H中的定义:

复制代码

  1. typedef struct tagWNDCLASSW {
  2. UINT style;
  3. WNDPROC lpfnWndProc;
  4. int cbClsExtra;
  5. int cbWndExtra;
  6. HINSTANCE hInstance;
  7. HICON hIcon;
  8. HCURSOR hCursor;
  9. HBRUSH hbrBackground;
  10. LPCWSTR lpszMenuName;
  11. LPCWSTR lpszClassName;
  12. } WNDCLASSW, *PWNDCLASSW, NEAR *NPWNDCLASSW, FAR *LPWNDCLASSW;
  13. #ifdef UNICODE
  14. typedef WNDCLASSW WNDCLASS;

复制代码

3>. PAINTSTRUCT绘制结构

PAINTSTRUCT在WINUSER.H中的定义:

复制代码

  1. typedef struct tagPAINTSTRUCT {
  2. HDC hdc;
  3. BOOL fErase;
  4. RECT rcPaint;
  5. BOOL fRestore;
  6. BOOL fIncUpdate;
  7. BYTE rgbReserved[32];
  8. } PAINTSTRUCT, *PPAINTSTRUCT, *NPPAINTSTRUCT, *LPPAINTSTRUCT;

复制代码

4>. RECT矩形结构

RECT在WINDEF.H中的定义:

复制代码

  1. typedef struct tagRECT
  2. {
  3. LONG left;
  4. LONG top;
  5. LONG right;
  6. LONG bottom;
  7. } RECT, *PRECT, NEAR *NPRECT, FAR *LPRECT;

复制代码

·再谈句柄

  不同类型的句柄有不同的标识符, 在我们尝试创建窗口的代码中用到的句柄有:
























标识符

含义

HINSTANCE

实例句柄指程序本身

HWND

窗口句柄

HDC

设备环境句柄

HBRUSH

图形画刷句柄

  句柄是一个标识符,用来来标识对象, 一个句柄使用四个字节长的整数来存储一个整数值, 这个具体的整数值实际上我们并不需要知道是多少, 我们要做的就是传递句柄, Windows会知道如果用过这个句柄找到并以引用相应的对象。

·匈牙利命名法

  匈牙利命名法是一种编程时的命名规范, 在一开始我们接触的MessageBox对话框时我们就已经见到了匈牙利命名的变量:

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

这里的 hInstance、hPrevInstance、szCmdLine、iCmdShow的命名都遵循匈牙利命名法, 匈牙利命名法的目的和作用是使变量名非常清晰易懂,增强了代码的可读性,方便各程序员之间相互交流代码, 减少代码中因数据类型不匹配的错误。

例如:

szCmdLine, 通过变量名我们就可以知道这是一个”以0结束的字符串”;

hInstance, 以h开头, 代表一个句柄;

iCmdShow, 以i开头, 代表一个int整形。

这样, 就可以不用再去找到变量声明的位置去看它的变量类型, 避免了在使用变量时由于数据类型不匹配引起的错误。

经常使用的匈牙利命名的前缀如下:
































































































































前缀

含义描述

p 指针
fn 函数
v  无效
h 句柄
l 长整形
b 布尔型
f 浮点型
dw 双字
sz 字符串
n 短整型
d 双精度浮点型
c 计数, 通常写为cnt
ch 字符, 通常写为c
i 整型
by 字节
w 字型
r 实型
u 无符号型
   
g 全局变量
c 常量
m 成员变量
s 静态变量
   
Max 最大
Min 最小
Init 初始化
T 或 Temp 临时变量
Src 源对象
Dest 目标对象

-—————————

发表评论

表情:
评论列表 (有 0 条评论,252人围观)

还没有评论,来说两句吧...

相关阅读

    相关 详细解释集合

    面试题:详细解释集合。接口、常用实现类、不同集合的关系关联、实现类的区别特性。可能的话,尽可能的关联其他技术;如:concurrent包、ThreadLocal、Redis底层

    相关 tar命令详细解释

    参数: \-c: 建立压缩档案 \-x:解压 \-t:查看内容 \-r:向压缩归档文件末尾追加文件 \-u:更新原压缩包中的文件 这五个是独立的命令,压缩