选中左边的 Resource 选项,然后点 击根目录,点击鼠标右键,选取 Insert 选项(见图 1-18) : 图 1-18 鼠标右键 Insert 选项 然后在弹出的对话框中选取 Cursor 选项,点击 New 按钮(见图 1-19) : Windows 下的 C/C++编程 图 1-19Cursor 选项 下一步,就同上一节一样,绘制需要的图案,这里画了一个十字架加个圈,就当作是瞄准点 吧(见图 1-20) 。游戏中的可没有这么粗糙哦,这个以后再说。 图 1-20 绘制 Cursor 好了,接下来就是改变代码了。Resource 头文件已经被包括在源文件中了,找到下面代码: …………………………………… wndclass.hInstance = hInstance ; //指定图标 wndclass.hIcon = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1)) ; wndclass. hCursor = LoadCursor ( NULL , IDC_ARROW) ; ………………………………………. 把它修改为如下: …………………………………… wndclass.hInstance = hInstance ; //指定图标 wndclass.hIcon //指定光标 wndclass.hCursor = LoadCursor(hInstance,MAKEINTRESOURCE(IDC_CURSOR1)) ; 其中 IDC_CURSOR1 是创建时系统指定的标识。 : 好了,按 F5 键吧,因该得到如下窗口(见图 1-21) = LoadIcon(hInstance,MAKEINTRESOURCE(IDI_ICON1)) ; 图 1-21 窗口 Windows 下的 C/C++编程 只要鼠标移动到窗口中,就会变成这样的形状了。 如果不想要鼠标呢?在后面的游戏中也会有这个情况,那到时再说吧。 下面,来谈谈 Windows 下的图形编程,为以后的游戏编程作个铺垫。 Windows GDI 编程 GDI(Graphics Device Interface)就是图形设备接口,属于 Windows 系统的一个子系统, 负责在显示设备上显示图形,如显示器、打印机、绘图仪等。 1)色彩基础 以前的显示器都是单色的,也就是只有黑、白两种颜色。随着硬件、软件的发展,显示器 的色彩已经有了极大的飞跃。就目前而言,常用的色彩设置为增强色和真彩色。 所谓的单色,就是对应于屏幕的一个象素,只用一位来表示色彩。0 表示黑,1 表示白。这 是由于早期电脑的各种资源决定的。 如果用 4 为表示一个象素点的色彩,就可以有 2 ,也就是 16 种颜色。这种色彩设置目前在 家用电脑上已经很少见了。 256 色,这因该是游戏爱好者很熟悉的了,也就是每象素用 8 位表示。很多游戏都是用 256 色表示的。其中的原因就是 256 色对系统硬件的要求不高,同时也便于计算机软件处理。详细的 情况,在后面的章节会具体说明。 增强色,就是用 16 位表示一个象素点,大约可以表示 65000 多种色彩。其中用于表示色彩 的宏称为 RGB,就是红、绿、蓝三种原色。16 位会被分为 5 位、6 位、5 位,分别用于表示 RGB 的三个分量(也就是表示三种颜色的不同值) 。为什么绿色分配了 6 位呢,这与人眼对绿色的敏 感度与其他颜色不同有关。同时,也存在为每种原色分配 5 位的设置,留下的最高位用于表示 alpha 值。 真彩色分为两种, 位和 32 位。 位就是为每个原色分配 8 位, 24 24 这样就可以表示大约 1600 万种色彩。而 32 为,就是用 8 为表示 alpha 值,余下的 24 位分配给每个原色 8 位。 实际上,肉眼是无法区分 16 位色和 24 位色的具体区别。16 位色中,给出两个在计算机上 相差不大的色彩,人的眼睛恐怕就难以区别了。但是,我们可以从总体上看出区别。同一幅图, 用 16 位色和 24 位色分别表示,我们就可以看出,24 位色的图效果从总体上说要好,至于具体 怎么个好法,就难以描述了。 所以,在进行游戏编程的同时,也要视情况来进行色彩设置。一味的抬高色彩设置,不但 消耗硬件资源, 还会加长程序处理色彩的时间, 这样色彩效果相差不大, 却造成了不必要的麻烦。 2)WM_PANIT 消息 前面提到过 WM_PANIT 消息,这是一个相当重要的消息。一般说来,当程序初始化或者窗口 发生变化(大小、位置等)时,都会产生 WM_PANIT 消息,通知系统更新显示用户区。需要更新 显示的用户区可以是整个用户窗口,也可以是窗口的一部分,举个例子。 打开前面的 Win Hello World 工程,找到里面的 WM_PANIT 消息: …………………………………….. switch(message) { case WM_CREATE : 4 Windows 下的 C/C++编程 MessageBox(NULL,"Hello World!","Hello World ",MB_OK) ; MessageBeep(MB_OK) ; return 0 ; case WM_PAINT : hdc=BeginPaint(hwnd,&ps) ; GetClientRect(hwnd,&rect) ; DrawText(hdc,TEXT("Hello,Windows !"),-1,&rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; EndPaint(hwnd,&ps) ; return 0 ; case WM_DESTROY: ………………………………………………. 把它改成: ……………………………………………….. switch(message) { case WM_CREATE : return 0 ; case WM_PAINT : hdc=BeginPaint(hwnd,&ps) ; GetClientRect(hwnd,&rect) ; DrawText(hdc,TEXT("Hello,Windows !"),-1,&rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER) ; MessageBox(NULL,"Hello World!","Hello World ",MB_OK) ; MessageBeep(MB_OK) ; EndPaint(hwnd,&ps) ; return 0 ; case WM_DESTROY: ……………………………………………. 然后,重新编译运行,将得到如下结果(见图 1-22) 。 Windows 下的 C/C++编程 图 1-22