win32学习-资源(2021.1.14)

第一次写博客,见谅

注意:

  • 真的从0开始,只有一点C/C++基础
  • 之前的学习记录都在电脑里,之后有空慢慢传上来
  • 学的是win32,用的是vs2013,看的视频里老师用的是vs2010
  • 写这个的主要目的是怕自己之后忘了,方便捡起来

--学习内容:资源文件:

1).rc文件:里面放着程序要用到的图片之类的(图标、按键用的图片)。需要一个resource.h(编译后变成.res)定义每个资源的ID(用户定义的一个整数) 

2)使用RC资源

1.三个定义:资源,控件,声明。
图标、位图、对话框都是资源
有些资源里可以添加控件(比如对话框)
有些资源有声明(比如对话框的标题CAPTION就是一种声明)

2.创建描述(定义)资源使用方式的脚本.rc文件
 

右键单击紫色那个(.sln)添加,资源
右键单击紫色那个.sln或者资源文件

然后弹出

弹出窗口,选择上传/创建资源类型
选新建位图的话,能体验在vs里画画的感觉

(右键单击新建的标签页,打开所在文件夹,你会发现一波操作下来文件夹里多了以工程名命名的resource script类型文件(就是.rc,可以用记事本打开),resouce.h,以及一个.bmp(位图))保存之后.h文件中会自动给新建的资源define一个ID号,.rc文件里有对资源的一些描述(可以在.rc文件里直接修改)
 

.h文件里资源的ID号
.rc文件截取

对于对话框这个资源,vs工具箱里有可以加的控件(单选框、输入框之类的).rc文件里也可以对这些加入的控件进行修改

 

我裂开
我裂开

 

3.从资源文件里加载资源到程序中:Load系列函数

3-0.LoadImage
LoadImageW(
     HINSTANCE hInst,//独立资源(非独立是指从解决方案资源文件中加载时)时为NULL
     LPCWSTR name,//独立资源时为全路径 *:要用双斜杠,因为转义!
     UINT type,//你加载的是光标(IMAGE_CURSOR),位图(IMAGE_BITMAP),图标(IMAGE_ICON)
     int cx,//宽度(若为0:if(fuLoad==LR_DEFAULTSIZE)使用SM_CXICON/CXCURSOR;else则使用实际宽度
     int cy,//高度同上
     UINT fuLoad);//LR_DEFAULTCOLOR|LR_CREATEDIBSECTION|LR_LOADFROMFILE

3-1,3-2,3-3可用LoadImage替换,LoadImage可以直接Load位图图标光标,更好使。3-1,3-2只用于上载在.rc文件里的资源,而LoadImage可以通过资源的路径调用资源

MAKEINTRESOURCE能将整数强制类型转化为指针,此处用于将资源ID转化为指针作为LoadBitMap函数的第二个参数。要使用资源ID时,记得先include"resource.h"。
用完后要用DeleteObject删除资源句柄,避免内存泄露(有点像动态申请内存)


3-1.LoadBitMap
HBITMAP WINAPI LoadBitmapW(HINSTANCE hInstance, //要使用资源的模块的实例句柄,通常就是窗口句柄hInstance。
LPCWSTR lpBitmapName);//资源名称,可用MAKEINTRESOURCE宏获取此值

3-0,3-1上载之后要SendMessage向消息循环发送消息BM_SETIMAGE,关联位图与控件:
SendMessage(hBtn1,//控件句柄
BM_SETIMAGE,//发送的消息ID
(WPARAM)IMAGE_BITMAP,//这个消息ID下只能是IMAGE_BITMAP或者IMAGE_ICON
(LPARAM)hbmp);//将图像句柄与之关联

3-2LoadIcon
HICON WINAPI LoadIconW(HINSTANCE hInstance,//如果是系统图标,此处为NULL;如果从资源文件里加载自定义图标此处填hInstance
LPCWSTR lpIconName);

3-3.LoadCursor
HCURSOR WINAPI LoadCursor(HINSTANCE hInstance,LPCWSTR lpCursorName);

3-4.LoadString字符串资源上载到一个TCHAR数组中,可以作为窗口标题之类的东西
int WINAPI LoadStringW(HINSTANCE hInstance,//窗口hInstance,可以用GetMouduleHandle(NULL)获取当前程序实例句柄
UINT uID,//直接用资源ID
    _Out_writes_to_(cchBufferMax, return + 1) LPWSTR lpBuffer,//TCHAR指针(通常是一个TCHAR数组名)
    int cchBufferMax//sizeof(TCHAR数组)
    );

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Guess you like

Origin blog.csdn.net/Enoshima/article/details/112602803