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);
}

我们来看看处理效果:

相关文章
|
3月前
|
Windows
windows 11 恢复右键传统菜单
windows 11 恢复右键传统菜单
202 27
|
3月前
|
网络协议 API Windows
MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾
MASM32编程调用 API函数RtlIpv6AddressToString,windows 10 容易,Windows 7 折腾
|
3月前
|
Windows
[原创]用MASM32编程获取windows类型
[原创]用MASM32编程获取windows类型
|
2月前
|
Windows
.NET 隐藏/自定义windows系统光标
【10月更文挑战第20天】在.NET中,可以使用`Cursor`类来控制光标。要隐藏光标,可将光标设置为`Cursors.None`。此外,还可以通过从文件或资源加载自定义光标来更改光标的样式。例如,在表单加载时设置`this.Cursor = Cursors.None`隐藏光标,或使用`Cursor.FromFile`方法加载自定义光标文件,也可以将光标文件添加到项目资源中并通过资源管理器加载。这些方法适用于整个表单或特定控件。
|
3月前
|
JavaScript 前端开发 API
MASM32编程通过WMI获取Windows计划任务
MASM32编程通过WMI获取Windows计划任务
|
3月前
|
API Windows
MASM32编程获取Windows当前桌面主题名
MASM32编程获取Windows当前桌面主题名
|
4月前
|
数据库 Windows
超详细步骤解析:从零开始,手把手教你使用 Visual Studio 打造你的第一个 Windows Forms 应用程序,菜鸟也能轻松上手的编程入门指南来了!
【8月更文挑战第31天】创建你的第一个Windows Forms (WinForms) 应用程序是一个激动人心的过程,尤其适合编程新手。本指南将带你逐步完成一个简单WinForms 应用的开发。首先,在Visual Studio 中创建一个“Windows Forms App (.NET)”项目,命名为“我的第一个WinForms 应用”。接着,在空白窗体中添加一个按钮和一个标签控件,并设置按钮文本为“点击我”。然后,为按钮添加点击事件处理程序`button1_Click`,实现点击按钮后更新标签文本为“你好,你刚刚点击了按钮!”。
324 0
|
27天前
|
网络安全 Windows
Windows server 2012R2系统安装远程桌面服务后无法多用户同时登录是什么原因?
【11月更文挑战第15天】本文介绍了在Windows Server 2012 R2中遇到的多用户无法同时登录远程桌面的问题及其解决方法,包括许可模式限制、组策略配置问题、远程桌面服务配置错误以及网络和防火墙问题四个方面的原因分析及对应的解决方案。
|
1月前
|
监控 安全 网络安全
使用EventLog Analyzer日志分析工具监测 Windows Server 安全威胁
Windows服务器面临多重威胁,包括勒索软件、DoS攻击、内部威胁、恶意软件感染、网络钓鱼、暴力破解、漏洞利用、Web应用攻击及配置错误等。这些威胁严重威胁服务器安全与业务连续性。EventLog Analyzer通过日志管理和威胁分析,有效检测并应对上述威胁,提升服务器安全性,确保服务稳定运行。
|
1月前
|
监控 安全 网络安全
Windows Server管理:配置与管理技巧
Windows Server管理:配置与管理技巧
76 3