资源不能从程序原始码中定义的变量直接存取,Windows提供函数直接或间接地把它们加载内存以备使用。
代表函数:即LoadIcon和LoadCursor。它们从Windows中加载二进制图标和光标映象,并传回该图标或光标的句柄。
10.1 图标、光标、字符串和自订资源
将图标添加到程序
RESOURCE.H:列出了程序的所有资源和一个让程序引用资源的表头文件.
扩展名为RC的文件:资源描述档.
不必直接建立RESOURCE.H文件,而是由Developer Studio为您建立一个。这个时候就有RESOURCE.H文件了
刚开始上面的代码是编译不过的。往RC文件里面加入一个资源(这里的资源是指图标),然后修改其ID为:IDI_ICON,
中加入宏定义了,这个时候就可以编译通过了.
取得图示的句柄。使用叙述
cxIcon = GetSystemMetrics (SM_CXICON);
cyIcon = GetSystemMetrics (SM_CYICON);
取得图示的大小。然后,程序通过多次呼叫
DrawIcon(hdc, x, y, hIcon);
取得图示句柄
ICONDEMO.RC里面的有AFXRES.H头文件:它包含了在建立由机器产生的
MFC项目时由Developer Studio使用的常用标识符。
IDI_ICON ICON DISCARDABLE "icondemo.ico" 是资源描述档的ICON叙述
DISCARDABLE关键词:必要时Windows可以从内存中丢弃图标
程序可以通过呼叫LoadIcon函数取得此图示的句柄:
hIcon = LoadIcon (hInstance, MAKEINTRESOURCE (IDI_ICON));
LoadIcon传回HICON型态的值,它是图示的句柄
LoadIcon的第一个参数,是指出资源来自哪个文件的执行实体句柄。使用hInstance表示它来自程序自己的.EXE文件。
LoadIcon的第二个参数实际上被定义为指向字符串的指针。
默认情况下的定义:IDI_APPLICATION也在WINUSER.H中用MAKEINTRESOURCE定义,#define IDI_APPLICATION MAKEINTRESOURCE(32512)
可以使用两种方法之一引用图示:1.hIcon = LoadIcon (hInstance, MAKEINTRESOURCE (125));
2.另一个不易阅读的方式是:hIcon = LoadIcon(hInstance, TEXT ("#125")) ;
在程序中使用图标
想在程序执行的时候,动态地更改程序的图标, 可以使用SetClassLong来达到目的
SetClassLong (hwnd, GCL_HICON, LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ALTICON)));
可以使用GetClassLong获得句柄DrawIcon(hdc, x, y, GetClassLong(hwnd, GCL_HICON));
LoadIcon是取得句柄但不需要清除句柄的少数几个函数之一。
使用自订光标
自订游标一般为单色,大小为32×32图素。
可以在对象类别定义中设定自订光标
wndclass.hCursor = LoadCursor(hInstance, MAKEINTRESOURCE (IDC_CURSOR));
如果光标用文字名称定义wndclass.hCursor = LoadCursor (hInstance, szCursor) ;
如果使用了预先定义的子窗口控件,就可以使用以下方法改变窗口类别的hCursor字段:
SetClassLong (hwndChild, GCL_HCURSOR, LoadCursor(hInstance, TEXT("childcursor"));
字符串资源
字符串资源主要是为了让程序转换成其它语言时更为方便。
可以使用LoadString呼叫把字符串复制到程序数据段的缓冲区中:
LoadString(hInstance, id, szBuffer, iMaxLength);
参数id是ID,它加在资源描述文件中每个字符串的前面;szBuffer是指向接收字符串的字符数组的指针
iMaxLength是送入szBuffer中的最大字符数。 函数传回字符串中的字符数。
所有资源文字-包括字符串表中的文字-以Unicode格式储存在.RES编译资源文件以及最终的EXE文件中。
每一个字符串资源在[RESOURCE.H]里都定义了一个标示符,在资源描述文件具有此字符串表。
自订的资源
自订资源让连结.EXE文件中的各种数据更为方便,对取得程序中的数据也是如此。
在程序的初始化(比如,在处理WM_CREATE消息时)期间,您可以获得资源的句柄:
hResource = LoadResource (hInstance, FindResource (hInstance, TEXT ("BINTYPE"), MAKEINTRESOURCE(IDR_BINTYPE1))) ;
事实上,LoadIcon和LoadCursor函数就用到了LoadResource和FindResource函数。
您需要存取文字时,呼叫:pData = LockResource(hResource);
LockResource将资源加载内存(如果还没有加载的话),然后它会传回一个指向资源的指标。
在WndProc处理WM_CREATE时,使用FindResource和LoadResource取得资源句柄。
使用LockResource锁定资源,并且使用一个小程序将文件末尾的反斜线(/)换成0,这有
于后面WM_PAINT消息处理期间使用的DrawText函数。
子窗口的滚动条有一个自动的键盘接口,因此在POEPOEM中没有处理WM_KEYDOWN。
IDS_APPNAME和IDS_CAPTIONPOEPOEM字符串在程序的开始由LoadString加载内存