包含menuiteminfo的词条

http://www.itjxue.com  2023-01-09 11:12  来源:未知  点击次数: 

如何得到菜单项上的文本

通过函数得到:

BOOL GetMenuItemInfo(

UINT uItem, // ID

LPMENUITEMINFO lpMenuItemInfo, // 菜单信息

BOOL fByPos = FALSE

);

代码示例如下:

CMenu* submenu = GetSubMenu(0);

MENUITEMINFO info;

info.cbSize = sizeof (MENUITEMINFO);

info.fMask = MIIM_STRING;// 这个类型很关键

submenu-GetMenuItemInfo(ID_HELP_TEST, info);

info.dwTypeData 就是你想要的,它是LPTSTR类型的。

编程中2如何解决右顺序对齐菜单的问题?

右顺序对齐菜单就是菜单在菜单条的最右侧对齐,往左排列。平时,我们能看到很多右顺序对齐菜单的例子,如“WPS2000集成办公系统”有文件打开时的“定制界面”菜单、Origin2.5的“Help”菜单等。将右顺序对齐菜单应用于应用程序中,可以打破常规菜单左顺序对齐的显示方式,给人耳目一新的感觉;另外,我们可以将一些需要实时更新的消息、提示等显示在右顺序对齐菜单中,醒目突出,既符合人体肉眼查询信息的习惯,又可避免占用窗体或状态栏空间。因此,右顺序对齐菜单具有一定的实用性。

Visual C++环境下的实现方法

Visual C++的编程环境支持可视化的菜单设计,在设计菜单时可直接将菜单指定为“右顺序对齐菜单”。具体方法是:选定菜单后双击或在右键菜单中选“属性”,打开菜单属性对话框,选“Extended Styles”标签,在“Extended Styles”标签板上只有“右-左顺序对齐”项,选择“右-左顺序对齐”项即可。注意,上述指定只对菜单条上的菜单有效,对子菜单项也可指定但运行时没有效果。图1为经过Visual C++编译后的右顺序对齐菜单应用程序运行时的显示效果。

图1 VC环境下右顺序对齐菜单应用程序

Visual Basic环境下的实现方法

Visual Basic环境不支持直接指定、创建右顺序对齐菜单,必须通过编程实现。根据MSDN对菜单信息数据结构、相关API函数的解释,可概括出实现这项功能的四个步骤或称具体程序流程:

1.定义菜单信息数据结构MenuItemInfo全局对象;

2.用GetMenuItemInfo API函数取得指定的菜单信息,并将信息存放于定义的MenuItemInfo对象内;

3.将定义的MenuItemInfo全局对象的fType部分设为MFT_RIGHTJUSTIFY(设置右顺序对齐菜单的关键参数);

4. 用SetMenuItemInfo API函数重新设置菜单。

MenuItemInfo的定义

MenuItemInfo存放菜单特征信息如: 类型、状态、标识号、句柄指针值等,这些特征信息决定了菜单的标题内容、排列顺序、响应方式等等。适当改变其中某些信息即可实现菜单右顺序对齐。

MenuItemInfo的定义如下:

typedef struct tagMENUITEMINFO {

UINT cbSize;

UINT fMask;

UINT fType;

UINT fState;

UINT wID;

HMENU hSubMenu;

HBITMAP hbmpChecked;

HBITMAP hbmpUnchecked;

DWORD dwItemData;

LPTSTR dwTypeData;

UINT cch;

} MENUITEMINFO,FAR *

LPMENUITEMINFO。

MenuItemInfo结构中与右顺序对齐菜单实现密切相关的是fType参数,fType存放菜单项的类型参数,它可以是预定义值中的一个或几个。

其中的MFT_RIGHTJUSTIFY常数可将本菜单项及其随后的菜单调整到菜单条的右侧排列。

API函数GetMenuItemInfo、SetMenuItemInfo简介

GetMenuItemInfo函数简介:

函数功能:取得一个菜单项的信息。

函数原型:BOOL GetMenuItemInfo(HMENU hMenu, UINT uItem, BOOL fByPosition, LPMENUITEMINFO Ipmii)。

参数:

hMenu:包含指定菜单项的菜单的句柄。

uItem: 将要取得其信息的菜单项的标识符或位置,此参数的含义取决于参数fByPosition的值。

fByPosition: 此值用于指定参数uItem的含义,如果此参数是FALSE,则uItem表示菜单项的标识符; 否则,表示菜单项的位置。

Ipmii:指向结构MenuItemInfo的指针,该结构指定要取得的信息并接收菜单项的信息。

返回值:如果函数调用成功,返回非零值;如果函数调用失败,返回值是零。

调用注意点:Windows CE环境下,由参数Ipmii指向的MenuItemInfo结构中的fMask不能取MIM_CHECKMARKS。

SetMenuItemInfo函数简介:

函数功能:该函数改动一个菜单项的信息。

函数原型:BOOL SetMenuItemInfo(HMENU hMenu, UINT uItem, BOOL fByPosition, LPMENUITEMINFO Ipmii)。

参数:

hMenu: 包含菜单项的菜单的句柄。

uItem: 将被修改的菜单项的标识或位置,此参数的含义由参数fByPosition确定。

fByPosition: 此值用于指定uItem的含义。如果此参数值为FALSE,则参数uItem是菜单项的标识;否则,表示菜单项的位置。

Ipmii:指向结构MenuItemInfo的指针,该结构含有菜单项的信息,并且指定将被修改的菜单项的属性。

返回值:如果函数调用成功,返回非零值;如果函数调用失败,返回值是零。

调用注意点:为了使键盘加速键能控制位图或自己绘制的菜单项,菜单的拥有者必须处理WM_MENUCHAR消息。Windows CE环境下,只有下列值对参数Ipmii指向的MenuItemInfo结构中的fMask成员有效:MIIM_DATA、MIIM_ID和MIIM_TYPE 。如果MIIM_TYPE被指定,结构MenuItemInfo的fType成员必须为菜单项的当前类型,也就是说,该类型不能被改变。

Visual Basic环境下的源代码(以实现图2所示菜单为例):

’数据结构声明

Public Type menuItemInfo

cbSize As Long

fMask As Long

fType As Long

……

End Type

’API函数声明

Public Declare Function SetMenuItemInfo Lib “user32” Alias “SetMenuItemInfoA” (ByVal hMenu As Long, ByVal un As Long, ByVal bool As Boolean, lpcMenuItemInfo As menuItemInfo) As Long

Public Declare Function GetMenuItemInfo Lib “user32” Alias “GetMenuItemInfoA” (ByVal hMenu As Long, ByVal un As Long, ByVal b As Long, lpMenuItemInfo As menuItemInfo) As Long

Public Declare Function DrawMenuBar Lib “user32” (ByVal hwnd As Long) As Long

Public Declare Function GetMenu Lib “user32” (ByVal hwnd As Long) As Long

’在窗体载入过程(也可放在其他过程)中对菜单设置进行更改

Private Sub Form_Load()

Dim my_menuItemInfo As menuItemInfo

Dim return_value As Long

my_menuItemInfo.cbSize = 44

my_menuItemInfo.fMask = 16

’MIIM_TYPE

my_menuItemInfo.cch = 128

my_menuItemInfo.dwTypeData

= Space$(128)

return_value = GetMenuItemInfo(GetMenu(Me.hwnd), 2, 1, my_menuItemInfo)

my_menuItemInfo.fType = 16384

’MFT_RIGHTJUSTIFY

return_value = SetMenuItemInfo(GetMenu(Me.hwnd),2, 1, my_menuItemInfo)

DrawMenuBar GetMenu(Me.hwnd)

End Sub

图2为Visual Basic环境下编译的应用程序右顺序对齐菜单显示效果。

图2 Visual Basic编译的右顺序对齐菜单应用程序

存在的问题

在程序运行过程中,我们常要对菜单标题进行更改,对用上述程序更改为右顺序对齐后的菜单来说,由此带来的一个问题是右顺序对齐显示效果失效,即已经在最右侧的菜单恢复到左侧排列,其原因是菜单标题字符串所在内存空间数据的更改。我们可以在Visual Basic程序中做实验,在窗体鼠标单击事件过程内加入如下语句:

Private Sub Form_Click()

location.Caption = “改变”

’目标位置菜单的名称为location

End Sub

上述程序对显示目标位置的菜单标题作了修改。运行该程序,用鼠标单击窗体部分,结果如图3所示。

图3 失效的右顺序对齐菜单

通过摸索,我们提出了一个变通解决方法:在欲将其调整到右侧的菜单前面加一个空菜单,并在程序中对该空菜单进行右顺序对齐编程。

仍以Visual Basic编译环境下图2所示应用程序的菜单为例,先打开“菜单编辑器”,在“目标位置”菜单前插入一个标题字符为空、名称为“void_menu”的空菜单,接着编译该程序。运行时API函数SetMenuItemInfo将“void_menu”空菜单及其右侧的所有菜单(“目标位置”菜单等)均调整到菜单条最右侧,因为“void_menu”空菜单的标题字符为空,所以该菜单不显示,程序中接下来可以对“目标位置”菜单的标题字符内容作任意修改、更新。图4为对添加的空菜单进行右顺序对齐编程后的显示效果,用前面窗体中的单击事件过程的代码进行测试,可以发现标题更改为“改变”的location菜单仍显示在右侧,完全达到目的。Visual C++编程环境中也可采用类似方法。

API如何创建菜单

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;

}

}

如何用SetMenuItemInfo实现ModifyMenu的功能

'SetMenuItemInfo用法

Private?Const?MFT_RADIOCHECK?=?H200

Private?Const?MIIM_TYPE?=?H10

Private?Const?MIIM_SUBMENU?=?H4

Private?Type?MENUITEMINFO

??cbSize?As?Long

??fMask?As?Long

??fType?As?Long

??fState?As?Long

??wID?As?Long

??hSubMenu?As?Long

??hbmpChecked?As?Long

??hbmpUnchecked?As?Long

??dwItemData?As?Long

??dwTypeData?As?String

??cch?As?Long

End?Type

Private?Declare?Function?GetMenu?Lib?"user32"?(ByVal?hwnd?As?Long)?As?Long

Private?Declare?Function?GetMenuItemInfo?Lib?"user32"?Alias?"GetMenuItemInfoA"?(ByVal?hMenu?As?Long,?ByVal?un?As?Long,?ByVal?b?As?Boolean,?lpmii?As?MENUITEMINFO)?As?Long

Private?Declare?Function?SetMenuItemInfo?Lib?"user32"?Alias?"SetMenuItemInfoA"?(ByVal?hMenu?As?Long,?ByVal?uItem?As?Long,?ByVal?fByPosition?As?Long,?lpmii?As?MENUITEMINFO)?As?Long

Private?Declare?Function?GetSubMenu?Lib?"user32"?(ByVal?hMenu?As?Long,?ByVal?nPos?As?Long)?As?Long

Private?Sub?Form_Load()

????'URL:?

????'E-Mail:?KPDTeam@allapi.net

????Dim?hMenu?As?Long,?hSubMenu?As?Long,?MII?As?MENUITEMINFO

????'get?the?handle?of?the?current?menu

????hMenu?=?GetMenu(Me.hwnd)

????'get?the?handle?of?the?first?submenu

????hSubMenu?=?GetSubMenu(hMenu,?0)

????'initialize?the?structure

????MII.cbSize?=?Len(MII)

????MII.fMask?=?MIIM_SUBMENU

????'retrieve?information?about?the?menu?item

????GetMenuItemInfo?hSubMenu,?0,?True,?MII

????If?MII.hSubMenu??0?Then

????????MsgBox?"The?specified?menu?item?has?a?submenu."

????Else

????????MsgBox?"The?specified?menu?item?doesn't?have?a?submenu."

????End?If

????'display?checked?menu?items?using?a?radio-button?mark?instead?of?a?check?mark

????MII.fMask?=?MIIM_TYPE

????MII.fType?=?MFT_RADIOCHECK

????MII.dwTypeData?=?mnuFileMenuItem.Caption

????SetMenuItemInfo?hSubMenu,?0,?True,?MII

End?Sub

Private?Sub?mnuFileMenuItem_Click()

????'if?checked?then?uncheck

????'if?unchecked?then?check

????mnuFileMenuItem.Checked?=?Not?(mnuFileMenuItem.Checked)

End?Sub

易语言,API-取菜单条目信息,怎么用?

1、打开易语言,新建一个windows窗口程序。

2、在启动窗口内,右键点击菜单编辑器。

3、在编辑器内,主菜单是没有......这样的6个点的,而这个主菜单的附属菜单夹才有这样的点。

4、右边有个向右移动,这样就有6个点。

5、在主菜单的标题中(P)的意思是,他的快捷键就是p,以此类推,可以编写,如下图的菜单。

6、最后,一个比较完整的菜单,就设置好了。

(责任编辑:IT教学网)

更多

推荐Mail服务器文章