/*
=========================================================================
主要功能:c++ winapi菜单函数示例
        
         (c++、win32 api) 张国鹏, 2021
                 
编辑工具:notepad++v7.8.2  
编译工具:tdm-gcc-5.1.0-3(32位)
编译指令:
        Notepad++快速运行代码:按F5,输入以下指令,即可编译并运行C++ WIN32程序:
        方式一:cmd /k cd /d "$(CURRENT_DIRECTORY)" & g++ -std=gnu++11 "$(FILE_NAME)" -o "$(NAME_PART)"  & "$(NAME_PART).exe
        方式二:cmd /k cd /d "$(CURRENT_DIRECTORY)" & g++ -std=gnu++11 "$(FILE_NAME)" -o "$(NAME_PART)"  -static-libgcc -lcomctl32 -lgdi32 -lcomdlg32 -lgdiplus -lwininet -lwinmm -lwinspool & "$(NAME_PART).exe

如果程序含有windows.h以外的库,则用方式二编译即可。
如果不需要CMD窗口出现,编译指令加上这句:-mwindows
编译指令加上这句:-std=gnu++11,即采用c++11编译

注意事项:本书所载代码均为ANSI格式,切勿转为UTF-8格式,否则可能造成不可预料的结果!
=========================================================================
*/        
#include <windows.h>
#include <stdio.h>

using namespace std;//注意一定要写这句

HMENU hRoot;

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{

switch (message)
    {
        case WM_LBUTTONDOWN://点击鼠标左键弹出指定菜单
        {
                    HMENU pop=GetSubMenu(hRoot,0);//取得被指定菜单激活的下拉式菜单或子菜单的句柄
                    POINT point;
                    ::GetCursorPos(&point);//得到鼠标的当前位置
                    TrackPopupMenu (pop, TPM_RIGHTBUTTON, point.x, point.y,0, hwnd, NULL) ;//在指定位置显示快捷菜单
                    //DestroyMenu (pop);//销毁指定的菜单,并释放此菜单占用的存储器
                    break;//不写这句会继续往下执行
        }
        case WM_COMMAND:   //maincommand
        {
            int wmId = LOWORD(wParam);
            switch (wmId)
            {
                case 1:
                {
                    ModifyMenu(hRoot,30011,MF_BYCOMMAND,30011,"修改后的菜单");    //修改已存在的菜单
                    InsertMenu(hRoot,30011,MF_BYCOMMAND,30010,"插入的菜单");//插入一个新菜单项到菜单里,并使菜单里其他项下移
                    
                    char temp[MAX_PATH]; 
                    GetMenuString(hRoot,1,temp,MAX_PATH,MF_BYPOSITION);//得到指定菜单项的正文字符串至指定缓冲区
                    MessageBox(NULL,temp,0,0);
                    
                    int state=GetMenuState(hRoot,30013,MF_BYCOMMAND);//该函数取得与指定菜单项相联系的菜单标志
                    if (state==MF_DISABLED) 
                    {
                        sprintf(temp,"state:%d\n",state);
                        MessageBox(NULL,temp,0,0);
                    }
                    
                    
                    DWORD mc=CheckMenuItem(hRoot,30014,MF_BYCOMMAND);//获取指定菜单的CHECKED状态
                    if (mc==MF_CHECKED)
                    {
                        MessageBox(NULL,"为选中状态",0,0);
                    }else
                    {
                        MessageBox(NULL,"未选中状态",0,0);
                    }
                    
                    mc=CheckMenuItem(hRoot,30014,MF_BYCOMMAND|MF_UNCHECKED);//将指定菜单设置为UNCHECKED
                    
                    //RemoveMenu(hRoot,30014,MF_BYCOMMAND);//删除指定菜单项
                    DeleteMenu(hRoot,30014,MF_BYCOMMAND);//删除指定菜单项
                    
                    HiliteMenuItem(hwnd,hRoot,30011,MF_BYCOMMAND|MF_HILITE);//对菜单条中的菜单项加亮或清除亮度
                    
                    
                    break;
                }
            }

break;
        }
        case WM_CONTEXTMENU://右键菜单//cd
        {
                    //Win32创建弹出菜单
                        POINT point;
                        ::GetCursorPos(&point);//得到鼠标的当前位置
                        HMENU hMenuPopup = CreatePopupMenu () ;
                            HMENU hMenuPopup1 = CreatePopupMenu () ;
                            AppendMenu(hMenuPopup1, MF_STRING, 101, "MF_STRING");
                            AppendMenu(hMenuPopup1, MF_SEPARATOR, 0, NULL) ;
                            AppendMenu(hMenuPopup1, MF_CHECKED, 102, "MF_CHECKED");
                        
                        AppendMenu(hMenuPopup, MF_STRING, 1, "MF_STRING");
                        AppendMenu(hMenuPopup, MF_SEPARATOR, 0, NULL) ;
                        AppendMenu(hMenuPopup, MF_CHECKED, 2, "MF_CHECKED");
                        AppendMenu(hMenuPopup, MF_DISABLED, 3, "MF_DISABLED");
                        AppendMenu(hMenuPopup, MF_ENABLED, 4, "MF_ENABLED");
                        AppendMenu(hMenuPopup, MF_GRAYED, 5, "MF_GRAYED");
                        AppendMenu(hMenuPopup, MF_MENUBARBREAK, 6, "MF_MENUBARBREAK");
                        AppendMenu(hMenuPopup, MF_STRING, 7, "MF_STRING");
                        AppendMenu(hMenuPopup, MF_STRING, 8, "MF_STRING");
                        AppendMenu(hMenuPopup, MF_MENUBREAK, 9, "MF_MENUBREAK");
                        AppendMenu(hMenuPopup, MF_POPUP,(LONG)hMenuPopup1, "MF_POPUP");

TrackPopupMenu (hMenuPopup, TPM_RIGHTBUTTON, point.x, point.y, 0, hwnd, NULL) ;//在指定位置显示快捷菜单
                        DestroyMenu (hMenuPopup1);
                        DestroyMenu (hMenuPopup);
                    return 0;
        }        
        case   WM_DESTROY:
                {
                    PostQuitMessage (0) ;
                    return 0 ;
                }
    }
        
    return DefWindowProc (hwnd, message, wParam, lParam) ;
        
}

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
        
                   PSTR szCmdLine, int iCmdShow)
        
{
    static char szAppName[] = "HelloWin" ;
    HWND   hwnd ;
    MSG    msg ;
    WNDCLASS wndclass ;

wndclass.style        = CS_HREDRAW | CS_VREDRAW ;
    wndclass.cbClsExtra   = 0 ;
    wndclass.cbWndExtra   = 0 ;
    wndclass.hInstance    = hInstance ;
    wndclass.hIcon        = LoadIcon (NULL, IDI_APPLICATION) ;
    wndclass.hCursor      = LoadCursor (NULL, IDC_ARROW) ;
    wndclass.hbrBackground= (HBRUSH) GetStockObject (WHITE_BRUSH) ;
    wndclass.lpszMenuName  = NULL ;
    wndclass.lpszClassName= szAppName ;
    wndclass.lpfnWndProc  = WndProc ;
    if (!RegisterClass (&wndclass))
    {
            MessageBox (  NULL, TEXT ("This program requires Windows NT!"),
                                  szAppName, MB_ICONERROR) ;
            return 0 ;
    }

//WIN32 API建立主菜单==========================================
            hRoot = CreateMenu();  
            if(!hRoot)  
                return 0;  
            HMENU pop1 = CreatePopupMenu();  
            AppendMenu(hRoot,MF_POPUP,(UINT_PTR)pop1,"文件");  
            // 一种方法是使用AppendMenu函数  
            AppendMenu(pop1,MF_STRING,30011,"新建"); 
            AppendMenu(pop1,MF_STRING,30012,"打开");
            AppendMenu(pop1, MF_DISABLED, 30013, "MF_DISABLED");            
            AppendMenu(pop1, MF_CHECKED, 30014, "MF_CHECKED");            
            
            HMENU pop2 = CreatePopupMenu();  
            AppendMenu(hRoot,MF_POPUP,(UINT_PTR)pop2,"编辑");  
            AppendMenu(pop2,MF_STRING,30021,"撤消"); 
            AppendMenu(pop2,MF_STRING,30022,"恢复");
            //WIN32 API建立主菜==========================================
 
    hwnd = CreateWindow( szAppName,              // window class name
                        "菜单函数示例",       // window caption
                        WS_OVERLAPPEDWINDOW,      // window style
                        CW_USEDEFAULT,            // initial x position
                        CW_USEDEFAULT,            // initial y position
                        CW_USEDEFAULT,            // initial x size
                        CW_USEDEFAULT,            // initial y size
                        NULL,                     // parent window handle
                        hRoot,                    // window menu handle
                        hInstance,               // program instance handle
                        NULL) ;                  // creation parameters
        
    ShowWindow (hwnd, iCmdShow) ;
    UpdateWindow (hwnd) ;
        
    while (GetMessage (&msg, NULL, 0, 0))
    {
        TranslateMessage (&msg) ;
        DispatchMessage (&msg) ;
    }
        
    return msg.wParam ;
}

c++ winapi菜单函数示例相关推荐

  1. python中主函数循环,带有菜单函数的Python主函数循环不起作用?

    我现在是一名大学生,正在上python课程.我们的任务是用函数创建这个程序.main函数调用菜单,然后在main函数中编写一个循环,根据菜单函数中的用户响应访问其他函数.在 我好像不能让我的循环工作. ...

  2. python绘图实例-Python matplotlib基础绘图函数示例

    原标题:Python matplotlib基础绘图函数示例 Pyplot基础图标函数: 函数 说明 plt.plot(x,y,fmt,-) 绘制一个坐标图 plt.boxplot(data,notch ...

  3. js动态改变下拉菜单内容示例 .

    <HTML><HEAD><TITLE>动态改变下拉菜单内容示例</TITLE></HEAD><SCRIPT LANGUAGE=java ...

  4. MySQL存储过程和函数示例

    存储过程和函数是在数据库中定义的一些SQL语句的集合,然后直接调用这些存储过程和函数来执行定义好的SQL语句.存储过程和函数可以避免开发人员重复的编写相同的SQL语句,而且存储过程和函数是在MySQL ...

  5. python中延时函数_python中实现延时回调普通函数示例代码

    python中实现延时回调普通函数示例代码 这篇文章主要给大家介绍了关于python中实现延时回调普通函数的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的 ...

  6. Mysql函数示例(如何定义输入变量与返回值)

    Mysql 函数示例 简介 基于mysql实现函数的编写,如何定义输入变量,如何定义和使用返回值等. 获取男女信息 --1 获取男女信息 CREATE FUNCTION getGender(idcar ...

  7. 【Python】自定义排序函数 - 示例

    自定义排序函数 - 示例 自定义排序规则: def cmp_value_p_code_big(o1, o2):"""排序规则: value大,排前面"" ...

  8. python函数示例_PHP closeir()函数与示例

    python函数示例 PHP Closedir()函数 (PHP closedir() function) The full form of closedir is "Close Direc ...

  9. python函数示例_带Python示例的complex()函数

    python函数示例 Python complex()函数 (Python complex() function) complex() function is a library function i ...

最新文章

  1. 如何用Map、Filter和Reduce替换Python For循环?
  2. windbg-!process显示进程
  3. 基于jsp的教师科研工作量_基于jsp+mysql的JSP教师科研信息管理系统
  4. 设计模式(创建型)之原型模式
  5. 业务库负载翻了百倍,我做了什么来拯救MySQL架构
  6. oracle+行换列,Oracle的数据表中行转列与列转行的操作实例讲解
  7. 针对文字加密的简单 JS 加密算法 --进制乱序法改良版
  8. Linux内存映射私有对象,Linux访问内存映射的对象
  9. 【笔记】VUE学习笔记
  10. python 数据去重 max()_荐 用 Python 对 Excel 表格内数据进行去重、分类,标记异常及分析...
  11. 等比数列求和推导及优化
  12. php 开源企业网站,TayCMS 免费开源企业网站建站系统 For PHP v1.8
  13. win7,win10系统安装时硬盘格式转换(MBR,GPT)
  14. 电脑开机没反应的排除方法
  15. BGA封装焊盘的过孔设计
  16. 怎么把ofd转换成PDF文件?分享给你个好用的方法。
  17. 数据库常见的安全问题有哪些?
  18. python透视变换原理_python cv2中的透视变换
  19. 【AI测试】人工智能测试整体介绍——第三部分
  20. 1278_FreeRTOS_借助prvAddCurrentTaskToDelayedList接口理解delayed task

热门文章

  1. SpringBoot中无法用@Value获取yml中的配置值的原因
  2. uber关于go语言规范
  3. 【SDCC 2016现场】互联网应用架构实战峰会(上):蚂蚁金服、宅米、携程、腾讯平台架构演变与实践...
  4. 职场性别报告,男女薪酬仍有差距,男性平均薪酬比女性高29.7%
  5. Android Q : 安卓源码、水滴屏适配状态栏图标(图标过多时显示一个点)
  6. 创业未成功人士讲述未成功经验
  7. 程序员的自我修养——作者:陈泽宣
  8. 2020寻找你的朋友圈认证,限时领取【2020 认证勋章】,千万不要错过!!
  9. Salesforce落地中国,意味着什么
  10. nagios网页监控check_http