`
emowuyi
  • 浏览: 1540894 次
文章分类
社区版块
存档分类
最新评论

windowsSDK 菜单资源浅谈

 
阅读更多

这几天在看菜单,今天自己动手写了一下,出现了一些错误。


首先我先自己简单的写了一个只包含菜单资源的文件:


写完以后我新建一个资源文件,然后在里面添加菜单资源。

接下来我编辑菜单如下图所示:

注意一下系统默认的菜单ID是 IDR_MENU1

我创建的4个popup的初始ID是ID_FILE_NEW40001

ID_FILE_OPEN40002

ID_FILE_SAVE40003

ID_FILE_EXIT

然后我尝试更改ID,把数字给去掉

ID_FILE_NEW

ID_FILE_OPEN

ID_FILE_SAVE

ID_FILE_EXIT

一编译,发现错误提示说 ID_FILE_NEW

ID_FILE_OPEN

ID_FILE_SAVE

全部找不到。


然后我去resource.h的文件里面去找,发现宏定义里面竟然没有把我改好以后的ID变掉,还是

ID_FILE_NEW40001

ID_FILE_OPEN40002

ID_FILE_SAVE40003

那么我心里想,就手工把后面的数字去掉吧 -_-


然后再次编译,错误提示说 ID_FILE_NEW redefinition

ID_FILE_OPEN redefinition

ID_FILE_SAVE redefinition

这就奇怪了,为什么会说 重定义错误呢?

我在网上查了写有关redefinition 错误的资料

redefinition的错误
原因一般是由于你调用的函数没有在前面声明,而系统会默认为int型
而在后面你可能又写了函数体,但定义类型又不是int,所以报redefinition的错误
解决办法是恢复h文件,或在文件前面添加报redefinition错误的函数的声明

最后再看了下代码,终于发现问题所在了。

wndclass.lpszMenuName = szAppName;

在定义窗口类的时候,我把菜单的名字和窗口的名字写做一样了,其实系统默认的窗口名字是IDR_MENU1

所以在编译资源的时候,.h文件根本就不会改变!

找到原因了,现在我有两种改进的方法:

1.将wndclass.lpszMenuName 命名为系统默认的 IDR_MENU1

2. 将菜单名称变成ownmenu

但是依旧要注意,当你每次改变了菜单ID的时候,最好同时检查resource.h里面有没有发生改变,否则就会出现我上面说的错误哦!!~~~


下面再看看菜单引用的3种方法吧,其实自己一开始的时候是把下面的第一种方法和第二种方法搞混了,才会导致上面的错误。

第一种方法:
在注册窗口类的时候就指定要菜单,在WNDCLASSEX结构体的成员lpszMenuName中,假设我把引入菜单的叫做”MenuDemo”,
那么就可以这样引用:
TCHAR szAppName[] = TEXT (“MenuDemo”)
//code
wndclass.lpszMenuName = szAppName ;

上面这个例子是把程序名称和菜单名称做了相同的引用,用这种方法的话比较方便,比如在你的程序里面还有图标,声音或者其他的一些自定义资源的话,这种方法看起来就显得简单多了。

在这里就指定了你要的菜单,在窗口建立之前就已经包含在窗口类中了,建立窗口的时候直接就出来菜单。这种方法比较简单,所以在一般情况下都用这种方法引用菜单资源。但是这种方法有一种缺陷:由于是在窗口类中指定的,所有由该窗口类派生出的窗口都有
相同的菜单


第二种方法:
HMENU hMenu
TCHAR MenuName[] = TEXT(“MenuDemo”);
//code
hMenu = LoadMenu(hInstance,MenuName);
hWinMain = CreateWindowEx(WS_EX_CLIENTEDGE,szClassName,szCaptionMain,
WS_OVERLAPPEDWINDOW,100,100,600,400,NULL,hMenu,hInstance,NULL);
通过在CreateWindowsEx第九个参数指定要引入的菜单。CreateWindow调用中的指定菜单可以覆盖窗口类中指定的任何菜单。

第三种方法:
如果我们把CreateWindowEx第九个参数设置为NULL,并且也不在窗口类中指定NULL菜单,就可以在窗口被创建后在给窗口指定指定一个菜单:

SetMenu(hwnd,hMenu);
举个例子 ,在消息处理函数内 static HMENU hMenuFile1,hMenuFile1;
在WM_CREATE:
hInstance = (HINSTANCE)GetWindowsLong(hwnd,GWL_HINSTANCE);
hMenuFile1 = LoadMenu(hInstance,TEXT(“MenuMain1″);//举个例子
hMenuFile2 = LoadMenu(hInstance,TEXT(“MenuMain2″);面选择资源脚本多次,每个菜单都不同的名字。每当窗口过程处理WM_CREATE消息
的时候windows就会动态的白菜单资源加载到内存中去。SetMenu(hwnd,hMenu)让程序显示hMenu指向的菜单,然后你可以任意
SetMenu(hwnd,hMenuFile1)或者SetMenu(hwnd,hMenuFile2)之间切换,在windows程序设计上面通过按键来实现,这样你甚至可以多创建几个菜单。


下面我们简单地来看看.rc跟菜单资源有关的代码

当我们打开 .rc的资源文件的时候,如果你的工程里面添加了菜单资源的话,那么你可以看到类似下面这样的代码:

这里的BEGIN 和END跟Pascal程序比较像,如果大家愿意的话其实可以手工用 { 来代替BEGIN ,用 } 来代替 END。

MENUITEM "&New", ID_FILE_NEW 这里的MENUITEM还有另一个选项:POPUP

对于MENUITEM 菜单项会生成一个带有特定ID的WM_COMMAND消息,比如上面这行代码 有ID_FILE_NEW这个ID,当然我们可以在resource.h里面找到它的数字ID

对于POPUP pop-up,翻译过来以后的意思是突然出现,冒出来的意思,所以在windows编程里我们可以将它理解为"跳出来"的菜单。 该菜单项会激活一个弹出窗口,这时它没有相关联的ID

对于上面的代码,我们应该可以想象在菜单栏有File这个选项,当我们点击File的时候,会弹出New,Open,Save,Exit四个选项,每一个选项当你选中后都会触发WM_COMMAND消息,我们可以把功能写在里面。






分享到:
评论

相关推荐

    Windows_SDK入门浅谈

    总之,Windows SDK为开发者提供了丰富的资源,用于构建Windows应用程序。从理解运行时环境和操作系统的基本原理,到掌握API的使用,再到编写消息处理代码,每一步都是学习过程中不可或缺的部分。尽管初学者可能会...

    Windows SDK Windows SDKWindows SDKWindows SDK

    Windows SDKWindows SDKWindows SDKWindows SDKWindows SDKWindows SDKWindows SDKWindows SDKWindows SDKWindows SDKWindows SDKWindows SDKWindows SDK

    Windows SDK入门浅谈

    Windows SDK(Software Development Kit)是微软为开发者提供的一套用于创建Windows平台应用程序的工具集,它包含了编写Windows应用程序所需的各种组件、文档、示例代码和开发工具。SDK中的主要组成部分包括: 1. ...

    Microsoft Windows SDK 7.1下载

    资源管理器是SDK中的另一个亮点,它允许开发者查看、修改和打包应用程序的资源,如图标、菜单和对话框。这对于创建用户友好的图形界面至关重要。同时,SDK还提供了用于本地化和国际化应用的工具,帮助开发者实现多...

    windows sdk v7.1a

    总的来说,Windows SDK V7.1A是Windows平台上开发者的强大工具,它包含了开发、测试和优化应用程序所需的所有必要组件,无论你是新手还是经验丰富的开发者,都可以从中获益匪浅。通过学习和使用这个SDK,你可以深入...

    windows SDK 8.1 C++

    Microsoft Windows SDK 8.1适用于windows 8.1以及Windows 7、Windows Vista、Windows Server 2012、Windows Server 2008 R2操作系统,这是由微软开发的软件开发工具包,可以轻松帮助程序创建在windows平台上的应用,...

    Windows SDK 8.1离线包

    首先,SDK中的头文件和库文件是C++和C#开发者的重要资源,它们定义了Windows API,使得开发者能够直接与操作系统交互,实现各种功能,如窗口管理、图形绘制、网络通信等。头文件(.h)包含了函数声明和结构定义,而...

    windows SDK8.1离线安装包

    Windows SDK 8.1是微软开发的一套工具和库,用于构建、调试和部署在Windows 8.1及更高版本操作系统上运行的应用程序。这个离线安装包是为了解决那些无法在线下载或需要在没有网络环境的情况下安装SDK的需求。在安装...

    windows SDK 8.1

    Microsoft Windows SDK 8.1适用于windows 8.1以及Windows 7、Windows Vista、Windows Server 2012、Windows Server 2008 R2操作系统,这是由微软开发的软件开发工具包,可以轻松帮助程序创建在windows平台上的应用,...

    Microsoft Windows SDK v6.0A

    - **资源管理**:SDK提供了资源编辑器,可以方便地处理应用程序的图标、菜单、对话框等资源。 总结来说,Microsoft Windows SDK v6.0A是Windows平台开发者的强大武器,它集成了丰富的工具、文档和示例,覆盖了从...

    windows sdk8.1安装

    windows sdk8.1 对于Visual Studio 中出现的无法找到编译器DLL,请确保正确的路径,通过安装Windows SDK8.1离线安装包即可解决。 解决windows7安装vs2013后显示不能找到windowssdkdir,以致不能编译或者链接失败的...

    Windows SDK 8.1 ISO 第一部分

    适用于 Windows 8.1 的 Windows 软件开发工具包 (SDK) 包含标头、库和工具,可用于创建在 Windows 操作系统上运行的应用。 Windows SDK 8.1 Standalone Installer Windows SDK 8.1 offline install

    windowssdk8.1.rar

    这个压缩包"windowssdk8.1.rar"包含了离线安装资源,特别适合在安装Visual Studio 2013时遇到问题的用户。Windows SDK 8.1不仅支持开发Windows 8.1应用程序,同时也兼容Windows 7及更高版本的操作系统。 SDK...

    windows SDK10.0.14393.0(vs2015)

    SDK(Software Development Kit)包含了一系列的工具、库、文档和头文件,为开发者提供了必要的资源,以便他们可以充分利用Windows 10平台的功能。 SDK中的关键组件包括: 1. **编译器和构建工具**:如Microsoft ...

    Windows-SDK-8.1_C++包

    3. 平台特定API:Windows SDK 8.1为C++提供了平台API,比如CreateWindow、CreateProcess等,使得开发者可以使用C++直接操作底层系统资源。 三、Visual Studio 2015与Windows SDK 8.1的集成 1. 支持WinRT应用开发:...

    windows开发 Windows SDK 编程

    总的来说,Windows SDK编程涵盖了Windows应用程序开发的各个方面,包括窗口管理、图形绘制、事件处理、资源管理等。开发者需要理解Windows的消息机制,熟练掌握API的使用,以及具备一定的图形编程和内存管理知识。...

    Windows SDK8.1离线安装包百度云下载

    对于Visual Studio 中出现的无法找到编译器DLL,请确保正确的路径,通过安装Windows SDK8.1离线安装包即可解决。

    windows sdk 编程例题

    Windows SDK(Software Development Kit)是微软为开发人员提供的一个核心工具集,用于创建、测试和部署在Windows操作系统上运行的应用程序。它包含了头文件、库、文档、示例代码和编译器等必要组件,使得开发者能够...

    windows sdk 窗体图标的更改

    Windows SDK(Software Development Kit)提供了丰富的工具和资源,帮助开发者构建原生的Windows应用程序。Pelles C 是一个轻量级且免费的C编译器,它也支持使用Windows SDK进行开发。 首先,我们要理解窗体图标在...

    Windows SDK 7.1 Samples.zip

    《Windows SDK 7.1 示例集》是针对Windows 7和.NET Framework 4的重要开发资源,它包含了丰富的代码示例,旨在帮助开发者更好地理解和运用SDK中的各种功能和API。这个压缩包“Windows SDK 7.1 Samples.zip”是微软...

Global site tag (gtag.js) - Google Analytics