Visual Studio 2010中GetMenu()和GetSubMenu(0)引发异常的一个简单解决方法

这里说的是SDI的情况,如果在vs2010里面按着默认选项创建一个单文档工程,

 

 

 

然后想做一件事情 ,就是把一个默认的子菜单的一项钩选,

 

 

代码如下 :

GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_FILE_NEW,MF_BYCOMMAND|MF_CHECKED);

加在CMainFrame::Oncreate()里面,整个程序就会崩溃,出现的异常类似如此:Unhandled exception at 0x58aba12c (mfc100ud.dll) in menu1.exe: 0xC0000005: Access violation reading location 0x00000004.

发了不少帖子,也查了很多资料,却很少有明确的解决方法。

 

不过可以确定的是,在执行这段代码的时候,Menu并没有生成。因为采用断点来检测的话,此时的GetMenu返回值不是一个正常的地址。为什么会这样呢?

 

后来才发现visual studio2010里默认采用的是Menu格式在OnCreate()末端并未生成。vs2010默认采用的是增加了扩展功能的Menu,所以调用GetMenu()会得到空指针。

 

最原始的解决方法是采用回原来的Menu格式。就在新建工程的一个对话框中选择回原始的菜单模式即可,如下图:

 

 

不过经过更改后编译会出现两个错误,是关于:

ON_COMMAND(ID_FILE_PRINT_DIRECT, &CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, &CView::OnFilePrintPreview)

 

两句代码是关于打印功能的。如果不涉及这方面的功能,可以直接把这两句话注释掉。然后在CMainFrame::OnCreate()末尾加上GetMenu()->GetSubMenu(0)->CheckMenuItem(ID_FILE_NEW,MF_BYCOMMAND|MF_CHECKED);

程序就可以顺利通过了。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是一个简单的使用Java编写的餐饮管理系统的示例代码: ```java import java.util.ArrayList; import java.util.List; import java.util.Scanner; class MenuItem { private String name; private double price; public MenuItem(String name, double price) { this.name = name; this.price = price; } public String getName() { return name; } public double getPrice() { return price; } } class Order { private int tableNumber; private List<MenuItem> items; public Order(int tableNumber) { this.tableNumber = tableNumber; this.items = new ArrayList<>(); } public void addItem(MenuItem item) { items.add(item); } public void removeItem(MenuItem item) { items.remove(item); } public double getTotalAmount() { double total = 0.0; for (MenuItem item : items) { total += item.getPrice(); } return total; } public void display() { System.out.println("Table Number: " + tableNumber); System.out.println("Items:"); for (MenuItem item : items) { System.out.println("- " + item.getName() + ": $" + item.getPrice()); } System.out.println("Total Amount: $" + getTotalAmount()); } } class Restaurant { private List<MenuItem> menu; private List<Order> orders; public Restaurant() { this.menu = new ArrayList<>(); this.orders = new ArrayList<>(); } public void addMenuItem(MenuItem item) { menu.add(item); } public void displayMenu() { System.out.println("Menu:"); for (MenuItem item : menu) { System.out.println("- " + item.getName() + ": $" + item.getPrice()); } } public void placeOrder(Order order) { orders.add(order); } public void displayOrders() { System.out.println("Orders:"); for (Order order : orders) { order.display(); System.out.println("-------------------"); } } } public class RestaurantManagementSystem { public static void main(String[] args) { Restaurant restaurant = new Restaurant(); // 添加菜单项 restaurant.addMenuItem(new MenuItem("Burger", 10.99)); restaurant.addMenuItem(new MenuItem("Fries", 4.99)); restaurant.addMenuItem(new MenuItem("Coke", 2.99)); // 显示菜单 restaurant.displayMenu(); Scanner scanner = new Scanner(System.in); // 下订单 Order order1 = new Order(1); System.out.println("Select items for Order 1 (enter item numbers, -1 to finish):"); while (true) { int itemNumber = scanner.nextInt(); if (itemNumber == -1) { break; } MenuItem selectedItem = restaurant.getMenu().get(itemNumber-1); order1.addItem(selectedItem); } restaurant.placeOrder(order1); Order order2 = new Order(2); System.out.println("Select items for Order 2 (enter item numbers, -1 to finish):"); while (true) { int itemNumber = scanner.nextInt(); if (itemNumber == -1) { break; } MenuItem selectedItem = restaurant.getMenu().get(itemNumber-1); order2.addItem(selectedItem); } restaurant.placeOrder(order2); // 显示订单 restaurant.displayOrders(); } } ``` 这个示例代码实现了一个简单的餐饮管理系统,包括菜单管理、下订单和显示订单等功能。你可以根据需要进行进一步的修改和扩展。运行这段代码,你可以根据菜单项的编号选择菜单,创建订单并显示订单信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值