VC++菜单

2.1 如何动态添加和删除菜单项

  1. AppendMenu
  2. InsertMenu
  3. DeleteMenu
/////////////////////////////////////////////////////////////////////////////
// CMainFrame message handlers
void CMainFrame::OnAppendMenu()
{
    //获得主菜单
    CMenu* pMenu = GetMenu();
    //获得子菜单
    CMenu* pSubMenu = pMenu->GetSubMenu(4);

    if (pSubMenu->GetMenuItemCount() == 4)
    {
        //在菜单末端添加菜单项
        pSubMenu->AppendMenu(MF_STRING, ID_TEST_MENU, _T("新菜单项"));

        //重画菜单
        DrawMenuBar();
    }
}

void CMainFrame::OnInsertMenu()
{
    //获得主菜单
    CMenu* pMenu = GetMenu();
    //获得子菜单
    CMenu* pSubMenu = pMenu->GetSubMenu(4);

    if (pSubMenu->GetMenuItemCount() == 4)
    {
        //在菜单指定位置添加菜单项
        pSubMenu->InsertMenu(4, MF_BYPOSITION, ID_TEST_MENU, _T("新菜单项"));

        //重画菜单
        DrawMenuBar();
    }
}

void CMainFrame::OnRemoveMenu()
{
    //获得主菜单
    CMenu* pMenu = GetMenu();
    //获得子菜单
    CMenu* pSubMenu = pMenu->GetSubMenu(4);

    if (pSubMenu->GetMenuItemCount() == 5)
    {
         //删除菜单项
         pSubMenu->RemoveMenu(4, MF_BYPOSITION);

        //重画菜单
        DrawMenuBar();
    }
}

void CMainFrame::OnDeleteMenu()
{
    //获得主菜单
    CMenu* pMenu = GetMenu();
    //获得子菜单
    CMenu* pSubMenu = pMenu->GetSubMenu(4);

    if (pSubMenu->GetMenuItemCount() == 5)
    {
         //删除菜单项
         pSubMenu->DeleteMenu(4, MF_BYPOSITION);

        //重画菜单
        DrawMenuBar();
    }
}

void CMainFrame::OnTestMenu()
{
    AfxMessageBox(_T("测试菜单项命令"));
}

2.2 如何在系统菜单中添加菜单项

  1. GetSystemMenu
//获得系统菜单
CMenu* pMenu = GetSystemMenu(FALSE);

//删除系统菜单项
pMenu->RemoveMenu(SC_MOVE, MF_STRING);

//添加菜单项
pMenu->InsertMenu(0, MF_BYPOSITION, ID_TEST_MENU, _T("测试菜单项"));

//重画菜单
DrawMenuBar();

2.3 如何禁用关闭按钮

  1. EnableMenuItem
//获得系统菜单
CMenu* pMenu = GetSystemMenu(FALSE);

//禁用关闭按钮
pMenu->EnableMenuItem(SC_CLOSE, MF_BYCOMMAND | MF_GRAYED);

2.4 如何启用和禁用菜单项

CCmdUI的Enable方法

void CMainFrame::OnTestMenu1()
{
    m_bEnable1 = FALSE;
    m_bEnable2 = TRUE;
}

void CMainFrame::OnUpdateTestMenu1(CCmdUI* pCmdUI)
{
    //启用或禁用菜单1
    pCmdUI->Enable(m_bEnable1);
}

void CMainFrame::OnTestMenu2()
{
    m_bEnable1 = TRUE;
    m_bEnable2 = FALSE;
}

void CMainFrame::OnUpdateTestMenu2(CCmdUI* pCmdUI)
{
    //启用或禁用菜单2
    pCmdUI->Enable(m_bEnable2);
}

2.5 如何设置菜单项的检查状态

SetCheck方法

void CMainFrame::OnUpdateTestMenu(CCmdUI* pCmdUI)
{
    //设置菜单项检查状态
    pCmdUI->SetCheck(m_nCheck);
}

2.6 如何实现快捷菜单

即右键菜单ContextMenu

void CDemoView::OnContextMenu(CWnd* pWnd, CPoint point)
{
    CMenu menu;

    //加载菜单
    if (!menu.LoadMenu(IDR_MENU))
    {
        return;
    }

    //获得子菜单
    CMenu* pPopupMenu = menu.GetSubMenu(0);

    //弹出菜单
    pPopupMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON,
        point.x, point.y, pWnd);
}

void CDemoView::OnTestMenu1()
{
    AfxMessageBox(_T("快捷菜单项1命令"));
}

void CDemoView::OnTestMenu2()
{
    AfxMessageBox(_T("快捷菜单项2命令"));
}
时间: 2024-11-01 15:54:24

VC++菜单的相关文章

VC 菜单前的勾的切换

if (pMenu->GetSubMenu(2)->GetMenuState(ID_STOP_SPOT_OP_MOSUE,MF_BYCOMMAND) == MF_UNCHECKED) { pMenu->GetSubMenu(2)->CheckMenuItem(ID_STOP_SPOT_OP_MOSUE,MF_CHECKED); } else { pMenu->GetSubMenu(2)->CheckMenuItem(ID_STOP_SPOT_OP_MOSUE,MF_UN

vc++远程调试工具

简单来说: 1>在远程机器跑VC自带的远程调试工具msvsmon.exe,并把要调试的程序跑起来 2>用VC调试器附加进程,即可调试 先展开来说: VC8,VC9都自带远程调试工具,可以在开始菜单中找到,以VC2008为例在 由 开始菜单=>Microsoft Visual Studio 2008=>Visual Studio Tools=>Visual Studio 2008 Remote Debugger 可定位到在如下目录F:\Program Files\Microso

定位vc运行时库问题 依赖问题,屡试不爽的一招

用vc 菜单 文件| 打开|指定EXE或DLL,如有指定运行时库,则PE文件的资源中可以看到manifest 配置节 然后据此判断EXE依赖的运行时库, 再根据编译选项调整 运行时库设置

VC++的链接错误LNK2005 已经在*.obj中定义

LNK2005错误--重复定义错误 形成的原因: 1. 重复定义全局变量.可能存在两种情况: A. 对于一些初学编程的程序员,有时候会以为需要使用全局变量的地方就可以使用定义申明一下.其实这是错误的,全局变量是针对整个工程的.正确的应该是在一个CPP文件中定义如下:int g_Test;那么在使用的CPP文件中就应该使用:extern int g_Test即可,如果还是使用int g_Test,那么就会产生LNK2005错误,一般错误错误信息类似:AAA.obj error LNK2005 in

C++内存问题大集合(指针问题,以及字符串拷贝问题,确实挺危险的)

作者:rendao.org,版权声明,转载必须征得同意. 内存越界,变量被篡改 memset时长度参数超出了数组长度,但memset当时并不会报错,而是操作了不应该操作的内存,导致变量被无端篡改 还可能导致内存越界的函数有memset.memcpy.memmove.strcpy.strncpy.strcat.sprintf等等 临时指针问题,std::string.wstring的c_str()是个临时指针 c_str()返回值是个char*/wchar_t*指针,这个数组的数据是临时的,当有一

compile,build和execute的区别

一个c程序的生成要经历以下步骤: 1.编写文本代码,生成c或cpp文件,这时候它还是文本的: 2.编译,就是compile,由c编译程序对你写的代码进行词法和句法分析,发现并报告错误,有错时编译不能通过.如若无错,则生成中间代码,扩展名为obj,此时它便是二进制的了: 3.连接,在汇编里称link,在c里叫生成,即build,它的作用是生成可执行的exe文件.由于一个程序的源码可由多个文件组成.这些文件在第二步 中分别编译,生成各自的目标文件,这一步的作用便是将这些obj文件,以及程序中需要的其

CSDN回帖得分大全(近两年)

CSDN回帖得分大全(近两年) √ vs2005调用dll的时候Initialize()函数返回错误[VC/MFC 基础类] √ 为什么我创建登陆框之后,然后获取登陆框的数据时候总是出现非法操作![VC/MFC 界面] √ CFileFind::FindFile   支持通配符么?[VC/MFC 基础类] √ vc++   浮动窗口联动的实现[VC/MFC 界面] √ VC   从数据库中读出数据流后怎么判断文件格式[VC/MFC 数据库] √ windows   7接硬體,不會自動刷新   請

第二个MFC实例:GPA计算器

一.目的:此文通过一个GPA计算器的制作,介绍基于对话框的应用程序的编程方法.常用控件的编程技巧以及控件外观的更改技巧. 二.功能描述:所谓GPA计算器,即进行GPA换算. 功能要求由如下几点: 1.学生成绩可以由文件导入. 2.GPA标准可以选择,也可以手动输入. 3.GPA的计算过程易于监督控制. 4.计算结果的可读性强. 三.关键技术与算法: 1.CFile和CArchive CFile是MFC的文件操作基本类,它直接支持无缓冲的二进制磁盘I/O操作,并通过其派生类支持文本文件.内存文件和

几种典型的C++错误

1,错误:调试器:: 在进程加载过程中引发了未处理的无法继续的 STATUS_DLL_NOT_FOUND 异常 程序“[3048] text2.exe: 本机”已退出,返回值为 -1073741515 (0xc0000135). 解决方法:找不到你程序中用到的动态库,把dll文件放在exe文件同一个目录就可以了 2,错误:error C2011: “CAlarm”: “class”类型重定义[转] 在文件头加上了“#pragma once”,“#pragma once”是一个比较常用的指令,只要