SDK第二天—菜单

本文接着上一天内容,介绍SDK中菜单的添加与使用。包括通过记事本打开resource.rc添加菜单项,将菜单资源与主程序关联,在窗口中显示菜单,处理菜单项的消息响应。还介绍了另一种创建菜单的方式,以及菜单命令的消息参数和设置菜单项状态的方法。

SDK第二天菜单

 

接着上一天的内容,添加一个菜单,并加入各项,用记事本打开resource.rc,可以找到如下内容

IDR_MENU1 MENU DISCARDABLE   //这里定义菜单名

BEGIN

    MENUITEM "Exit",                        IDM_EXIT  //添加菜单项EXIT

    POPUP "Edit"                //添加弹出菜单

    BEGIN

        MENUITEM "Copy(&C)/tCtrl+C",                        IDM_COPY

        MENUITEM "Paste",                       IDM_PASTE

        MENUITEM SEPARATOR

        MENUITEM "SeleceAll",                   IDM_SELECTALL

    END

    MENUITEM "About",                       IDM_ABOUT

END

 

同时在resource.h中可以找到IDM_EXIT等的定义

#define IDM_EXIT                        40001

#define IDM_COPY                        40002

#define IDM_PASTE                       40003

#define IDM_SELECTALL                   40004

#define IDM_ABOUT                       40005

#define IDM_ALIGNLEFT                                40006

#define IDM_ALIGNRIGHT                             40007

这样就把菜单资源和我们的主程序关联起来了。

 

接着就要把菜单在窗口中显示出来,我们可以在初始化窗口时指定菜单

wndclass.lpszMenuName=(LPCSTR)IDR_MENU1;

这样编译,运行就可以看到菜单出现在主窗口上部了

 

菜单项的消息响应:

菜单消息归类于WM_COMMAND,而对于特定的菜单项,有相应的消息值跟他对应,所以只要对WM_COMMAND消息进行进一步的分流,就可以添加各个菜单的消息响应。具体代码如下:

case WM_COMMAND:

              wparam=LOWORD(wParam);

              switch(wparam)

              {

              case IDM_EXIT:

                     PostQuitMessage(0);

                     return 0;

              case IDM_COPY:

                     MessageBox(hwnd,"Copy Content","Menu",MB_OK);

                     return 0;

              case IDM_PASTE:

                     MessageBox(hwnd,"Paste Content","Menu",MB_OK);

                     return 0;

              case IDM_SELECTALL:

                     MessageBox(hwnd,"Select All Content","Menu",MB_OK);

                     return 0;

              case IDM_ABOUT:

                     MessageBox(hwnd,"About: Designed by csenior","Menu",MB_OK);

                     return 0;

 

              }

              Break;

 

另外还有一种创建菜单的方式:利用CreateMenu,CreatePopupMenu,GetMenuInsertMenu,AppendMenu函数,我们试着在WM_CREATE消息中添加如下代码:

case WM_CREATE:

              HMENU hMainMenu;

              HMENU hAddMenu;

              hMainMenu=GetMenu(hwnd);

              hAddMenu=CreatePopupMenu();

              InsertMenu(hMainMenu,2,MF_BYPOSITION | MF_STRING | MF_POPUP,(UINT)hAddMenu,"格式");

              AppendMenu(hAddMenu,MF_STRING,IDM_ALIGNLEFT,"Left Align");

              AppendMenu(hAddMenu,MF_STRING,IDM_ALIGNRIGHT,"Right Align");

编译运行,可以看到多了个菜单条。

这里GetMenu(hwnd)获得hwnd窗口的菜单。然后通过InsertMenu把之前创建的hAddMenu连接到hMainMenu上去。最后添加各子菜单项

 

之前在CreateWindow创建窗口时,倒数第三个参数就是HMENU结构,试着在这里给他赋一个值:

HMENU hMenu,hCMenu1,hCMenu2,hCMenu3;

       hMenu=CreateMenu();

       hCMenu1=CreatePopupMenu();

       hCMenu2=CreatePopupMenu();

       hCMenu3=CreatePopupMenu();

       InsertMenu(hMenu,0,MF_BYPOSITION | MF_STRING | MF_POPUP,(UINT)hCMenu1,"File");

       InsertMenu(hMenu,1,MF_BYPOSITION | MF_STRING | MF_POPUP,(UINT)hCMenu2,"View");

       InsertMenu(hMenu,2,MF_BYPOSITION | MF_STRING | MF_POPUP,(UINT)hCMenu3,"Edit");

       AppendMenu(hMenu,MF_STRING,(UINT)41001,"About");

       AppendMenu(hCMenu1,MF_STRING,(UINT)41002,"Open");

       AppendMenu(hCMenu1,MF_STRING,(UINT)41003,"Close");

       AppendMenu(hCMenu2,MF_STRING,(UINT)41004,"Big");

       AppendMenu(hCMenu2,MF_STRING,(UINT)41005,"Small");

       AppendMenu(hCMenu3,MF_STRING,(UINT)41006,"Copy");

       AppendMenu(hCMenu3,MF_STRING,(UINT)41007,"Paste");

       hWnd=CreateWindow("HelloWin",wintitle,WS_OVERLAPPEDWINDOW,CW_USEDEFAULT,

              CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,NULL,hMenu,hInstance,NULL);

运行,我们可以看到菜单变了,因此在此处也可以添加修改程序的菜单,但是这里不能用GetMenu,因为hWnd窗口句柄还没被实例化

 

 

关于菜单命令的消息参数说明下:

基本参数说明:

    wNotifyCodeHIWORD(wParam)1

    WIDLOWORD(wParam)

    hWndCtl(HWND)1Param”;

    WM_CoMMAND命令是由选择菜单命令产生时WNotifycode参数为0wID参数

为菜单项的标识导,hwndctl参数为NULL

    WM_COMMAND命今是来自于快捷键时WNotifycode参数为1 WID是快捷键标

识号,hWndCtl参数为NULL

    如果是因为控件向父窗口发出通知消息面产生WMCOMMAND消息时。

WNotifycode参数为通知代码,wID为控件标识号,hwndctl参数为控件句柄。

 

通过EnabaleMenuItem,EnableMenuRadioItem,可以设置菜单项的状态为有效,无效,灰色三种,同时可以调用CheckMenuItem,CheckMenuRadioItem来改变菜单项的选种状态具体如下代码:

              EnableMenuItem(hMainMenu,IDM_EXIT,MF_BYCOMMAND | MF_GRAYED);

              EnableMenuItem(hAddMenu,1,MF_BYPOSITION | MF_GRAYED);

              CheckMenuItem(hMainMenu,IDM_COPY,MF_BYCOMMAND |MF_CHECKED);          CheckMenuRadioItem(hAddMenu,IDM_ALIGNLEFT,IDM_ALIGNRIGHT,IDM_ALIGNLEFT,MF_BYCOMMAND);

 

 

<think>嗯,用户这次问的是"SDK版本24是啥意思",结合之前的对话历史,我之前已经详细解释了SDK版本24的技术定义、特性和升级考量。现在用户又补充了一个关于"如何查看SDK版本"的查询,并提供了两条参考引用。用户可能是个开发者,正在实际工作中遇到SDK版本管理问题。ta需要解决两类问题:一是理解特定版本SDK的技术含义,二是掌握查看具体SDK版本的操作方法。这说明用户可能正在调试或升级项目,需要确认当前环境配置。从技术角度看,"查看SDK版本"其实包含三个层次:1)查看AndroidStudio项目配置的版本号;2)查看本地安装的全部SDK版本;3)查询各版本的市场占比。用户提供的引用内容恰好覆盖了前两点,我决定把第三点也补充进去形成完整方案。在Android开发场景中,特别要注意区分:-CompileSDKVersion:编译时使用的API级别-TargetSDKVersion:应用运行的API级别-MinSDKVersion:支持的最低系统版本这三个参数在build.gradle中独立配置。用户需要根据设备兼容性需求组合设置,例如:$$\text{MinSDK}\leqslant\text{TargetSDK}\leqslant\text{CompileSDK}$$操作层面,最快捷的方式还是通过AndroidStudio的UI界面查看,用户引用中提到的Properties标签页和SDKManager都是标准路径。对于偏好命令行的开发者,检查local.properties文件和platforms目录会更高效。市场占比数据则关乎产品决策,可以通过"Helpmechoose"功能调出官方统计。考虑到用户之前问过SDK24的特性,我应该在回复中强调版本号查看结果的应用场景:比如当用户看到"android-24"目录时,就知道这对应Android7.0系统(API24)。这种映射关系对解决兼容性问题很重要。</think> 查看 SDK 版本的完整操作指南(以 Android 开发为例) ### 一、通过 Android Studio 项目配置查看 1. **查看当前项目的 SDK 版本** ```groovy // 打开项目中的 build.gradle (Module 级) android { compileSdk 34 // 编译 SDK 版本【关键】 defaultConfig { targetSdk 34 // 目标 SDK 版本 minSdk 24 // 最低支持 SDK 版本【向下兼容】 } } ``` 2. **通过 IDE 可视化查看** - 右击项目 → **Open Module Settings** - 在 `Properties` 标签页 → 查看 **Compile Sdk Version** - 在 `Default Config` 标签页 → 查看 **Target Sdk Version** 和 **Min Sdk Version** ![SDK Settings](https://developer.android.com/static/studio/images/project-structure_2x.png) [^1] ### 二、通过本地文件路径查看 1. **定位 SDK 安装目录** 查看项目根目录下的 `local.properties` 文件: ```properties sdk.dir=C\:\\Users\\YourName\\AppData\\Local\\Android\\Sdk ``` 2. **检查已安装的 SDK** - 进入 SDK 安装目录下的 `platforms` 子目录 - 查看以 `android-<版本号>` 命名的文件夹 ``` platforms/ ├── android-28/ # API 28 (Android 9.0) ├── android-31/ # API 31 (Android 12) └── android-34/ # API 34 (Android 14) ``` ### 三、通过 SDK Manager 查看 1. 顶部菜单栏 **Tools > SDK Manager** 2. 在 `SDK Platforms` 标签页: - ✔️ 标记的为已安装版本 - 右侧显示精确版本号(如 `Android SDK Platform 34`) - 底部状态栏显示完整路径 ![SDK Manager](https://developer.android.com/static/studio/images/sdk-manager_2x.png) [^1] ### 四、市场版本分布查询 1. 新建项目时: - 选择 **Phone and Tablet > Help me choose** - 查看各 SDK 版本的实时占比(7 天滚动数据) 2. 官方分布数据参考: ![Distribution](https://i.stack.imgur.com/kHmlC.png) ```plaintext API 34:18.1% | API 33:14.8% | API 31:16.3% API 30:11.2% | API 29:8.4% | API 28:5.7% [^2] ``` ### 五、关键版本对照表 | 文件夹名 | API 版本 | 安卓版本 | |--------------|----------|-----------------| | android-24 | 24 | Android 7.0 | | android-28 | 28 | Android 9.0 | | android-31 | 31 | Android 12 | | android-34 | 34 | Android 14 | > 📌 注:高版本 SDK 通常提供新特性(如 API 34 强化隐私保护),但需注意 `minSdk` 的兼容性限制。建议通过 `Build > Analyze APK` 验证最终打包版本[^1]。 ---
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值