Chinaunix首页 | 论坛 | 博客
  • 博客访问: 231691
  • 博文数量: 68
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 612
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-04 22:38
文章分类

全部博文(68)

文章存档

2010年(2)

2009年(12)

2008年(54)

我的朋友

分类: C/C++

2008-10-14 09:47:13

程序中有很多大写的标识符。这些标识符都是在Windows的头文件中定义的。

CS_HREDRAW  DT_VCENTER  SND_FILENAME  CS_VREDRAW  IDC_ARROW  WM_CREATE
CW_USEDEFAULT  IDI_APPLICATION  WM_DESTROY  DT_CENTER  MB_ICONERROR 
WM_PAINT  DT_SINGLELINE SND_ASYNC  WS_OVERLAPPEDWINDOW

以上都是简单的数值常量。标识符的前缀表示该常量所属的类别。

CS --- 类风格选项
CW --- 创建窗口选项
DT --- 绘制文本选项
IDI---图标ID号
IDC---光标ID号
MB ---消息框选项
SND---声音选项
WM ---窗口消息
WS ---窗口风格

MSG -- 消息结构
WNDCLASS -- 窗口类结构
PAINTSTRUCT -- 绘图结构
RECT -- 矩形结构

最后还有三个大写标识符,用于不同类型的“句柄”。

HINSTANCE --实例(程序自身)句柄
HWND -- 窗口句柄
HDC -- 设备描述表句柄

句柄在Windows中使用非常频繁。也是非常重要的一个概念。我们还将遇到图标句柄HICON、鼠标指针句柄HCURSOR、图形刷句柄HBRUSH。到底什么是句柄呢?

句柄是一种新的数据类型。菜单,窗口,图标,内存,设备,程序,位图等都被称为“对象”。也就是说菜单是菜单对象,窗口是窗口对象,内存是内存对象。对于这样的称呼您一定要习惯。句柄可以代表一个对象。我们用句柄引用一个对象。例如我们可以用设备描述表句柄引用一个设备(比如显示器)。当我们用一个设备描述表句柄引用显示器时,这个句柄代表的就是显示器。我们通过这个句柄使用显示器。

■常用的句柄类型

HANDLE------------------通用句柄类型
HWND--------------------标识一个窗口对象
HDC---------------------标识一个设备对象
HMENU-------------------标识一个菜单对象
HICON-------------------标识一个图标对象
HCURSOR-----------------标识一个光标对象
HBRUSH------------------标识一个刷子对象
HPEN--------------------标识一个笔对象
HFONT-------------------标识一个字体对象
HINSTANCE---------------标识一个应用程序模块的一个实例
HLOCAL------------------标识一个局部内存对象
HGLOBAL-----------------标识一个全局内存对象

也就是说HWND代表的是一个窗口对象,HDC代表的是一个设备对象。这个设备有可能是内存,也有可能是磁盘。句柄是一个数,通常为32位数,以十六进制形式表示。您明白我在说什么吗?不明白?看完这本书后可能就明白了,请坚持下去吧。

进入程序后第一个碰到的是一组变量定义。

static TCHAR szAppName[] = TEXT ("HelloWin") ;
HWND         hwnd ;                //窗口句柄
MSG          msg ;                 //消息结构
WNDCLASS     wndclass ;            //窗口类结构

第二个变量是一个窗口句柄。它代表一个窗口。那么它代表的是哪个窗口呢?现在还没有赋值啊,所以它哪个窗口都没有代表。

当然,如果您高兴第二个变量也可以定义成:

HWND aaa;  //或者:
HWND bbb;

和int, float等标准数据类型一样,变量名可以随便起。下面的两个也是同样道理:

MSG addf;
WNDCLASS sdakd221;

首先要定义窗口类,也就是给窗口类结构赋值。窗口类只是定义窗口大概的样子。so,所有基于此窗口类创建的窗口对象都会有窗口类中给出的特点。下面我们一个一个地分析窗口类的每一个域。

wndclass.style = CS_HREDRAW | CS_VREDRAW;

上面的语句表示:每当窗口的水平方向尺寸(CS_HREDRAW)或者垂直方向尺寸(CS_VREDRAW)改变后,要完全刷新窗口(刷新就是在屏幕上重画。我们所看到的所有图形界面都是"画"出来的。)。无论如何改变Hellowin的窗口尺寸我们都可以看到文本串“Hello Windows98!”仍然显示在窗口的中央,这两个标识符确保了这一点。

wndclass.lpfnWndProc = WndProc;

这条语句将这个窗口类的窗口过程函数指定为WndProc()。以后凡是基于此窗口类创建的所有新窗口都会把WndProc()当作自己的窗口过程函数。这一条很重要哦,一定要记住!

wndclass.cbClsExtra = 0;

基于同一个窗口类创建的窗口对象的公共数据区大小。不太明白这是什么意思,我是菜鸟嘛。看字面上的意思好像是说所有基于此窗口类创建的窗口对象都会拥有一个公共的内存区。我的理解正确吗?有没有高手教我啊?

wndclass.cbWndExtra = 0;

当前窗口对象私有的数据区大小。

wndclass.hInstance = hInstance; //当前进程对象实例句柄

本程序的句柄。也就是代表HelloWin程序的句柄。如果让我细细讲来,可就难为我了。我还是个菜鸟啊!可能看完了整个书就会懂吧?这个是WinMain()的参数之一。

wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);

为所有基于此窗口类创建的窗口设置一个图标。想要加载自己画的图标时这个参数应该被设置为程序的实例句柄hInstance。如果想要获取预先定义的图标句柄我们可以把LoadIcon()的第一个参数设置为NULL。当第一个参数为NULL时,第二个参数有以下选项:

IDI_APPLICATION 默认的应用程序图标。您可以看看HelloWin的样子,那个方框就是了。
IDI_ASTERISK 星号
IDI_EXCLAMATION 惊叹号
IDI_HAND 手形图标
IDI_QUESTION 问号
IDI_WINLOGO Windows徽标

以上的标识符可以在WINUSER.H中找到。函数返回代表该图标对象的句柄。

wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);

LoadCursor()函数加载一个预先定义的光标,并返回该项光标的句柄。该项句柄被赋给WNDCLASS结构的hCursor域。当鼠标经过"基于此窗口类创建的窗口"时,它变成一个小箭头。不过因为之前的光标也是小箭头,所以我们看不出光标的变化。下面是预定义的鼠标指针标识符:

IDC_APPSTARTING 标准箭头及小沙漏
IDC_ARROW 标准箭头
IDC_CROSS 十字交叉
IDC_HAND (Windows2000)手形
IDC_HELP 箭头和问号
IDC_IBEAM 文本I形
IDC_ICON 空图标
IDC_NO 斜杠圈
IDC_SIZE 四向箭头
IDC_SIZEALL 四向箭头
IDC_SIZENESW 指向东北和西南的双向箭头
IDC_SIZENS 指向南北的双向箭头
IDC_SIZENWSE 指向西北和东南的双向箭头
IDC_SIZEWE 指向东西的双向箭头
IDC_UPARROW 垂直箭头
IDC_WAIT 沙漏

您可以把语句中的IDC_ARROW换成别的,然后再编译运行一次。当您把鼠标移到窗口上面时会看到不同的结果。试一试啊!!你可以先试一试IDC_CROSS。

wndclass.hCursor = LoadCursor(NULL, IDC_CROSS);

然后编译运行一次。把鼠标移到窗口对象上面,看看鼠标有什么变化?鼠标是不是变成十字形了?之前的LoadIcon()也是同样道理,您可以试着换一下第二个参数。看看有什么变化。

wndclass.hbrBackground = GetStockObject(WHITE_BRUSH);

设定基于此窗口类创建的窗口对象的背景颜色。hbr代表“handle to a brush(刷子句柄)”。刷子是图形学上的术语。指用来填充一个区域的着色像素模式。Windows有几个标准刷子,也称为备用(stock)刷子。上面所示的GetStockObject()调用将返回一个白色刷子的句柄。窗口客户区将完全为白色。这是一种及其普遍的做法。

wndclass.lpszMenuName = NULL;

指定窗口类菜单。HelloWin没有菜单,所以这项为NULL。

wndclass.lpszClassName = szAppName;

给这个窗口类取名字。以后就用这个名字认它了。

if (!RegisterClass (&wndclass))//为程序窗口注册窗口类
{
     MessageBox (NULL, TEXT ("This program requires Windows NT!"),

阅读(637) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~