第10章 菜单及其它资源_10.2 菜单

10.2.1 和菜单有关的概念


差别


主菜单(顶级菜单)


子菜单(弹出菜单)


被选中(checked)


不能


可以


启用/禁用  (enabled/disabled)

活动/非活动(Active/Inactive)


可以


可以


变灰(grayed)


可以


可以


WM_COMMAND消息


启用时,可发送。禁用或变灰里不能


句柄


有独立句柄


有独立句柄

       

10.2.2 菜单项的结构和定义菜单——三个特征来定义菜单


特征


说明


①显示内容


1、表示文本字符串或位图。

2、带&指示紧接的字符显示下划线,配合Alt键搜索

3、Spparator绘制水平分隔线

4、\t制表符后面的文本在新一栏中

5、\a后面的文本进行右对齐


②ID


该项为MENUITEM(菜单项):则为菜单ID,会发送WM_COMMAND

为POPUP(弹出菜单): 为菜单句柄


③属性


是否被禁用、变灰或选中等。非活动时,不会产生WM_COMMAND消息。

10.2.3 在程序中引用菜单

(1)窗口类定义:wndclass.lpszMenuName =szAppName; //这里不能用LoadMenu

(2)在CreatWindow中指定菜单

①先加载菜单

hMenu= LoadMenu(hInstance,TEXT(“MyMenu”);或

hMenu =LoadMenu(hInstance,MAKEINTRESOURCE(IDM_MENU));

②将hMenu指定给CreateWindows第9个参数

Hwnd =CreateWindow(TEXT(“MyClass”),TEXT(“Windows Caption”),

WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,CW_USEDEFAULT,

NULL,hMenu,hInstance,NULL);

(3)窗口创建之后再指定的方法:SetMenu(hwnd,hMenu);

(4)菜单的销毁:①附加到窗口的菜单——自动销毁

②没有附加到窗口的——手动DestroyMenu

10.2.4 菜单与消息


消息


wParam


lParam


备注


WM_INITMENU


主菜单句柄


0


即使是选择了系统菜单中的一项,wParam仍然是主菜单的句柄。


WM_MENUSELECT


LOWORD:菜单ID或弹出菜单的索引

HIWORD:选择标记——

MF_GRAYED、MF_DISABLED、

MF_CHECKED、MF_BITMAP、

MF_POPUP、MF_HELP、

MF_SYSMENU、

MF_MOUSESELECT


包含所选项的菜单句柄

(注意是包含所选项的

整个POPUP菜单的句

柄)。


选择标记为那些值的组合,当加亮显示条在菜单项之间移动时,发送WM_MENUSELECT消息。


WM_INITMENUPOPUP


弹出菜单的句柄


LOWORD:弹出菜单的索引

HIWORD:1为系统菜单

0代表其他菜单


在弹出菜单之前,可以通过该消息设置菜单项的Enabled状态。


WM_COMMAND


菜单


控件


LOWORD


菜单ID


控件ID


HIWORD


0


通知码


菜单时:0

控件时:子窗口句柄


对比菜单与控件发送WM_COMMAND的不同


WM_SYSCOMMAND


1、菜单ID

2、对于预定义的系统菜单项:通过wParam&0xFFF0确

定哪项被选,结果如下

SC_SIZE、SC_MOVE、

SC_MINIMIZE、SC_MAXSIZE、

SC_RESTORE等

3、系统菜单添加的菜单项

LOWORD为菜单ID。定义

ID时要<0xF000以避免和预

定义菜单ID冲突


1、键盘选择菜单项时为0

2、鼠标单击时,lParam

表示鼠标的屏幕坐标,

LOWORD为 x,HIWORD为y


系统菜单发送的


WM_MENUCHAR


LOWORD:字符码(ASCII或

Unicode)。

HIWORD:选择码——0表示

没有弹出菜单显示,

MF_POPUP弹出菜单被显示,

MF_SYSMENU系统弹出菜单

被显示


菜单句柄


1、不是真正的菜单消息

2、两种情况下发送该消息

①Alt+不对应任何菜单项的字符键。

②弹出菜单时,安了一个不对应任何弹出菜单项的字符键。

 10.2.5 范例程序

(1)获取菜单句柄:

hMenu = GetMenu(hwnd); //己经设置了主菜单的情况下

hMenu = LoadMenu(hInstance,MAKEINTRESOURCE(IDM_MENUID));

(2)获取指定菜单激活的下拉式菜单或子菜单的句柄:

HMENU hSubMenu = GetSubMenu(hMenu,nPos); //该指定项在菜单内的相对位置

(3)设置弹出菜单:TrackPopupMenu(hMenu, TPM_RIGHTALIGN,x,y,hwnd,NULL);

(4)设置选中或取消选中状态

CheckMenuItem(hMenu,iSelection,MF_CHECKED); //iSelection为菜单ID

CheckMenuItem(hMenu,iSelection,MF_UNCHECKED);

CheckMenuItem(hMenu,iPosition,MF_UNCHECKED|MF_BYPOSITION); //iPosition为位置索引

(5)启动或禁用菜单

EnabledMenuItem(hMenu,IDM_MENUID,MF_GRAYED);//变灰

EnabledMenuItem(hMenu,IDM_MENUID,MF_ENABLED);//激活,禁用时用MF_DISABLED

EnabledMenuItem(hMenu,iPosition,MF_ENABLED|MF_BYPOSITION);// iPosition为位置索引

10.2.6 通过程序来定义菜单

(1)创建菜单 hMenu= CreateMenu();

(2)添加菜单项 ——要先hMenuPopup=CreateMenu();

AppendMenu(hMenuPopup,MF_STRING,IDM_MENIID,“&NEW”);//MF_标志可组合使用,如变灰

AppendMenu(hMenu,MF_SEPARATOR,0,NULL);

AppendMenu(hMenu,MF_POPUP,hMenuPopup,“&File”);

10.2.7 定义菜单的第3种方法:

(1)MENUITEMPLATE结构

(2)LoadMenuIndirect( CONST MENUTEMPLATE *lpMenuTemplate);

10.2.8 浮动弹出菜单

(1)顶级菜单只能包含一个菜单项:如“MyMenu”的弹出菜单.

      

(2)浮动弹出菜单:

TrackPopupMenu(hTrackMenu, TPM_RIGHTBUTTON, pt.x, pt.y, 0, hwnd, NULL);

★注意鼠标坐标应转化为屏幕坐标

10.2.9 使用系统菜单

(1)新加的菜单项ID应<0xF000

(2)系统菜单发送:WM_SYSCOMMAND消息

(3)获取系统菜单的方法:HMENUGetSystemMenu(hWnd,  bRevert);

10.2.10 菜单的其他命令


函数


功能


备注


AppendMenu


在菜单末尾加入新菜单项


DeleteMenu


删除菜单项并销毁


InsertMenu


插入新菜单项


ModifyMenu


修改己存在的菜单项


RemoveMenu


去除一个己有的菜单项(不销毁)


DestroyMenu


销毁菜单


己被附加到顶级菜单的,会自动

Destroy,其他的要手动销毁


DrawMenuBar(hwnd)


强制重绘顶级菜单


GetSubMenu(hMenu,iPosition)


返回弹出菜单的句柄


iPosition是弹出菜单在顶级菜单中的索引(从0开始),hMenu为顶级菜单


GetMenuItemCount(hMenu)


返回顶级菜单或弹出菜单的菜单项数目


GetMenuItemID(hMenuPopup,iPosition)


获取弹出菜单中某个菜单项的菜单ID


iPosition指该菜单在弹出菜单中的位置(从0开始)


GetMenuString


获取菜单项文本


第2个参数id可以是菜单ID或位置索引,看iFlag参数是MF_BYCOMMAND或MF_BYPOSITION


GetMenuState


获取菜单项的当前标志

返回值是各种标志的组合


id,iFlag参数意义如上

【MenuDemo程序】

/*------------------------------------------------------------
MENUDEMO.C -- Menu Demonstration
(c) Charles Petzold, 1998
------------------------------------------------------------*/
#include <windows.h>
#include "resource.h"
#define ID_TIMER       1
#define IDM_SYS_ABOUT  1
#define IDM_SYS_HELP   2
#define IDM_SYS_REMOVE 3
HINSTANCE hInst;
TCHAR szAppName[] = TEXT("MenuDemo");
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    PSTR szCmdLine, int iCmdShow)
{
    HWND         hwnd;
    HMENU        hSysMenu; //系统菜单
    MSG          msg;
    WNDCLASS     wndclass;
    hInst = hInstance;
    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc = WndProc;
    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 = szAppName; //不能用LoadMenu
    wndclass.lpszClassName = szAppName;
    if (!RegisterClass(&wndclass))
    {
        MessageBox(NULL, TEXT("This program requires Windows NT!"),
            szAppName, MB_ICONERROR);
        return 0;
    }

    hwnd = CreateWindow(szAppName,                  // window class name
        TEXT("Menu Demonstration"), // 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
        NULL,                       // window menu handle
        hInstance,                  // program instance handle
        NULL);                     // creation parameters

    hSysMenu = GetSystemMenu(hwnd, FALSE);
    AppendMenu(hSysMenu, MF_SEPARATOR, 0, 0); //加分隔线;
    AppendMenu(hSysMenu, MF_STRING, IDM_SYS_ABOUT, TEXT("&About..."));
    AppendMenu(hSysMenu, MF_STRING, IDM_SYS_HELP, TEXT("&Help..."));
    AppendMenu(hSysMenu, MF_STRING, IDM_SYS_REMOVE, TEXT("&Remove Additions"));

    ShowWindow(hwnd, iCmdShow);
    UpdateWindow(hwnd);

    while (GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return msg.wParam;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static int  idColor[5] = { WHITE_BRUSH, LTGRAY_BRUSH, GRAY_BRUSH, DKGRAY_BRUSH, BLACK_BRUSH };
    static int  iSelection = IDM_BKGND_WHITE; //当前选中的颜色菜单项ID
    HMENU  hMainMenu, hPopupMenu, hSrcMenu, hTrackMenu;
    TCHAR szBuf[24];
    POINT pt;
    switch (message)
    {
        //case WM_CONTEXTMENU:  //WM_RBUTTONUP、WM_NCRBUTTONUP 、Shift+F10时触发
    case WM_RBUTTONUP:
        pt.x = LOWORD(lParam);
        pt.y = HIWORD(lParam);
        ClientToScreen(hwnd, &pt);
        hSrcMenu = LoadMenu(hInst, szAppName); //这里不能GetMenu,要从资源加载进来
        hPopupMenu = CreatePopupMenu();//创建弹出式菜单
        AppendMenu(hPopupMenu, MF_POPUP, (UINT_PTR)hSrcMenu, TEXT("MyMenu")); //浮动菜单需要唯一的弹出菜单
        hTrackMenu = GetSubMenu(hPopupMenu, 0);
        TrackPopupMenu(hTrackMenu, TPM_RIGHTBUTTON, pt.x, pt.y, 0, hwnd, NULL);
        DestroyMenu(hSrcMenu); //销毁加载的菜单
        DestroyMenu(hPopupMenu);//销毁弹出式菜单
        return 0;
    case WM_COMMAND:
        hMainMenu = GetMenu(hwnd);
        switch (LOWORD(wParam))
        {
        case IDM_FILE_NEW:
        case IDM_FILE_OPEN:
        case IDM_FILE_SAVE:
        case IDM_FILE_SAVE_AS:
            wsprintf(szBuf, TEXT("Menu ID:%d!"), LOWORD(wParam));
            MessageBox(hwnd, szBuf,
                szAppName, MB_ICONINFORMATION | MB_OK);
            return 0;
        case IDM_APP_EXIT:
            SendMessage(hwnd, WM_CLOSE, 0, 0);
            return 0;
        case IDM_EDIT_UNDO:
        case IDM_EDIT_CUT:
        case IDM_EDIT_COPY:
        case IDM_EDIT_PASTE:
        case IDM_EDIT_DELETE:
            wsprintf(szBuf, TEXT("Menu ID:%d!"), LOWORD(wParam));
            MessageBox(hwnd, szBuf,
                szAppName, MB_ICONINFORMATION | MB_OK);
            return 0;
        case IDM_BKGND_WHITE:     //假设从white到black是按顺序递增的
        case IDM_BKGND_LIGHTG_RAY:
        case IDM_BKGND_GRAY:
        case IDM_BKGND_DARKGRAY:
        case IDM_BKGND_BLACK:

            CheckMenuItem(hMainMenu, iSelection, MF_UNCHECKED); //取消之前选中项的选中状态
            iSelection = LOWORD(wParam);
            CheckMenuItem(hMainMenu, iSelection, MF_CHECKED); //设置当前项为选中状态
            SetClassLong(hwnd, GCL_HBRBACKGROUND,
                (LONG)GetStockObject(idColor[LOWORD(wParam) - IDM_BKGND_WHITE]));
            InvalidateRect(hwnd, NULL, TRUE);
            return 0;
        case IDM_TIMER_START:
            if (SetTimer(hwnd, ID_TIMER, 1000, NULL))
            {
                EnableMenuItem(hMainMenu, IDM_TIMER_START, MF_GRAYED);
                EnableMenuItem(hMainMenu, IDM_TIMER_STOP, MF_ENABLED);
            }
            return 0;
        case IDM_TIMER_STOP:
            if (KillTimer(hwnd, ID_TIMER))
            {
                EnableMenuItem(hMainMenu, IDM_TIMER_START, MF_ENABLED);
                EnableMenuItem(hMainMenu, IDM_TIMER_STOP, MF_GRAYED);
            }
            return 0;
        case IDM_APP_ABOUT:
            MessageBox(hwnd, TEXT("Help not yet implement!"),
                szAppName, MB_ICONEXCLAMATION | MB_OK);
            return 0;
        case IDM_APP_ABOUT_MENUDEMO:
            MessageBox(hwnd, TEXT("Menu Demonstration Program!\n{c} Charles Petzold,1998"), //\n换行显示
                szAppName, MB_ICONINFORMATION | MB_OK);
            return 0;
        }
        break; //其它WM_COMMAND进行默认处理,这里不return;
    case WM_SYSCOMMAND:
        switch (LOWORD(wParam)) //自定义的菜单ID在LOWORD中
        {
        case IDM_SYS_ABOUT:
            MessageBox(hwnd, TEXT("A Poor-Person‘s Menu Program\n{c} Charles Petzold,1998!"),
                szAppName, MB_ICONINFORMATION | MB_OK);
            return 0;
        case IDM_SYS_HELP:
            MessageBox(hwnd, TEXT("Help not yet implement!"),
                szAppName, MB_ICONEXCLAMATION | MB_OK);
            return 0;
        case IDM_SYS_REMOVE:
            GetSystemMenu(hwnd, TRUE);//重置系统菜单,参数bRevert设为TRUE
            return 0;
        }
        break;  //其它消息进行默认处理,这里不能return。
    case WM_TIMER:
        MessageBeep(0);
        return 0;
    case WM_DESTROY:
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, message, wParam, lParam);
}

//resource.h

//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ 生成的包含文件。
// 供 MenuDemo.rc 使用
//
#define IDM_FILE_NEW                    40001
#define IDM_FILE_OPEN                   40002
#define IDM_FILE_SAVE_AS                40003
#define IDM_FILE_SAVE                   40004
#define IDM_APP_EXIT                    40005
#define IDM_EDIT_UNDO                   40006
#define IDM_EDIT_CUT                    40007
#define IDM_EDIT_COPY                   40008
#define IDM_EDIT_PASTE                  40009
#define IDM_EDIT_DELETE                 40010
#define IDM_BKGND_WHITE                 40011
#define IDM_BKGND_LIGHTG_RAY            40012
#define IDM_BKGND_GRAY                  40013
#define IDM_BKGND_DARKGRAY              40014
#define IDM_BKGND_BLACK                 40015
#define IDM_TIMER_START                 40016
#define IDM_TIMER_STOP                  40017
#define IDM_APP_ABOUT                   40018
#define IDM_APP_ABOUT_MENUDEMO          40019
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        102
#define _APS_NEXT_COMMAND_VALUE         40052
#define _APS_NEXT_CONTROL_VALUE         1001
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif

//MenuDemo.rc

// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "winres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// 中文(简体,中国) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""winres.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"\r\n"
"\0"
END
#endif    // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Menu
//
MENUDEMO MENU  //顶级菜单
BEGIN
POPUP "&File"   //注意与浮动弹出菜单的区别
BEGIN
MENUITEM "&New", IDM_FILE_NEW
MENUITEM "&Open", IDM_FILE_OPEN
MENUITEM "Save &As...", IDM_FILE_SAVE_AS
MENUITEM "&Save", IDM_FILE_SAVE
MENUITEM SEPARATOR
MENUITEM "E&xit", IDM_APP_EXIT
END
POPUP "&Edit"
BEGIN
MENUITEM "&Undo", IDM_EDIT_UNDO
MENUITEM SEPARATOR
MENUITEM "C&ut", IDM_EDIT_CUT
MENUITEM "&Copy", IDM_EDIT_COPY
MENUITEM "&Paste", IDM_EDIT_PASTE
MENUITEM "De&lete", IDM_EDIT_DELETE
END
POPUP "&BackGround"
BEGIN
MENUITEM "&White", IDM_BKGND_WHITE, CHECKED
MENUITEM "&Light Gray", IDM_BKGND_LIGHTG_RAY
MENUITEM "&Gray", IDM_BKGND_GRAY
MENUITEM "&Dark Gray", IDM_BKGND_DARKGRAY
MENUITEM "&Black", IDM_BKGND_BLACK
END
POPUP "Timer"
BEGIN
MENUITEM "&Start", IDM_TIMER_START
MENUITEM "S&top", IDM_TIMER_STOP, GRAYED
END
POPUP "Help"
BEGIN
MENUITEM "&Help...", IDM_APP_ABOUT
MENUITEM "&About MenuDemo...", IDM_APP_ABOUT_MENUDEMO
END
END
#endif    // 中文(简体,中国) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED

10.2.11 菜单的另类用法

(1)创建三个菜单

①主菜单:(有3个菜单项,但“MAIN:”被禁用)。

②文件菜单File和编辑菜单Edit如下

  

注意:它们分别以“File:”和“Edit:”开头,但都被禁用。每个菜单最后一个菜单项为“(Main)”,用于返回主菜单。

(2)在WM_COMMAND中进行通过SetMenu进行菜单切换。

(3)处理WM_DESTROY消息:

  ①销毁File和Edit菜单

  ②将主菜单设为程序的顶级菜单,这样当窗口销毁时,主菜单自动销毁。

【NoPopups程序】

/*------------------------------------------------------------
NOPOPUPS.C -- Demonstrates No-Popup Nested Menu
(c) Charles Petzold, 1998
------------------------------------------------------------*/
#include <windows.h>
#include "resource.h"
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    PSTR szCmdLine, int iCmdShow)
{
    static TCHAR szAppName[] = TEXT("NoPopups");
    HWND         hwnd;
    MSG          msg;
    WNDCLASS     wndclass;
    wndclass.style = CS_HREDRAW | CS_VREDRAW;
    wndclass.lpfnWndProc = WndProc;
    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;
    if (!RegisterClass(&wndclass))
    {
        MessageBox(NULL, TEXT("This program requires Windows NT!"),
            szAppName, MB_ICONERROR);
        return 0;
    }

    hwnd = CreateWindow(szAppName,                  // window class name
        TEXT("No-Popup Nested Menu Demonstration"), // 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
        NULL,                       // 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;
}
LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HMENU hMenuMain, hMenuFile, hMenuEdit;
    HINSTANCE hInst;

    switch (message)
    {
    case WM_CREATE:
        hInst = ((LPCREATESTRUCT)lParam)->hInstance;//(HINSTANCE)GetWindowLong(hwnd,GWL_HINSTANCE);
        hMenuMain = LoadMenu(hInst, TEXT("MENUMAIN"));
        hMenuFile = LoadMenu(hInst, TEXT("MENUFILE"));
        hMenuEdit = LoadMenu(hInst, TEXT("MENUEDIT"));
        SetMenu(hwnd, hMenuMain);
        return 0;

    case WM_COMMAND:
        switch (LOWORD(wParam))
        {
        case IDM_MAIN:
            SetMenu(hwnd, hMenuMain);
            return 0;
        case IDM_FILE:
            SetMenu(hwnd, hMenuFile);
            return 0;
        case IDM_EDIT:
            SetMenu(hwnd, hMenuEdit);
            return 0;
        case IDM_FILE_OPEN:
        case IDM_FILE_NEW:
        case IDM_FILE_SAVE:
        case IDM_FILE_SAVEAS:
        case IDM_EDIT_UNDO:
        case IDM_EDIT_COPY:
        case IDM_EDIT_CUT:
        case IDM_EDIT_DELETE:
        case IDM_EDIT_PASTE:
            MessageBeep(0);
            return 0;
        }
        break;
    case WM_DESTROY:
        SetMenu(hwnd, hMenuMain);
        DestroyMenu(hMenuFile);
        DestroyMenu(hMenuEdit);
        PostQuitMessage(0);
        return 0;
    }
    return DefWindowProc(hwnd, message, wParam, lParam);
}

//resource.h

// Microsoft Visual C++ 生成的包含文件。
// 供 NoPopups.rc 使用
//
#define IDM_MAIN                        40001
#define IDM_FILE                        40002
#define IDM_EDIT                        40003
#define IDM_FILE_NEW                    40004
#define IDM_FILE_OPEN                   40005
#define IDM_FILE_SAVE                   40006
#define IDM_FILE_SAVEAS                 40007
#define IDM_EDIT_UNDO                   40008
#define IDM_EDIT_CUT                    40009
#define IDM_EDIT_COPY                   40010
#define IDM_EDIT_PASTE                  40011
#define IDM_EDIT_DELETE                 40012
// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE        104
#define _APS_NEXT_COMMAND_VALUE         40030
#define _APS_NEXT_CONTROL_VALUE         1001
#define _APS_NEXT_SYMED_VALUE           101
#endif
#endif

//NoPopups.rc

// Microsoft Visual C++ generated resource script.
//
#include "resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include "winres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// 中文(简体,中国) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS)
LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE
BEGIN
"#include ""winres.h""\r\n"
"\0"
END
3 TEXTINCLUDE
BEGIN
"\r\n"
"\0"
END
#endif    // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Menu
//
MENUMAIN MENU
BEGIN
MENUITEM "MAIN:", 0, INACTIVE
MENUITEM "&File...", IDM_FILE
MENUITEM "&Edit...", IDM_EDIT
END
MENUFILE MENU
BEGIN
MENUITEM "FILE:", 0, INACTIVE
MENUITEM "&New", IDM_FILE_NEW
MENUITEM "&Open...", IDM_FILE_OPEN
MENUITEM "&Save", IDM_FILE_SAVE
MENUITEM "Save &As", IDM_FILE_SAVEAS
MENUITEM "(&Main)", IDM_MAIN
END
MENUEDIT MENU
BEGIN
MENUITEM "EDIT:", 0, INACTIVE
MENUITEM "&Undo", IDM_EDIT_UNDO
MENUITEM "Cu&t", IDM_EDIT_CUT
MENUITEM "&Copy", IDM_EDIT_COPY
MENUITEM "&Paste", IDM_EDIT_PASTE
MENUITEM "De&lete", IDM_EDIT_DELETE
MENUITEM "(&Main)", IDM_MAIN
END
#endif    // 中文(简体,中国) resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
/////////////////////////////////////////////////////////////////////////////
#endif    // not APSTUDIO_INVOKED
时间: 2024-08-27 11:43:38

第10章 菜单及其它资源_10.2 菜单的相关文章

第10章 菜单及其它资源_10.1 图标、鼠标指针、字符串等资源

10.1 图标.鼠标指针.字符串和自定义资源 10.1.1 向程序添加图标 (1)加载图标:(注意:第1个参数为hInstance,不能为NULL表示从程序本身加载) 图标ID为数字 ①wndclass.hIcon = LoadIcon(hInstance,MAXINTRESOURCE(IDI_ICON); ②wndclass.hIcon = LoadIcon(hInstance,MAXINTRESOURCE(125) 图标ID为字符串 ①wndclass.hIcon = LoadIcon(hI

SQL Server2012 T-SQL基础教程--读书笔记(8 - 10章)

SQL Server2012 T-SQL基础教程--读书笔记(8 - 10章) 示例数据库:点我 CHAPTER 08 数据修改 8.1 插入数据 8.1.1 INSERT VALUES 语句 8.1.2 INSERT SELECT 语句 8.1.3 INSERT EXEC 语句 8.1.4 SELECT INTO 语句 8.1.5 BULK INSERT 语句 8.1.6 标识列属性和序列对象 8.1.6.1 标识列属性 8.1.6.2 序列对象 8.2 删除数据 8.2.1 DELETE 语

《白帽子讲WEB安全》学习笔记之第10章 访问控制

第10章 访问控制 10.1 what can i do? 权限控制是值某个主体(身份)对某一个客体需要实施某种操作,而系统对这种操作的限制就是权限控制. 在一个安全系统中,确定主题的身份是"认证"解决的问题:而客体是胭脂红资源,是主题发起的请求对象.在主体对客体进行操作的过程,系统控制主体不能"无限制"地对客体进行操作,这过程就是"访问控制". 在WEB应用中,根据访问楷体的不同,常见的访问控制可以分为"基于URL的访问控制"

阅读8,9,10章

第8章 本章主要讲需求分析,那么需求分析都包括哪些方面? 答:1 写出系统的任务和特点 2 要实现的功能模块及其作用 3 系统结构图(用UML描述) 4 采用的数据库 5 开发运行环境 第9章 本章主要讲简介项目经理的要求与能力,那么项目经理的职责是什么? 答:1.确保项目目标实现,保证业主满意 这一项基本职责是检查和衡量项目经理管理成败.水平高低的基本标志. 2.制定项目阶段性目标和项目总体控制计划 项目总目标一经确定,项目经理的职责之一就是将总目标分解,划分出主要工作内容和工作量,确定项目阶

3.26日第六次作业,第10章质量,11章人力

3.26日 第六次作业,第10章质量,11章人力 1.质量管理基本原则   以实用为核心的多元要求.系统工程.职工参与管理.管理层和第一把手重视.保护消费者权益.面向国际市场. 2.质量管理的目标顾客满意度.预防胜于检查.各阶段内的过程.   质量管理既重视结果也重视过程   实施组织主动采纳的质量改进措施(如全面质量管理.持续改进等) 3.质量管理的主要活动有哪些项目的质量管理可以分解为质量策划.质量保证与质量控制三个过程.质量策划是指确定与项目相关的质量标准,并决定如何达到这些质量标准.质量

第 10 章 判断用户是否登录

转载:http://www.mossle.com/docs/auth/html/ch010-fully.html 第 10 章 判断用户是否登录 有些情况,只要用户登录就可以访问某些资源,而不需要具体要求用户拥有哪些权限,这时候可以使用IS_AUTHENTICATED_FULLY,配置如下所示: <http auto-config='true'> <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN&q

MySQL性能调优与架构设计——第10章 MySQL数据库Schema设计的性能优化

第10章 MySQL Server性能优化 前言: 本章主要通过针对MySQL Server(mysqld)相关实现机制的分析,得到一些相应的优化建议.主要涉及MySQL的安装以及相关参数设置的优化,但不包括mysqld之外的比如存储引擎相关的参数优化,存储引擎的相关参数设置建议将主要在下一章“常用存储引擎的优化”中进行说明. 10.1 MySQL 安装优化 选择合适的发行版本 1. 二进制发行版(包括RPM等包装好的特定二进制版本) 由于MySQL开源的特性,不仅仅MySQL AB提供了多个平

《构建之法》之第8、9、10章读后感 ,以及sprint总结

第8章: 主要介绍了软件需求的类型.利益相关者,获取用户需求分析的常用方法与步骤.竞争性需求分析的框架NABCD,四象限方法以及项目计划和估计的技术. 1.软件需求:人们为了解决现实社会和生活中的各种问题而有求于软件 2.而作为软件团队,准确而全面地找到这些需求主要的步骤为: (1)获取和引导需 (3)验证需求 (2)分析和定义需求 (4)在软件产品的生命周期中管理需求 3.用户对软件的需求又分为:对产品功能性的需求:对产品开发过程的需求:非功能性需求:以及综合需求.所以软件团队和客户代表在需求

第10章神经网络基础

第10章神经网络基础 在本章中,我们将深入研究神经网络(neural networks)的基础.我们将首先讨论人工神经网络,以及它们是如何从我们自己身体中的真实生物神经网络中得到启发的.之后,我们将回顾经典的感知器算法(Perceptron algorithm)以及它在神经网络历史中的作用. 构建了感知器,我们将学习BP算法(backpropagation algorithm),这是现代神经网络的基石.我们将使用python从头实现BP算法,确保我们理解了这个重要的算法. 当然,现代神经网络库如