API如何创建菜单

请分成几个步骤,简单描述一下就行,用加载资源的方法。... 请分成几个步骤,简单描述一下就行,用加载资源的方法。 展开
 我来答
amote258
2010-10-31 · TA获得超过1965个赞
知道小有建树答主
回答量:1101
采纳率:0%
帮助的人:947万
展开全部
AppendMenu 在指定的菜单里添加一个菜单项
CheckMenuItem 复选或撤消复选指定的菜单条目
CheckMenuRadioItem 指定一个菜单条目被复选成“单选”项目
CreateMenu 创建新菜单
CreatePopupMenu 创建一个空的弹出式菜单
DeleteMenu 删除指定的菜单条目
DestroyMenu 删除指定的菜单
DrawMenuBar 为指定的窗口重画菜单
EnableMenuItem 允许或禁止指定的菜单条目
GetMenu 取得窗口中一个菜单的句柄
GetMenuCheckMarkDimensions 返回一个菜单复选符的大小
GetMenuContextHelpId 取得一个菜单的帮助场景ID
GetMenuDefaultItem 判断菜单中的哪个条目是默认条目
GetMenuItemCount 返回菜单中条目(菜单项)的数量
GetMenuItemID 返回位于菜单中指定位置处的条目的菜单ID
GetMenuItemInfo 取得(接收)和一个菜单条目有关的特定信息
GetMenuItemRect 在一个矩形中装载指定菜单条目的屏幕坐标信息
GetMenuState 取得和指定菜单条目状态有关的信息
GetMenuString 取得指定菜单条目的字串
GetSubMenu 取得一个弹出式菜单的句柄,他位于菜单中指定的位置
GetSystemMenu 取得指定窗口的系统菜单的句柄
HiliteMenuItem 控制顶级菜单条目的加亮显示状态
InsertMenu 在菜单的指定位置处插入一个菜单条目,并根据需要将其他条目向下移动
InsertMenuItem 插入一个新菜单条目
IsMenu 判断指定的句柄是否为一个菜单的句柄
LoadMenu 从指定的模块或应用程式实例中载入一个菜单
LoadMenuIndirect 载入一个菜单
MenuItemFromPoint 判断哪个菜单条目包含了屏幕上一个指定的点
ModifyMenu 改动菜单条目
RemoveMenu 删除指定的菜单条目
SetMenu 设置窗口菜单
SetMenuContextHelpId 设置一个菜单的帮助场景ID
SetMenuDefaultItem 将一个菜单条目设为默认条目
SetMenuItemBitmaps 设置一幅特定位图,令其在指定的菜单条目中使用,代替标准的复选符号(√)
SetMenuItemInfo 为一个菜单条目设置指定的信息
TrackPopupMenu 在屏幕的任意地方显示一个弹出式菜单
TrackPopupMenuEx 和TrackPopupMenu相似,只是他提供了额外的功能

在使用菜单之前,值得一提的是,包含菜单的窗口必须是POPUP-UP或OVERLAPPED风格,才可能拥有菜单。
菜单的创建有三种方法:1,在WINDOWCLASS中指定菜单资源的标识符;2,在CreateWindowEx函数参数中指定菜单句柄;3,先用LoadMenu函数
载入菜单资源,再用SetMenu函数把菜单加载到应用程序的菜单栏。
菜单的操作包含:向已存在菜单添加新的菜单项,删除菜单中的某一项,使菜单项呈现被选中状态,使菜单项无效,创建浮动式菜单,向
Windows系统菜单中添加,删除选项等等。
定位菜单项有两种途径:1,用菜单项的唯一标识符;2,用菜单项的逻辑索引。
菜单项的逻辑索引是这样规定的,菜单栏中的项从左到右的索引依次是0,1,2...,弹出菜单中的项从上到下的索引依次是0,1,2...。
如果想获得菜单某一项的句柄,因先获得菜单条的句柄,在用该菜单项的索引取得句柄。例如:
hMenu=GetMenu(hWnd); //hWnd是窗口句柄
hPopupMenu=GetSubMenu(hMenu,0); //0表示菜单的第一个选项
范例1:演示菜单的各种操作
// begin.cpp : Defines the entry point for the application.
//
#define WIN32_LEAN_AND_MEAN
#include "stdafx.h"
#include "resource.h"
#define ID_NEWITEM 1013 //定义新菜单项的标识符
#define ID_NEWSYSITEM 60441 //定义新系统菜单项标识符
LRESULT CALLBACK MainProc(HWND,UINT,WPARAM,LPARAM); //主窗口函数
BOOL WINAPI DoDispPopupMenu(HWND,int,int); //创建弹出式菜单
VOID WINAPI DoDispMessage(int); //显示相关信息
VOID WINAPI DoInsertMenuItem(void); //向已有菜单中插入新项
VOID WINAPI DoDeleteMenuItem(void); //删除菜单中的选项
VOID WINAPI DoCheckMenuItem(void); //设置菜单项为选中标志
VOID WINAPI DoCheckRadio(void); //设置菜单项为单选标志
VOID WINAPI DoInsertSysMenu(void); //向系统菜单中插入新项
char szAppName[]="Begin";
HINSTANCE hIns;
HWND hMainWnd;
BOOL isInsert; //插入菜单标志
BOOL isCheck; //选中标志
int idRadio=2; //单选标志
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
MSG msg;
HWND hWnd;
WNDCLASSEX wc;
wc.cbClsExtra = 0;
wc.cbSize = sizeof(WNDCLASSEX);
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);
wc.hCursor = LoadCursor(NULL,IDC_ARROW);
wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
wc.hIconSm = 0;
wc.hInstance = hInstance;
wc.lpfnWndProc = (WNDPROC)MainProc;
wc.lpszClassName = szAppName;
wc.lpszMenuName = MAKEINTRESOURCE(IDR_MENU1);
wc.style = CS_HREDRAW | CS_VREDRAW | CS_DBLCLKS | CS_OWNDC;
RegisterClassEx(&wc);
hWnd=CreateWindowEx(0, szAppName, szAppName, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL);
hMainWnd=hWnd;
hIns=hInstance;
//在此处向系统菜单中插入菜单项
DoInsertSysMenu();
ShowWindow(hWnd,nCmdShow);
UpdateWindow(hWnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}

LRESULT CALLBACK MainProc(HWND hWnd,UINT message, WPARAM wParam,LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;
switch(message)
{
case WM_CREATE:
return 0;
case WM_PAINT:
hdc=BeginPaint(hWnd,&ps);
//do drawing
EndPaint(hWnd,&ps);
return 0;
case WM_RBUTTONDOWN:
//鼠标在窗口中右键被按下时,弹出浮动式菜单
if(DoDispPopupMenu(hWnd,LOWORD(lParam),HIWORD(lParam)))
return 0; //函数调用成功
else
break; //函数调用失败
case WM_COMMAND:
switch(LOWORD(wParam))
{
case ID_INSERT:
if(isInsert==0)
{
//插入新的菜单项
DoInsertMenuItem();
//显示相关信息
DoDispMessage(4);
}
break;
case ID_NEWITEM:
DoDispMessage(3);
break;
case ID_DELETE:
if(isInsert!=0)
{
//删除菜单项
DoDeleteMenuItem();
DoDispMessage(5);
}
break;
case IDEXIT:
PostQuitMessage(0);
break;
case ID_CHECK:
//在菜单选项前打钩
DoCheckMenuItem();
break;
case ID_RADIO1:
//在菜单选项前做一圆形标志,表明此项被选中,并清除旧的标志
idRadio=2;
DoCheckRadio();
break;
case ID_RADIO2: //同上
idRadio=3;
DoCheckRadio();
break;
case ID_RADIO3: //同上
idRadio=4;
DoCheckRadio();
break;
case ID_FLOAT1: //浮动菜单的选项被选中时的处理
DoDispMessage(0);
break;
case ID_FLOAT2: //同上
DoDispMessage(1);
break;
case ID_FLOAT3: //同上
DoDispMessage(2);
break;
}
return 0;
case WM_CLOSE:
PostQuitMessage(0);
return 0;
}
return DefWindowProc(hWnd,message,wParam,lParam);
}

BOOL WINAPI DoDispPopupMenu(HWND hWnd,int x,int y)
{
HMENU hMenu;
HMENU hPopupMenu;
POINT pt={x,y};
//从资源文件中载入菜单资源
hMenu=LoadMenu(hIns,MAKEINTRESOURCE(IDR_MENU2));
//获得子菜单的句柄
hPopupMenu=GetSubMenu(hMenu,0);
//窗口坐标转化到屏幕坐标
ClientToScreen(hMainWnd,&pt);
//创建浮动菜单
if(TrackPopupMenu(hPopupMenu, TPM_LEFTALIGN | TPM_RIGHTBUTTON, pt.x, pt.y, 0, hMainWnd, NULL)==FALSE)
return FALSE;
//使用完毕,回收内存
DestroyMenu(hMenu);
return TRUE;
}
VOID WINAPI DoDispMessage(int id)
{
//在菜单事件发生时,输出相应的字符串
HDC hdc;
char *mess[] = {
"Command Floating Menuitem 1 ",
"Command Floating Menuitem 2 ",
"Command Floating Menuitem 3 ",
"Command New Menu Item ",
"New Item Have Been Inserted ",
"New Item Have Been Deleted "
};
InvalidateRect(hMainWnd,NULL,FALSE);
hdc=GetDC(hMainWnd);
TextOut(hdc,0,0,mess[id],strlen(mess[id]));
ReleaseDC(hMainWnd,hdc);
}
VOID WINAPI DoInsertMenuItem()
{
//插入菜单项
HMENU hMenu;
HMENU hPopupMenu;
MENUITEMINFO info;
//每一个新插入的菜单项都必须填写MENUITEMINFO结构
info.cbSize = sizeof(MENUITEMINFO);
info.fMask = MFT_STRING | MIIM_DATA | MIIM_ID | MIIM_TYPE;
info.fType = MFT_STRING;
info.fState = 0;
info.wID = ID_NEWITEM;
info.hSubMenu = NULL;
info.hbmpChecked = NULL;
info.hbmpUnchecked = NULL;
info.dwItemData = ID_NEWITEM;
info.dwTypeData = "New Item";
info.cch = 8;
//获得已存在菜单的句柄
hMenu=GetMenu(hMainWnd);
//获得子菜单的句柄
hPopupMenu=GetSubMenu(hMenu,0);
//插入菜单项
InsertMenuItem(hPopupMenu,1,TRUE,&info);
//置插入标志为1
isInsert=1;
}
VOID WINAPI DoDeleteMenuItem()
{
//删除菜单项
HMENU hMenu;
HMENU hPopupMenu;
hMenu=GetMenu(hMainWnd);
hPopupMenu=GetSubMenu(hMenu,0);
RemoveMenu(hPopupMenu,ID_NEWITEM,MF_BYCOMMAND);
isInsert=0;
}
VOID WINAPI DoCheckMenuItem()
{
//此函数先判断菜单项是否被打钩,若没有,则做打钩标记
//若已有,则删除打钩标记
HMENU hMenu;
HMENU hPopupMenu;
hMenu=GetMenu(hMainWnd);
hPopupMenu=GetSubMenu(hMenu,1);
if(isCheck)
{
CheckMenuItem(hPopupMenu,0,MF_BYPOSITION | MF_UNCHECKED);
isCheck=0;
}
else
{
CheckMenuItem(hPopupMenu,0,MF_BYPOSITION | MF_CHECKED);
isCheck=1;
}
}

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式