WEB开发网
开发学院软件开发VC 改变窗口中的光标形状 阅读

改变窗口中的光标形状

 2010-07-11 20:44:46 来源:WEB开发网   
核心提示:这里libres.rc是包含库中所有对话框、光标和其他资源的资源文件,头文件libres.h以基本值偏移量的方式规定了libres.res中使用的资源ID,改变窗口中的光标形状(3),// 在libres.h文件中#ifndef LIBBASEID#define LIBBASEID 2000 // 或其他值#endif

这里libres.rc是包含库中所有对话框、光标和其他资源的资源文件。头文件libres.h以基本值偏移量的方式规定了libres.res中使用的资源ID。

// 在libres.h文件中
#ifndef LIBBASEID
#define LIBBASEID 2000 // 或其他值
#endif
#define IDR_FOO (LIBBASEID+1)
#define IDR_BAR (LIBBASEID+2)
// 等等

只要改变LIBBASEID的值,使用这个库的程序员可以方便地重新映射所有资源ID,例如:

// 在主程序rc文件
#define LIBBASEID 3000
#include "libres.h"
#include "libres.rc"

现在所有的ID从3000开始而不是2000,在实际当中这个办法很有效,但它有一个麻烦的问题,那就是它需要用户重新编译库以改变ID。如果重新编译库是不可行的(也许你不想提供源代码),还有一些其 它的办法。要是程序员改变了LIBBASEID,只有当他直接使用IDR_FOO或其他资源ID时,才需要重新编译库。也就是说,在库中直接引用了这些资源ID:

BOOL SomeLibFn(...)
{
  DialogBox(..., IDR_FOO, ...);
}

可以不直接引用这些资源ID,方式之一就是把它们作为调用函数的参数传递。

BOOL SomeLibFn(..., UINT nDlgID)
{
  DialogBox(..., nDlgID, ...);
}

现在你不用担心库中的资源ID会发生冲突,因为主程序一定支持它们。改变LIBBASEID值的用户不用也不能重新编译库,因为所有ID是作为函数值传入的。当然这个方法要求编写主程序的程序员必须编辑库中的rc文件以设置ID,还是有点麻烦。更好的办法是以全局静态变量而不是固定的ID值作为偏移量的基本值。

// 在头文件中
extern UINT LibBaseId;
#define IDR_FOO (LibBaseId+1);
#define IDR_BAR (LibBaseId+2);
// 等等
// 在库中主模块
UINT LibBaseId = 2000;

假如现在发生冲突,应用程序可以在启动时改变LibBaseId值(也许是通过一个函数),然后重新编译主程序即可。唉,但这对RC文件不起作用。我曾经说过RC文件的语法并不是纯C/C++语法,而只是其一个子集,所以RC文件不知道extern和UINT是什么。要使资源编译器理解这些符号,你需要使用另外的头文件,或者采用更简便的方法,使用宏RC_INVOKED,这样这些符号就可以放在同一个头文件当中。

// 在libres.h头文件中
#ifdef RC_INVOKED
#ifndef LibBaseId
#define LibBaseId 2000
#endif
#else
extern UINT LibBaseId;
#endif
#define IDR_FOO (LibBaseId+1);
#define IDR_BAR (LibBaseId+2);
// 等等

一般来说,包含在RC文件中的头文件不能包含除#define以外的C代码。采用这种方法,使用你的库的程序员必须做两件事来重新映射库中的资源ID。第一步,在把libres.h包含到主RC文件之前,他们必须重新#define LibBaseId一个新值。第二步,他们必须在主应用程序的启动代码中(比如在CWinApp::InitInstance函数中)将LibBaseId初始化为同样的值。最后,有另外一种更简单的解决资源ID冲突的办法:使用字符串而不是数值来映射资源ID。

// 在libres.h头文件中
#define IDR_FOO "MyApp_IDR_FOO"
#define IDR_BAR "MyApp_IDR_BAR"
 
//等等

使用字符串映射资源ID的效率并不高,因为不仅它们占用空间多,而且查找字符串映射的资源比查找整数映射的资源慢。如果你库中有几百个用于字符串或其他使用频率高的资源ID,我建议你使用整数映射ID并且采用前面提出的一种解决方法。但假如你库中的资源就是几个对话框,那使用字符串映射资源ID是再好不过了。没有人会注意多用了5毫秒显示对话框,并且资源ID冲突的可能性几乎为零。

作者简介

Paul DiLascia,《Windows++: Writing Reusable Windows Code in C++》(Addison-Wesley出版公司1992出版)的作者,是一名自由作家和顾问。你可以发邮件到askpd@pobox.com或登录http://www.dilascia.com/和他取得联系。

本文配套源码

上一页  1 2 3 

Tags:改变 窗口 光标

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接