• <Win32_16>来看看标准菜单和右键菜单的玩法


    日常应用中,菜单主要分为两种:(1) 标准菜单(处于应用程序菜单栏处的菜单)    (2)右键快捷菜单

    几乎你所见过或使用过的软件中,都有它俩儿

    为应用程序添加它们的基本步骤:

    (1)用代码或者IDE创建一个菜单资源

    (2)加载、显示菜单菜单

    (3)如果是右键菜单,在获取右键坐标按下的坐标时,还应该将它转换为屏幕坐标(ClientToScreen) —— 后面有原因解析

    (4)在WM_COMMANG消息中相应对应的操作

    下面,我就来讲一下标准菜单和右键菜单的创建以及用法

    (1)首先,不管是标准菜单还是右键菜单,都需要先创建,创建的方式有两种:

    1>代码方式,用CreateMenu函数来创建(为了方便,我这里就不用代码方式了,我选择IDE创建方式)

    2>用IDE提供的创建方式(就是添加资源,和添加位图资源是一回事儿,这里就是新建菜单)

    (2)我这里,为了区分,为标准菜单和右键菜单各自创建了一个菜单资源

    1>标准菜单

    菜单ID为IDR_MENU

    子菜单项椭圆ID为IDM_ELLIPSE

    子菜单项矩形ID为IDM_RECT

    子菜单项退出ID为IDM_EXIT

    2>右键菜单

    右键菜单ID为IDR_CONTEXTMENU

    子菜单项椭圆ID为IDCM_ELLIPSE

    子菜单项矩形ID为IDCM_RECT

    子菜单项退出ID为IDCM_EXIT

     

    (3)下面就是两种菜单的添加方式

    1>标准菜单的添加方式很简单,因为窗口中预留了一个菜单栏,就是来放菜单的,具体代码如下:(在注册窗口类之间修改lpszMenuName参数)

    wndclass.lpszMenuName	= MAKEINTRESOURCE(IDR_MENU);//加载标准菜单

     

    2>右键菜单的添加方式

    主要是使用TrackMenu这个函数来显示,来看看msdn:

    BOOL TrackPopupMenu(          
        HMENU hMenu,//菜单句柄
        UINT uFlags,//位置标记
        int x,	//x坐标
        int y,	//y坐标
        int nReserved,//必须为0,不用管
        HWND hWnd,	//拥有右键菜单的窗口的句柄
        HWND prcRect//忽略(NULL)
    );


    具体代码:(在右键按下消息中显示右键菜单)

    case WM_RBUTTONDOWN:
    	ptCm.x	= LOWORD(lParam);//设定右键菜单坐标
    	ptCm.y	= HIWORD(lParam);
    
    	/*
    		当前获取的坐标是客户区坐标 , 而TrackPopupMenu函数显示的坐标是屏幕坐标
    		因此 , 需将ptCm转换成屏幕坐标(否则显示位置不正确)
    	*/
    	ClientToScreen(hwnd, &ptCm);
    
    	//显示右键菜单
    	TrackPopupMenu(hSub, 
    				   TPM_LEFTALIGN | TPM_TOPALIGN | TPM_LEFTBUTTON,
    				   ptCm.x, ptCm.y,
    				   0, hwnd, NULL);
    	return 0;

     

    (4)消息处理,这里为了方便,我给标准菜单和右键菜单一种同样的相应方式

    具体代码如下:

    case WM_COMMAND:
    	//响应菜单消息
    	switch(LOWORD(wParam))//判断子菜单项的ID
    	{
    	//菜单栏和右键菜单的子项相同 , 因此对应执行相同操作
    	case IDM_ELLIPSE:
    	case IDCM_ELLIPSE:
    		isEllipse = TRUE;
    		InvalidateRect(hwnd, NULL, TRUE);
    		break;
    	case IDM_RECT:
    	case IDCM_RECT:
    		isEllipse = FALSE;
    		InvalidateRect(hwnd, NULL, TRUE);
    		break;
    	case IDM_EXIT:
    	case IDCM_EXIT:
    		if(IDYES == MessageBox(hwnd, TEXT("确定离开吗?"), TEXT("提示"), MB_YESNO))
    			SendMessage(hwnd, WM_CLOSE, wParam, lParam);
    	}
    	return 0;


     

     

    下面来看看运行效果:

  • 相关阅读:
    为BlueLake主题增加自定义icon图标
    Kettle自定义jar包供javascript使用
    【实战】使用 Kettle 工具将 mysql 数据增量导入到 MongoDB 中
    用心整理 | Spring AOP 干货文章,图文并茂,附带 AOP 示例 ~
    iOS开发——Web基础URLConnection请求
    iOS开篇——UI之UITableView 自定义Cell
    iOS开篇——UI之UITableView的搜索
    iOS开篇——UI之UITableView
    iOS开篇——UI之UIScrollView
    iOS开篇——UI之UIWebView
  • 原文地址:https://www.cnblogs.com/james1207/p/3293645.html
Copyright © 2020-2023  润新知