📄 csdn_文档中心_vc++的菜单控制和自绘菜单。.htm
字号:
<TR>
<TD align=middle height=5></TD>
<TD align=middle width=500></TD></TR>
<TR>
<TD align=middle bgColor=#003399 height=10><FONT
color=#ffffff>出处</FONT></TD>
<TD height=10> <A
href="http://www.chinaasp.com/sqlbbs/showEssence.asp?id=830">http://www.chinaasp.com/sqlbbs/showEssence.asp?id=830</A></TD></TR>
<TR>
<TD align=middle height=10></TD>
<TD height=10></TD></TR></TBODY></TABLE><!--文章说明信息结束//-->
<TABLE border=0 width=600>
<TBODY>
<TR>
<TD align=left><BR><FONT face=宋体
size=2>菜单控制<BR>为什么即使调用EnableMenuItem菜单项后,菜单项还处于禁止状态 <BR><BR>需要将CFrameWnd::
m_bAutomenuEnable设置为FALSE,如果该数据成员为TRUE(缺省值),工作框将自动地禁止没有ON_UPDATE_COMMAND_UI或者ON_COMMAND的菜单项。<BR><BR>//Disable
MFC from automatically disabling menu
items.<BR><BR>m_bAuoMenuEnable=FALSE;<BR><BR>//Now enable the menu
item.<BR><BR>CMenu* pMenu=GetMenu ();<BR><BR>ASSERT_VALID
(pMenu);<BR><BR>pMenu->EnableMenuItem (ID_MENU_ITEM,MF_BYCOMMAND
|
MF_ENABLED);<BR><BR><BR><BR>如何给系统菜单添加一个菜单项 <BR><BR>给系统菜单添加一个菜单项需要进行下述三个步骤:<BR><BR>首先,使用Resource
Symbols对话(在View菜单中选择Resource
Symbols...<BR><BR>可以显示该对话)定义菜单项ID,该ID应大于0x0F而小于0xF000;<BR><BR>其次,调用CWnd::GetSystemMenu获取系统菜单的指针并调用CWnd::
Appendmenu将菜单项添加到菜单中。下例给系统菜单添加两个新的菜单项:<BR><BR>int CMainFrame::
OnCreate (LPCREATESTRUCT
lpCreateStruct)<BR><BR>{<BR><BR>…<BR><BR>//Make sure system menu
item is in the right range.<BR><BR>ASSERT (IDM_MYSYSITEM
&0xFFF0)==IDM_MYSYSITEM);<BR><BR>ASSERT
(IDM-MYSYSITEM<0xF000);<BR><BR>//Get pointer to system
menu.<BR><BR>CMenu* pSysmenu=GetSystemmenu
(FALSE);<BR><BR>ASSERT_VALID (pSysMenu);<BR><BR>//Add a separator
and our menu item to system menu.<BR><BR>CString StrMenuItem (_T
("New menu item"));<BR><BR>pSysMenu->Appendmenu
(MF_SEPARATOR);<BR><BR>pSysMenu->AppendMenu (MF_STRING,
IDM_MYSYSITEM,
strMenuitem);<BR><BR>…<BR><BR>}<BR><BR>现在,选择系统菜单项时用户应进行检测。使用ClassWizard处理<BR><BR>WM_SYSCOMMAND消息并检测用户菜单的nID参数:<BR><BR>void
CMainFrame:: OnSysCommand (UINT nID,LPARAM
lParam)<BR><BR>{<BR><BR>//Determine if our system menu item was
selected.<BR><BR>if ( (nID &
0xFFF0)==IDM_MYSYSITEM)<BR><BR>{<BR><BR>//TODO-process system menu
item<BR><BR>}<BR><BR>else<BR><BR>CMDIFrameWnd:: OnSysCommand (nID,
lParam);<BR><BR>}<BR><BR>最后,一个设计良好的UI应用程序应当在系统菜单项加亮时在状态条显示一个帮助信息,这可以通过增加一个包含系统菜单基ID的串表的入口来实现。<BR><BR><BR><BR>如何确定顶层菜单所占据的菜单行数 <BR><BR>这可以通过简单的减法和除法来实现。首先,用户需要计算主框窗口的高度和客户区;其次,从主框窗口的高度中减去客户区、框边界以及标题的高度;最后,除以菜单栏的高度。下例成员函数是一个计算主框菜单所占据的行数的代码实现。<BR><BR>int
CMainFrame:: GetMenuRows ()<BR><BR>{<BR><BR>CRect
rcFrame,rcClient;<BR><BR>GetWindowRect
(rcFrame);<BR><BR>GetClientRect (rcClient);<BR><BR>return
(rcFrame.Height () -rcClient.Height ()-<BR><BR>:: GetSystemMetrics
(SM_CYCAPTION) -<BR><BR>(:: getSystemMetrics (SM_CYFRAME) *2))
/<BR><BR>:: GetSystemMetrics
(SM_CYMENU);<BR><BR>}<BR><BR><BR><BR><BR>自绘菜单<BR>闻怡洋译
<BR><BR>在这里提供一个C++类(CCustomMenu),该类是CMenu的子类,并且拥有自绘能力。它可以向你提供以下的功能:<BR><BR>设置字体颜色。<BR>设置高亮度颜色。<BR>设置高亮度时的风格。<BR>设置选中时和在普通状态下的菜单显示的图标。<BR>设置显示图标大小。<BR>在CCustomMenu中定义了结构MENUDATA,你必须根据你的需要填充该结构,并且在增加菜单时提供该结构的指针(调用AppendMenu,InsertMenu)。下面是一个例子:<BR><BR>1、定义CCustomMenu的实例,和MENUDATA结构变量。<BR><BR> CCustomMenu
m_cCustomMenu;<BR> MENUDATA menuData [8]; //
as many menu items are present , You should be able to
use<BR> //new
and do the
same<BR>2、调用CreateMenu()设置有关参数。<BR> m_customMenu.CreateMenu
();<BR> m_customMenu.SetIconSize (25,25);
//This is to set the size of the
Icon.<BR> //
This should be used only once for any
menu<BR> // in order to resize it, destroy
and create the menu again with different
size.<BR> m_customMenu.SetHighlightStyle
(Normal); //Or TextOnly, if you want
the<BR> // background color to remain the
same<BR> // and the Text color to change to
the Highlight
color.<BR> // The
following setXXXColor sets the menu colors. If you dont want to
change any, Dont call these member
functions.<BR> m_customMenu.SetTextColor
(RGB
(255,0,0));<BR> m_customMenu.SetBackColor
(RGB
(255,255,255));<BR> m_customMenu.SetHighlightColor
(RGB
(0,0,255));<BR>3、设置MENUDATA变量,并增加菜单项。<BR> lstrcpy
(menuData[0].menuText ,
"text1");<BR> menuData[0].menuIconNormal=
IDI_ICON1;<BR> m_customMenu.AppendMenu
(MF_OWNERDRAW,3,(LPCTSTR)menuData);<BR><BR>3、在你的窗口中重载OnMeasureItem(...)函数。<BR>void
CMyView::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT
lpMeasureItemStruct)<BR>{<BR> if (
lpMeasureItemStruct->CtlType == ODT_MENU
&&<BR> IsMenu((HMENU)lpMeasureItemStruct->itemID)
&&<BR> (lpMeasureItemStruct->itemID
== (UINT)m_hMenuSub)
)<BR> {<BR> m_customMenu.MeasureItem
(lpMeasureItemStruct);<BR> }<BR> else<BR> //
let MFC's self-drawing handle
it<BR> CView::OnMeasureItem(nIDCtl,
lpMeasureItemStruct);<BR>}<BR><BR>下面的函数将帮助你设置菜单属性。<BR><BR> void
SetTextColor (COLORREF );<BR> void
SetBackColor (COLORREF);<BR> void
SetHighlightColor (COLORREF);<BR> void
SetIconSize (int, int);<BR> void
SetHighlightStyle (HIGHLIGHTSTYLE ); // HIGHLIGHTSTYLE : enum
{Normal, TextOnly}<BR> void
SetHighlightTextColor
(COLORREF);<BR><BR><BR><BR>下面是文件代码:<BR>//*************************************************************************<BR>//
CustomMenu.h : header
file<BR>//<BR><BR>#if<BR>!defined(AFX_CUSTOMMENU_H__FE5B01C3_1E02_11D1_B87A_0060979CDF6D__INCLUDED_)<BR>#define
AFX_CUSTOMMENU_H__FE5B01C3_1E02_11D1_B87A_0060979CDF6D__INCLUDED_<BR><BR>#if
_MSC_VER >= 1000<BR>#pragma once<BR>#endif // _MSC_VER >=
1000<BR>class
MENUDATA<BR>{<BR>public:<BR> MENUDATA () {
menuIconNormal = -1; menuIconSelected =
-1;};<BR> char
menuText[32];<BR> UINT
menuIconNormal;<BR> UINT
menuIconSelected;<BR>};<BR><BR><BR>typedef enum {Normal,TextOnly}
HIGHLIGHTSTYLE;<BR><BR>////////////////////////////////////////////////<BR>//<BR>//
CCustomMenu window<BR><BR>class CCustomMenu : public
CMenu<BR>{<BR>//
Construction<BR>public:<BR> CCustomMenu();<BR><BR>//
Attributes<BR>public:<BR><BR>// Operations<BR>public:<BR><BR>//
Overrides<BR> // ClassWizard generated
virtual function
overrides<BR> //{{AFX_VIRTUAL(CCustomMenu)<BR> //}}AFX_VIRTUAL<BR><BR>//
Implementation<BR>public:<BR> virtual
~CCustomMenu();<BR> virtual void DrawItem(
LPDRAWITEMSTRUCT);<BR> virtual void
MeasureItem( LPMEASUREITEMSTRUCT );<BR> void
SetTextColor (COLORREF );<BR> void
SetBackColor (COLORREF);<BR> void
SetHighlightColor (COLORREF);<BR> void
SetIconSize (int, int);<BR> void
SetHighlightStyle (HIGHLIGHTSTYLE );<BR> void
SetHighlightTextColor (COLORREF);<BR><BR> //
Generated message map
functions<BR>protected:<BR> COLORREF
m_crText;<BR> COLORREF
m_clrBack;<BR> COLORREF
m_clrText;<BR> COLORREF
m_clrHilight;<BR> COLORREF
m_clrHilightText;<BR> LOGFONT
m_lf;<BR> CFont
m_fontMenu;<BR> UINT
m_iMenuHeight;<BR> BOOL
m_bLBtnDown;<BR> CBrush
m_brBackground,m_brSelect;<BR> CPen
m_penBack;<BR> int
m_iconX,m_iconY;<BR> HIGHLIGHTSTYLE
m_hilightStyle;<BR><BR> //{{AFX_MSG(CCustomMenu)<BR> //
NOTE - the ClassWizard will add and remove member functions
here.<BR> //}}AFX_MSG<BR>};<BR><BR>///////////////////////////////////////<BR>//<BR><BR>//{{AFX_INSERT_LOCATION}}<BR>//
Microsoft Developer Studio will insert additional declarations
immediately before the previous line.<BR><BR>#endif
//!defined(AFX_CUSTOMMENU_H__FE5B01C3_1E02_11D1_B87A_0060979CDF6D__INCLUDED_)<BR><BR>//*************************************************************************<BR>//
CustomMenu.cpp : implementation file<BR>//<BR><BR>#include
"stdafx.h"<BR>#include "CustomMenu.h"<BR><BR>#ifdef
_DEBUG<BR>#define new DEBUG_NEW<BR>#undef THIS_FILE<BR>static char
THIS_FILE[] =
__FILE__;<BR>#endif<BR><BR>////////////////////////////////////////////////<BR>//<BR>//
CCustomMenu<BR><BR>CCustomMenu::CCustomMenu()<BR>{<BR> m_clrText
= GetSysColor (COLOR_MENUTEXT);<BR> m_clrBack
= GetSysColor
(COLOR_MENU);<BR> m_brBackground.CreateSolidBrush
(m_clrBack);<BR> m_penBack.CreatePen
(PS_SOLID,0,m_clrBack);<BR> m_crText =
m_clrText;<BR> m_bLBtnDown =
FALSE;<BR> m_iconX = GetSystemMetrics (
SM_CXMENUCHECK);<BR> m_iconY =
GetSystemMetrics (SM_CYMENUCHECK
);<BR><BR> m_clrHilight = GetSysColor
(COLOR_HIGHLIGHT);<BR> m_brSelect.CreateSolidBrush
(m_clrHilight);<BR> m_clrHilightText =
GetSysColor
(COLOR_HIGHLIGHTTEXT);<BR><BR> ZeroMemory
((PVOID) &m_lf,sizeof
(LOGFONT));<BR> NONCLIENTMETRICS
nm;<BR> nm.cbSize = sizeof
(NONCLIENTMETRICS);<BR><BR> //Get the system
metrics for the Captionfromhere<BR> VERIFY
(SystemParametersInfo
(SPI_GETNONCLIENTMETRICS,0,&nm,0));<BR><BR> m_lf
= nm.lfMenuFont;<BR> m_iMenuHeight =
nm.iMenuHeight;<BR> m_fontMenu.CreateFontIndirect
(&m_lf);<BR>}<BR><BR>CCustomMenu::~CCustomMenu()<BR>{<BR> if
((HBRUSH) m_brBackground !=
NULL)<BR> m_brBackground.DeleteObject
();<BR> if ((HFONT)m_fontMenu
!=NULL)<BR> m_fontMenu.DeleteObject
();<BR> if ((HBRUSH)m_brSelect !=
NULL)<BR> m_brSelect.DeleteObject
();<BR>}<BR><BR><BR><BR>////////////////////////////////////////////////<BR>//<BR>//
CCustomMenu message handlers<BR><BR><BR>void CCustomMenu::DrawItem
(LPDRAWITEMSTRUCT
lpDIS)<BR>{<BR> ASSERT(lpDIS !=
NULL);<BR><BR> CDC* pDC =
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -