Windows编程-资源操作

资源也就是东西,意思就是把东西引入到Windows编程中。这里的资源主要是光标图标背景这一系列东西

如何添加资源

windows封装了资源,所以不能直接用资源来操作,只能用资源句柄来操作。

LoadXXX:XXX是资源类型

LoadIcon 载入图标

LoadCursor载入光标

LoadMenu载入菜单

等等

图标资源

LoadIcon

创建自己的图标

首先需要添加资源

 

 

这里选用ICON图表资源

随便弄一个保存下来

这里会自动保存一个资源文件,和在头文件中的resouce文件

更换图标

载入资源-LoadXXX

LoadIcon

HICON LoadIconA(
HINSTANCE hInstance,
LPCSTR   lpIconName
);

第一个参数表示被加载的模块的句柄

第二个参数表示要加载的资源的命令的指针

但是由于第二个参数得到的是一个资源标识的一个数字,这里需要转换为指针变量来处理。

返回值就是资源的句柄,就可以拿这个来操作资源了

            HICON hIcon =LoadIcon(hInstance,(LPCWSTR)IDI_ICON1);

设置资源-SetClassLong

将指定偏移量处的指定32位(long)值替换到指定窗口所属类的额外类存储器或WNDCLASSEX结构中。

DWORD SetClassLongA(
HWND hWnd,
int nIndex,
LONG dwNewLong
);

第一个表示要替换的窗口的句柄

第二个表示要替换的窗口的什么资源

第三个表示被替换的资源的句柄

更换图片总

HICON hIcon =LoadIcon(hInstance,(LPCWSTR)IDI_ICON1);
SetClassLong(hwnd, GCL_HICON,(LONG)hIcon);

更换图片方法2

在创建窗口类的时候就把图标资源添加进去

光标资源

创建自己的光标

 

 

载入光标

HCURSOR hCursor = LoadCursor(hInstance, (LPCWSTR)IDC_CURSOR1);

设置光标资源

SetClassLong(hwnd, GCL_HCURSOR, (LONG)hCursor);

添加菜单资源

同样先添加菜单资源

 

 

加载资源

第一种办法

直接在窗口类中添加

    WNDCLASS myclass = { 0 };
myclass.lpszClassName = L"sm7";
myclass.lpfnWndProc = WindowProc;
myclass.lpszMenuName = (LPCWSTR)IDR_MENU1;

第二种办法

在CreateWindow的时候添加

因为创建CreateWindow的时候有一个参数是hMenu其实就是菜单资源的参数

在CreateWindows中是一个HMENU的菜单句柄,所以也需要先LoadMenu载入获取菜单句柄再添加

第三种办法-SetMenu

通过按钮资源API来处理来处理

先载入资源LoadMenu

然后SetMenu加载

对话框资源

对话框资源可以创建一个对话框,以及所有的子控件,通过对话框进行可视化编辑

对话框分为模态对话框和非模态对话框

区别就是:模态对话框如果不关闭就不能操作主窗口,而非模态对话框不能影响主窗口

创建对话框

直接在资源里面新建一个对话框

创建非模态对话框-CreateDialog

CreateDialog

void CreateDialogA(
  hInstance,
  lpName,
  hWndParent,
  lpDialogFunc
);

第一个参数表明该模态对话框属于什么可执行文件的句柄,也就是实例句柄

第二个参数对话框资源的名称

第三个参数表示父窗口句柄

第四个参数指向对话框过程的指针属于一个回调函数

DLGPROC Dlgproc;

INT_PTR Dlgproc(
HWND Arg1,
UINT Arg2,
WPARAM Arg3,
LPARAM Arg4
)
{...}

由CreateDialog和DialogBox函数系列使用的应用程序定义的回调函数。它处理发送到模式对话框或无模式对话框的消息。所述DLGPROC类型定义一个指向这个回调函数。DialogProc是应用程序定义的函数名称的占位符。其实也就是一个消息处理函数。通常,如果对话框过程处理了消息,则应返回TRUE,否则应返回FALSE。如果对话框过程返回FALSE,则对话框管理器将响应该消息执行默认对话框操作。

#include<Windows.h>
#include<CommCtrl.h>
#include"resource.h"
INT_PTR CALLBACK Dlgproc(
HWND hWnd,
UINT Umsg,
WPARAM wparam,
LPARAM lparam
)
{
switch (Umsg)
{
case WM_INITDIALOG:
{
MessageBox(hWnd, L"对话框创建成功", L"创建对话框", MB_OK);
return true;
}
case WM_CLOSE:
{
DestroyWindow(hWnd);
exit(0);
return true;
}
default:
return false;
}
}

int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR     lpCmdLine,
int       nShowCmd
)
{
HWND hMyDialog= CreateDialogW(hInstance, (LPCWSTR)IDD_DIALOG1, NULL,Dlgproc);

ShowWindow(hMyDialog, SW_SHOW);
MSG message;
while (GetMessage(&message, hMyDialog, 0, 0))
{
TranslateMessage(&message);
DispatchMessage(&message);
}


return 0;
}

创建非模态对话框产生的消息是WM_INITDIALOG

创建模态对话框-DialogBox

是Windows自己的对话框模板

从对话框模板资源创建模式对话框。在指定的回调函数通过调用EndDialog函数终止模式对话框之前,DialogBox不会返回控制。

void DialogBoxA(
  hInstance,
  lpTemplate,
  hWndParent,
  lpDialogFunc
);

从对话框模板资源创建模式对话框。

参数

第一个参数是模态对话框的实例句柄

第二个参数是模态对话框的对话框资源标识符

第三个参数是父窗口的句柄

第四个参数是模态对话框消息处理的回调函数,这个回调函数和非模态对话框是一样的

返回值

返回值为空,创建的时候就会自己显示自己

模态对话框只需要创建并指定好回调函数,不用再考虑显示窗口和消息接受和分发