1
当试图动态实现菜单在C没有资源文件++矿的应用与类似下面的界面,我遇到了一个问题:C++ - WINAPI - 递归创建菜单?
Menu menu_main__ = {
Menu("File", {
Menu("Save Configuration", {}),
Menu("Save Configuration As...", {}),
Menu(nullptr, {}),
Menu("Something", {
Menu("Yay!", {})
})
}),
Keybutter::Menu("Help", {
Menu("Contents", {}),
Menu(nullptr, {}),
Menu("About", {}),
})
};
下面的是菜单类的构造函数:
Menu(Menu const& menu_) = default;
Menu(Menu&& menu_) = default;
Menu(std::initializer_list<Menu>&& menus_sub__);
Menu(std::nullptr_t const&, std::initializer_list<Menu>&& menus_sub_);
Menu(std::string&& name_, std::initializer_list<Menu>&& menus_sub_);
现在,我想通过递归实现菜单创建的唯一可行方法就是使用递归。我结束了我的窗口类内使用lambda递归,如下所示:
std::vector<Menu> menus;
static unsigned int id_menu_sub = 0;
std::function<void (HMENU const&, std::string const&, std::vector<Menu> const&)> create_menus_sub__;
create_menus_sub__ = [&](HMENU const& menu_, std::string const& name_menu_, std::vector<Menu> const& menu_sub_) -> void{
if(menu_sub_.empty()){
return;
}
else{
HMENU&& menu_sub__ = CreatePopupMenu();
for(unsigned int i__ = 0; i__ < menu_sub_.size(); ++i__){
if(menu_sub_[i__].menus_sub().empty()){
if(menu_sub_[i__].name.empty()){
AppendMenu(menu_sub__, MF_SEPARATOR, ++id_menu_sub, NULL);
}
else{
AppendMenu(menu_sub__, (menu_sub_[i__].menus_sub().empty()) ? MF_STRING : MF_POPUP | MF_STRING, ++id_menu_sub, menu_sub_[i__].name.c_str());
}
}
else{
create_menus_sub__(menu_, menu_sub_[i__].name, menu_sub_[i__].menus_sub());
}
}
AppendMenu(menu_, MF_POPUP | MF_STRING, reinterpret_cast<UINT>(menu_sub__), name_menu_.c_str());
}
};
for(unsigned int i__ = 0; i__ < menus.size(); ++i__){
HMENU&& menu__ = CreateMenu();
create_menus_sub__(menu__, menus[i__].name, menus[i__].menus_sub());
SetMenu(handle_window, menu__);
}
原来,它没有按预期工作。下面是结果:而不是被在“文件”菜单项
“东西”,现在是在错误的位置。这是我尝试用一个好的,但有些可疑的C++接口动态地创建菜单。我如何使用递归来递归地制作菜单?我的代码如何修复?我希望我提供了足够的信息。
谢谢你,这个伎俩。我可能会用一个改进的代码片段上传答案。我可以很好地理解C++(11)中的新特性并使用它们,但是更重要的数学概念,如递归,我很难理解,更不用说在代码中实现了。事实上,这可能是我第一次利用递归的优势。不是开玩笑!我更喜欢迭代,但它并不总是一个理想的解决方案,就像在这种情况下一样。 – Helixirr