Windows编程资源,菜单资源,图标资源,光标资源,上下文菜单,字符串资源,加速键资源(上)

简介: Windows编程资源,菜单资源,图标资源,光标资源,上下文菜单,字符串资源,加速键资源

Windows资源是一种二进制数据,由链接器链接进程序成为程序的一部分,通过资源的方式可以很方便的对应用程序进行扩展。在Windows中资源可以是系统自定义的,也可以是用户自定义的。在本篇文章中为大家讲解菜单资源,上下文菜单,图标资源,光标资源,加速键资源的创建方法,这里我使用的编译器为visual studio2022版本。

一.菜单资源

1.菜单分类

  • 窗口顶层菜单
  • 弹出式菜单
  • 系统菜单
  • HMENU类型表示菜单,ID表示菜单项

2.如何创建菜单资源

对于目前的编译器,我们自己添加资源还是非常容易的,我们只需要使用可视化图形界面就可以。

  • 1.添加菜单资源
  • <1>.右键单击资源文件,选择添加–>资源
  • <2>.选择添加Menu资源
  • <3>.添加想要的菜单资源,并且设置消息ID
  • 2.获取本进程菜单句柄
HMENU LoadMenu(
  HINSTANCE hInstance;         //包含要加载的菜单资源模块的句柄
  LPCSTR lpMenuName            //菜单资源的名称
);

  • 3.加载菜单资源
  • <1>.注册窗口类时设置菜单(lpszMenuName)
  • <2>.创建窗口时,传参设置菜单
  • <3>.在主窗口WM_CREATE消息中使用SetMenu函数设置菜单
SetMenu(
  HWND hWnd,        //窗口句柄
  HMENU hMenu,      //菜单句柄
);设置成功,返回非零

在这里对SetMenu函数不做过多的解释了,大家可以到MSDN官方文档解释SetMenu函数中查看该函数的详细介绍。

  • 4.处理菜单消息在学习处理菜单消息之前,我们来学习一种常见的消息类型:WM_COMMAND
  • 发出时间:当用户从菜单中选择命令项,空间将通知消息发送到其父窗口或翻译快捷键击时发送。
  • 附加信息
  • wParam:
  • HIWORD:对于菜单为0
  • LOWORD:菜单项的ID
  • lParam:对于菜单为0

3.实操展示

我们来使用WM_COMMAND消息来处理菜单按钮:

设置菜单:

回调函数处理:

LRESULT CALLBACK WindowProc(
  IN  HWND hwnd,
  IN  UINT uMsg,
  IN  WPARAM wParam,
  IN  LPARAM lParam
)
{
  char output[256] = { 0 };
  switch (uMsg)
  {
  //常见消息
  case WM_DESTROY: {
    PostQuitMessage(0);
    break;
    }
  case WM_SYSCOMMAND: {
    sprintf(output, TEXT("检测到WM_COMMAND消息\n"));
    WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0);
    break;
  }
  case WM_CREATE: {
  sprintf(output, "检测到WM_CREATE消息,将创建窗口。\n");
    WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0);
    break;
  }
  case WM_SIZE: {
    sprintf(output, "lParam:窗口宽变化为:%d,窗口高变化为:%d \n", HIWORD(lParam), LOWORD(lParam));
    WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0);
    break;
  }
  //菜单命令消息
  case WM_COMMAND: {
    switch(LOWORD(wParam)) {
      case MY_OPEN: {
        sprintf(output, "打开按钮被点击,请到回调函数中做具体处理。\n");
        WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0);
        break;
      }
      case MY_QUIT: {
        sprintf(output, "退出按钮被点击,请到回调函数中做具体处理。\n");
        WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0);
        break;
      }
      case IDM_ABOUT: {
        sprintf(output, "帮助按钮被点击,请到回调函数中做具体处理。\n");
        WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0);
      }
      case MY_NEWFILE: {
        sprintf(output, "打开新文件按钮被点击,请到回调函数中做具体处理。\n");
        WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0);
        break;
      }
      case MY_LASTTIMEFILE: {
        sprintf(output, "上次打开文件按钮被点击,请到回调函数中做具体处理。\n");
        WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0);
        break;
      }
    }
    break;
  }
  //键盘消息
  case WM_KEYDOWN: {
    sprintf(output, "检测到WM_KEYDOWN消息,键码值:%d.\n", wParam);
    WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0);
    break;
  }
  case WM_KEYUP: {
    sprintf(output, "检测到WM_KEYUP消息,键码值:%d.该按键被放开\n", wParam);
    WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0);
    break;
  }
  //鼠标消息
  case WM_LBUTTONDOWN: {
    sprintf(output, "检测到WM_LBUTTONDOWN消息,鼠标左键被按下。\n");
    WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0);
    break;
  }
  case WM_LBUTTONUP: {
    sprintf(output, "检测到WM_LBUTTONUP消息,鼠标左键被放开。\n");
    WriteConsole(g_hOUTPUT, output, strlen(output),0,0);
    break;
  }
  case WM_RBUTTONDOWN: {
    sprintf(output, "检测到WM_RBUTTON消息,鼠标右键被按下。\n");
    WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0);
    break;
  }
  case WM_RBUTTONUP: {
    sprintf(output, "检测到WM_RBUTTON消息,鼠标右键被放开。\n");
    WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0);
  }
  case WM_MOUSEMOVE: {
    sprintf(output, "检测到WM_MOUSEMOVE消息,鼠标移动中,鼠标位置(%d,%d).\n", LOWORD(lParam), HIWORD(lParam));
    WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0);
    break;
  }
  case WM_MOUSEWHEEL: {
    sprintf(output, "鼠标滚轮滚动中,偏移量:%d,鼠标当前位置(%d,%d)\n",HIWORD(wParam), LOWORD(lParam), HIWORD(lParam));
    WriteConsole(g_hOUTPUT, output, strlen(output), 0, 0);
    break;
  }
  }
  return DefWindowProc(hwnd, uMsg, wParam, lParam);
}

我们来看看处理效果:

相关文章
|
13天前
|
Windows
windows 11 恢复右键传统菜单
windows 11 恢复右键传统菜单
|
3天前
|
Windows
[原创]用MASM32编程获取windows类型
[原创]用MASM32编程获取windows类型
|
4天前
|
JavaScript 前端开发 API
MASM32编程通过WMI获取Windows计划任务
MASM32编程通过WMI获取Windows计划任务
|
3天前
|
网络协议 API Windows
MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾
MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾
|
5天前
|
API Windows
MASM32编程获取Windows当前桌面主题名
MASM32编程获取Windows当前桌面主题名
|
2月前
|
数据库 Windows
超详细步骤解析:从零开始,手把手教你使用 Visual Studio 打造你的第一个 Windows Forms 应用程序,菜鸟也能轻松上手的编程入门指南来了!
【8月更文挑战第31天】创建你的第一个Windows Forms (WinForms) 应用程序是一个激动人心的过程,尤其适合编程新手。本指南将带你逐步完成一个简单WinForms 应用的开发。首先,在Visual Studio 中创建一个“Windows Forms App (.NET)”项目,命名为“我的第一个WinForms 应用”。接着,在空白窗体中添加一个按钮和一个标签控件,并设置按钮文本为“点击我”。然后,为按钮添加点击事件处理程序`button1_Click`,实现点击按钮后更新标签文本为“你好,你刚刚点击了按钮!”。
98 0
|
28天前
|
网络安全 虚拟化 Windows
windows 11安装openSSH server 遇到的"kex_exchange_identification: read: Connection reset"问题
windows 11安装openSSH server 遇到的"kex_exchange_identification: read: Connection reset"问题
|
2月前
|
PHP Windows
【Azure App Service for Windows】 PHP应用出现500 : The page cannot be displayed because an internal server error has occurred. 错误
【Azure App Service for Windows】 PHP应用出现500 : The page cannot be displayed because an internal server error has occurred. 错误
|
2月前
|
开发框架 .NET API
Windows Server 2022 安装IIS 报错 访问临时文件夹 C:\WINDOWS\TEMP\3C 读取/写入权限 错误: 0x80070005
Windows Server 2022 安装IIS 报错 访问临时文件夹 C:\WINDOWS\TEMP\3C 读取/写入权限 错误: 0x80070005
81 0