WIndows的资源有:
Icons
Cursors
Character strings
Custom resources
Menus
Keyboard accelerators
Dialog boxes
Bitmaps
资源:Resources是数据,保存在.EXE文件中,但是却不在程序段中,所以没办法像int a;这样引用它,Windows提供了函数把资源load到memory,我们才能用。
resource script (.rc)列出了程序所有资源,RESOURCE.h头文件让你的程序可以引用这些资源。
resource.h头文件允许C源文件使用与source script同名的identifiers
resource script 就是一个文本文件,它包含了能够表示问文本的资源(菜单,对话框)的文本表达式,包含了不能表示为文本的资源(图标,光标)的二进制文件的引用。
Icon:
resource script把ICONDEMO.ico图标文件与IDI_ICON等同起来
资源文件会被资源编译器RC.EXE编译,resource script转换成二进制文件,最后被编译了的.res文件在连接阶段与.OBJ and .LIB这些文件一样被指定连接形成.EXE
获取Icon句柄:
hIcon = LoadIcon (hInstance, MAKEINTRESOURCE (IDI_ICON)) ;
LoadIcon函数返回HICON,第一个参数是资源所在的实例句柄,第二个参数是指向字符串的指针,MAKEINTRESOURCE是把资源标示符由数字变成指向字符串的指针
Icon的ID可以是字符串(要用""括起来)那么.h文件就没有define语句把字符串定义成一个Int,就不用再MAKRINTRESOURCE,可以直接用ID的字符串。
GetSystemMetrics(SM_CXICON/SM_CYICON)一般返回都是32*32,客户区的Icon和桌面上的Icon都是32*32的
GetSystemMetrics(SM_CXSMSIZE/SM_CYSMSIZE)返回的是16*16,小型Icon的size,标题栏的和任务栏的图标都是这个size
GetSystemMetrics(SM_CXSMSIZE/SM_CYSMSIZE)返回的是16*16,小型Icon的size,标题栏的和任务栏的图标都是这个size
SetClassLong (hwnd, GCL_HICON,LoadIcon (hInstance, MAKEINTRESOURCE (IDI_ALTICON))) ;//动态改变窗口的icon
Cursor:
自定义cursor一般都是32*32的,同时不好忘记设置cursor的hot spot,VS2012有个设置作用点工具来设hot spot的
如果使用了子窗口,那么子窗口设计类的时候hCursor这项可以修改,如果是Windows定义好的类,可以利用SetClassLong来修改
SetClassLong (hwndChild, GCL_HCURSOR,LoadCursor (hInstance, TEXT ("childcursor")) ;
如果只是窗口的一个逻辑分区,可以利用SetCursor来修改,防止闪烁则把类的hCursor设为NULL就不会自动用类的光标去刷新了
SetCursor (hCursor) ;
String Resource:
把字符串作为资源使用,可能会令理解更费力
LoadString (hInstance, id, szBuffer, iMaxLength) ;
LoadString()函数用于加载字符串资源,id是字符串资源的id,szBuffer则是用来接收字符串的字符串数组,iMaxLength是szBuffer数组的最大长度,函数返回值是加载到的字符串的实际长度。
字符串的ID通常define在头文件中,所以编程的时候记得包含头文件
自定义资源:
VS2012插入自定义资源的方法是直接import,它没custom选的,接着要写自定义资源的type,接着resource script就多了如下的语句,IDR_BINTYPE1是数字标示符,可以用字符串代替
IDR_BINTYPE1 BINTYPE BINDATA.BIN
hResource = LoadResource (hInstance,FindResource (hInstance, TEXT ("BINTYPE"),MAKEINTRESOURCE (IDR_BINTYPE1))) ;
hResource是HGLOBAL类型的,是内存块的句柄
LoadResource并不真正把资源加载到内存上
pData = LockResource (hResource) ;
LockResource加载资源到内存,并且返回指向它的指针:
FreeResource (hResource) ;
完成对自定义资源的操作,可以free it from memory