用户
搜索

该用户从未签到

i春秋作家

Rank: 7Rank: 7Rank: 7

16

主题

27

帖子

249

魔法币
收听
0
粉丝
0
注册时间
2018-1-1

i春秋签约作者

发表于 6 天前 31701
本帖最后由 flag0 于 2020-7-30 09:58 编辑

本文原创作者flag0,本文属于i春秋原创奖励计划,未经许可禁止转载!

资源

代码以外的东西,都可以统称为资源。

windows会将所有的资源和代码放到同一个文件(exe、dll)里面。

通过RegisterClass类中的各个参数来加载资源。

图标资源

添加图标资源

右击项目->添加->资源->icon

会添加如下资源:

  • .h头文件
  • .rc窗口文件
  • .ico图标文件。

加载图标资源

使用LoadIcon从exe文件中,加载指定的图标资源。

LoadIcon参数

  • HINSTANCE hInstance 实例句柄,使用WinMain的参数
  • LPCTSTR lpIconName 图标名称
//方法一:使用ID的方式强转
wc.hIcon = LoadIcon(hInstance, (LPCTSTR)ICN_TEST);
//方法二:使用宏进行转换
wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(ICN_TEST);
//方法三:将图标资源ID 命名为"TestIcon"
wc.hIcon = LoadIcon(hInstance, "TestIcon");            

光标资源

添加光标资源

右击项目->添加->资源->Cursor

加载光标资源

光标使用LoadCur进行加载(和LoadIcon参数一致)。

wc.hCursor = LoadCursor(hInstance, MAKEINTRESOURCE(CUR_TEST));

背景资源

hbrBack提供了一些系统自定义的颜色,可以直接拿来使用(必须在颜色值的基础上+1)。

1595951852583

wc.hbrBackground = (HBRUSH)(COLOR_ACTIVECAPTION + 1);

菜单资源

右击项目->添加->资源->Menu

插入分割条:右键菜单插入分隔符

菜单属性

右键菜单->属性 设置ID

  • Checked 打勾

  • Grayed 灰色

绑定菜单

//方法一:在窗口类处添加
wc.lpszMenuName = MAKEINIRESOURCE(MN_TEST);
//方法二:在创建窗口实例处(CreateWindow)添加
//在此处可以覆盖窗口类中的菜单
LoadMenu(hInstance, MAKEINIRESOURCE(MN_TEST);

处理菜单消息

  • WM_COMMAND当使用 菜单、控件、快捷键时会发送此消息。

WindowProc 函数的wParam参数:如果消息来自控件,则高位指定通知代码,如果消息来自快捷键则该值为1,如果来自菜单,则该值为零。低位指定菜单项、控件或快捷键的标识符。

switch (uMag)
{
case WM_CLOSE:
    PostQuirMessage(0);
    return 0;
case WM_COMMAND:
    {
      WORD wFrom = HIWORD(wParam);//取高位
      WORD wID = LOWORD(wParam);//取低位
      if(wFrom == 0)//来自于菜单
      {
          switch(wId)
          {
          case MN_FILE_OPEN:
          MessageBox(NULL, "打开", "提示", MB_OK);
              break;
          case MN_FILE_SAVE:
          MessageBox(NULL, "保存", "提示", MB_OK);
              break;
          case MN_FILE_SAVEAS:
          MessageBox(NULL, "另存为", "提示", MB_OK);
              break;
          }
      }
    break;
    }
}

快捷键

快捷键是一种组合按键,同时处理多个键。

可以通过GetAsyncKeyState 来获取其他按键的状态,但是处理流程比较复杂。

新建快捷键

可以在资源中新建快捷键。

右击项目->添加->资源->Accelerator

在修饰符列的下拉菜单处,选择快捷键。

在键列的下拉菜单处,设置按键,如果是字母按键直接输入即可。

1595955091286

加载快捷键

加载快捷键LoadAccelerators

HACCEL hAccel = LoadAccelerators(hInstance, MAKEINIRESOURCE(ACCEL_TEST));

在消息循环中,使用TranslateAccelerator将按键消息转换成 WM_COMMAND 消息。

//将按键消息转换成快捷键消息
if(!TranslateAccelerator(hWnd, hAccel, &msg))
{
    //转换char消息
    TranslateMessage(&msg);

    //根据窗口调用对应的回调函数(窗口过程函数)
    DispatchMessage(&msg);
}

处理快捷键消息

switch (uMag)
{
case WM_CLOSE:
    PostQuirMessage(0);
    return 0;
case WM_COMMAND:
    {
      WORD wFrom = HIWORD(wParam);//取高位
      WORD wID = LOWORD(wParam);//取低位
      if(wFrom == 1)//来自于菜单
      {
          switch(wID)
          {
          case CTRL_A:
              MessageBox(NULL, "CTRL_A", "提示", MB_OK);
              break;
          case CTRL_SHIFT_B:
              MessageBox(NULL, "CTRL_SHIFT_B", "提示", MB_OK);
              break;
          }
      }
    break;
    }
}

分析资源文件

resource.h 资源的宏定义,由VS自动维护,不建议修改。

.rc文件 资源脚本语法(不要求掌握,有时出bug需要手动打开查看)

1595956762100

菜单语法

1595956800094

快捷键语法

1595956858868

带资源程序的编译流程

不带资源的编译流程

1595957431665

带资源的编译流程

1595957621894

手动编译

//编译文件
cl /c pch.cpp Test.cpp /o:Test.obj
rc Test.rc 
link /subsystem:windows pch.obj Test.obj Test.res user32.lib

将图标画到窗口上

右击项目->添加->资源->icon

删除其他不需要的分辨率的图像。

使用DrawIcon画到窗口上。

BOOL DrawIcon(
  HDC hDC,      // Dc句柄
  int X,        // x轴
  int Y,        // y轴
  HICON hIcon   // 图标
 );

在窗口过程函数的WM_PAINT消息中调用

case WM_PAINT:
{
    PAINTSTRUCT ps;
    HDC hDc = BeginPaint(hwnd, &ps);
    EndPaint(hwnd, &ps);
    HICON hIcon = LoadIcon(GetModuleHandle(NULL), MAKEINTRESOURCE(ICN_DRAW));//GetModuleHandle 返回实例句柄
    DrawIcon(hDc, 0, 0, hIcon);
    return 0;
}
已阅
使用道具 举报 回复
跟着师傅学习下~
使用道具 举报 回复
学习了
使用道具 举报 回复
发新帖
您需要登录后才可以回帖 登录 | 立即注册