随笔-145  评论-173  文章-70  trackbacks-0

==============================================第二章===================================================

1.标记菜单的设计,如何初始化一个菜单,标记它是否选中。。
范例中,初始化某个菜单项,并在它的前面打钩。

实现方法:
在CMainFrame中的OnCreate()函数中return 0前面添加代码:
/*
GetMenu()是获得当前窗口的菜单,而GetSubMenu则是获得子菜单,其中参数为0表示的是第一个的,下面的CheckMenuItem则是标记或者取消
弹出的菜单,注意的是函数的第一个参数还是项数,后面的那个MF_BYPOSITION|MF_CHECKED则表示如何标记以及如何表示
*/
 GetMenu()->GetSubMenu(0)->CheckMenuItem(2,MF_BYPOSITION|MF_CHECKED); //初始化的时候将对应的菜单项打勾
其中,各个子函数的意义需要理解,后面可能会用到。


2.默认菜单中的字体粗体显示。如何实现粗体显示一个菜单中的项,这个作用当然是让用户知道默认的选择项是什么了。

实现方法:
在CMainFrame中的OnCreate函数中添加代码:

 GetMenu()->GetSubMenu(0)->SetDefaultItem(2,TRUE);
 GetMenu()->GetSubMenu(2)->SetDefaultItem(ID_VIEW_STATUS_BAR,FALSE);
其中关键就是函数>SetDefaultItem的使用,它有两个参数,第一个和第二个的是由联系的。
当第二个参数是FALSE的时候,第一个项表示对应的索引值(注意索引值是从0开始的)
当第二个参数是TRUE的时候,第一个项表示的是对应的ID表示。


3.图形标记菜单,如何实现菜单中由图形的显示方式。
实现方式:
 m_bitmap1.LoadBitmap(IDB_BITMAP1);
 GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(0,MF_BYPOSITION,&m_bitmap1,&m_bitmap1);
 m_bitmap2.LoadBitmap(IDB_BITMAP2);
 GetMenu()->GetSubMenu(0)->SetMenuItemBitmaps(1,MF_BYPOSITION,&m_bitmap2,&m_bitmap2);
其中,变量m_bitmap1,m_bitmap2是自己在CMainFrame中添加的成员变量CBitmap类型的。然后在资源文件中添加了两个Bitmap资源。
最后,在使用函数SetMenuItemBitmaps来导入到菜单中。。
介绍函数SetMenuItemBitmaps的使用方法:
BOOL SetMenuItemBitmaps( UINT nPosition, UINT nFlags, const CBitmap* pBmpUnchecked, const CBitmap* pBmpChecked );
nPosition

Specifies the menu item to be changed. The nFlags parameter can be used to interpret nPosition in the following ways:

nFlags

Specifies how nPosition is interpreted.

pBmpUnchecked

Specifies the bitmap to use for menu items that are not checked.

pBmpChecked

Specifies the bitmap to use for menu items that are checked.
注意:在设计位图的时候,需要将大小设计为13 X 13像素的,否则显示会出现问题。


4.如何使得菜单项不可用,屏蔽某些菜单,使得点击的时候没有相应的函数和操作可用。
实现代码:
 m_bAutoMenuEnable = FALSE; //在CMainFrame的构造函数中设置,必须,否则无效
在OnCreate函数的代码体中加入:
 GetMenu()->GetSubMenu(0)->EnableMenuItem(1,MF_BYPOSITION|MF_DISABLED|MF_GRAYED); //使得对应的菜单项无效。

 

5.如何使得菜单消失?通过函数SetMenu(NULL)实现。
添加一个菜单,然后建立想要的消息函数,在函数体内加入代码,如下:
void CMainFrame::OnDis()
{
 // TODO: Add your command handler code here
 SetMenu(NULL);
}
注意,关于此类操作的函数,都是由CMainFrame作为主类的,函数都是在这个下面的操作。前面的基于菜单的操作也是,因为菜单的操作也是总体上

都是整体的一个操作。所以需要注意类属关系。


6.使得单个菜单项失效或者生效。通过添加ID对应的消息,使得菜单生效和失效。
看代码:
void CMainFrame::OnUpdateFileOpen(CCmdUI* pCmdUI)
{
 // TODO: Add your command update UI handler code here
 if(ID_FILE_OPEN == pCmdUI->m_nID)
  pCmdUI->Enable(FALSE); //失效
}

void CMainFrame::OnUpdateEditCut(CCmdUI* pCmdUI)
{
 // TODO: Add your command update UI handler code here
// if(ID_EDIT_CUT == pCmdUI->m_nID)
//  pCmdUI->Enable(TRUE); //生效
}

void CMainFrame::OnUpdateFileMruFile1(CCmdUI* pCmdUI)
{
 // TODO: Add your command update UI handler code here
 
 if(ID_FILE_MRU_FILE1 == pCmdUI->m_nID)
  pCmdUI->Enable(TRUE); //生效
}
对于某个具体的菜单项,在ClassWizard中CMainFrame中,找到ID对应的消息,然后添加函数,注意是
CN_UPDATE_COMMAND_UI消息,然后在函数中,使用上面的通用方法判断。
if( ID == pCmdUI->m_nID)
 设置为生效或者失效。

从而,可以实现单个菜单项的生效或者失效。注意,前面的屏蔽菜单和这个的作用是相似的。不过函数不同,前面的那个是EnableMenuItem选项。

 

posted on 2010-02-10 16:18 deercoder 阅读(696) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理