资源ID命名规则:ID+类型+名字
比如:在菜单栏上加一项Test,ID为 IDM_Test 光标(cursor)资源以IDC_ 开头,图标(icon)资源以 IDI_开头,菜单 IDM_开头
响应菜单项命令的顺序依次是:视类、文档类、框架类、应用程序类;<标记1>
菜单命令的消息:
1.除WM_COMMAND之外,所有以WM_开头的消息都是标准消息,从CWnd派生的类,都可以接受这类消息
2.来自菜单、加速键或工具栏按钮的消息。这类消息以WM_COMMAND形式呈现,在MFC中,通过ID来区分不同的命令消息。
# 凡是从CWnd派生的类,他们既可以接收标准消息,也可以接收命令消息和通告消息;从CCmdTarget派生的类,则只能接收命令消息和通告消息,不能接受标准消息。
在.cpp中,ON_COMMAND(IDM_TEST,&CMainFrame::OnTest) 将菜单ID和响应函数关联在一起;
菜单命令消息路由的具体过程:
当点击某个菜单项时,最先接收到这个菜单命令消息的是框架类。框架类将把接收到的这个消息交给视类。视类根据命令消息映射机制查找自身是否对此消息进行了响应,如果响应了,就调用响应函数对这个消息进行处理,消息路由过程结束;如果视类没有对此命令消息做出响应,就交由文档类,文档类根据命令消息映射机制,查找自身…..,文档类将该消息还给视觉类,视觉类再还给框架类……,框架类交给应用程序类。<遵循上述顺序规则><标记1>
Cmenu 菜单类:Cmenu* GetMenu() const 指向菜单栏的指针
Cmenu*GetSubMenu(int nPos) const 获取指向子菜单栏的指针
UINTCheckMenuItem(UINT nIDCheckItem,UINT nCheck) 获取指定菜单
SetDefaultItem(1, TRUE); 设置默认菜单项
修改菜单(在框架类中)项的一些属性,在菜单创建函数 OnCreate() 中完成
GetMenu()->GetSubMenu(0)->CheckMenuItem(0,MF_CHECKED | MF_BYPOSITION); 将(0,0)项菜单项设置为标记菜单, 0可以用ID替换
CString str;
str.Format(_T("x=%d,y=%d"), GetSystemMetrics(SM_CXMENUCHECK),GetSystemMetrics(SM_CYMENUCHECK));
MessageBox(str); 获取位图尺寸
m_bitmap.LoadBitmapW(IDB_BITMAP1);
GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(0, MF_BYPOSITION, &m_bitmap, &m_bitmap); 菜单项设置位图图标
GetMenu()->GetSubMenu(0)->SetDefaultItem(1,TRUE); 设置默认菜单项
注意:分隔栏在子菜单中是占据索引位置;一个子菜单只能有一个默认菜单项
CString::Format
void Format( LPCTSTRlpszFormat, ... );
void Format( UINTnFormatID, ... );
参数:
lpszFormat | 一个格式控制字符串。 |
nFormatID | 包含格式控制字符串的字符串资源标识符。 |
说明:
此成员函数用来将格式化数据写入一个CString中,其方法就像sprintf函数向一个C-风格的字符数组中格式化输出数据一样。这个成员函数在CString中格式化并存储一系列字符和值。根据lpszFormat中指定的格式或nFormatID标识的字符串资源,函数中的每一个可选参数(如果有)都被转换并输出。
如果此字符串对象本身是作为Format的一个参数,则调用将失败。例如象下面的代码:
CString str ="Some Data";
str.Format("%s%d",str,123); //注意:在参数列表中也使用了str将导致不可预期的结果。
函数功能:该函数将指定的位图与一个菜单项相联系。无论该菜单项是否被选取,系统都将适当的位图显示在菜单项旁边。
函数原型:BOOL SetMenultemBitmaPs(HMENUhMenu,UINT uPosition,UINT uFlags,HBITMAPhBitmapUnchecked,HBITMAP hBitmspChecked);
参数:
hMenu:其菜单项将接受新选取标记位图的菜单的句柄。
uPosition:指定将被修改的菜单项。其含义由参数uFlags决定。
UFlags:指定参数uPosition将如何解释。此参数必须是下列值之一:
MF_BYCOMMAND:表示参数uPosition给出菜单项的标识符。如果MF_BYCOMMAND和MF_POSITION都没被指定,则MF_BYCOMMAND是缺省标志。
MF_BYPOSITION:表示参数uPosition给出菜单项相对于零的位置。
hBitmapUnchecked:当菜单项没被选取时显示的位图的句柄。
hBitmapChecked:当菜单项被选取时显示的位图的句柄。
返回值:如果函数调用成功,返回非零值;如果函数调用失败,返回值是零。若想获得更多的错误信息,请调用GetLastError函数。
备注:如果参数hBitmapUnchecked或hBitmapChecked的值为NULL,系统将不为相应选取状态显示任何位图到菜单项旁边。如果两参数值均为NULL,系统在菜单项被选取时显示缺省的选取标志位图,菜单项未被选取时删除位图。当菜单项被销毁时,位图并没被销毁,需要应用程序来将其销毁。
注:内容总结来自《VC++ 深入详解》 孙鑫 和 CSDN文档上