?? 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><!--文章說明信息結(jié)束//-->
<TABLE border=0 width=600>
<TBODY>
<TR>
<TD align=left><BR><FONT face=宋體
size=2>菜單控制<BR>為什么即使調(diào)用EnableMenuItem菜單項(xiàng)后,菜單項(xiàng)還處于禁止?fàn)顟B(tài) <BR><BR>需要將CFrameWnd::
m_bAutomenuEnable設(shè)置為FALSE,如果該數(shù)據(jù)成員為TRUE(缺省值),工作框?qū)⒆詣拥亟箾]有ON_UPDATE_COMMAND_UI或者ON_COMMAND的菜單項(xiàng)。<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>如何給系統(tǒng)菜單添加一個菜單項(xiàng) <BR><BR>給系統(tǒng)菜單添加一個菜單項(xiàng)需要進(jìn)行下述三個步驟:<BR><BR>首先,使用Resource
Symbols對話(在View菜單中選擇Resource
Symbols...<BR><BR>可以顯示該對話)定義菜單項(xiàng)ID,該ID應(yīng)大于0x0F而小于0xF000;<BR><BR>其次,調(diào)用CWnd::GetSystemMenu獲取系統(tǒng)菜單的指針并調(diào)用CWnd::
Appendmenu將菜單項(xiàng)添加到菜單中。下例給系統(tǒng)菜單添加兩個新的菜單項(xiàng):<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>現(xiàn)在,選擇系統(tǒng)菜單項(xiàng)時用戶應(yīng)進(jìn)行檢測。使用ClassWizard處理<BR><BR>WM_SYSCOMMAND消息并檢測用戶菜單的nID參數(shù):<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>最后,一個設(shè)計(jì)良好的UI應(yīng)用程序應(yīng)當(dāng)在系統(tǒng)菜單項(xiàng)加亮?xí)r在狀態(tài)條顯示一個幫助信息,這可以通過增加一個包含系統(tǒng)菜單基ID的串表的入口來實(shí)現(xiàn)。<BR><BR><BR><BR>如何確定頂層菜單所占據(jù)的菜單行數(shù) <BR><BR>這可以通過簡單的減法和除法來實(shí)現(xiàn)。首先,用戶需要計(jì)算主框窗口的高度和客戶區(qū);其次,從主框窗口的高度中減去客戶區(qū)、框邊界以及標(biāo)題的高度;最后,除以菜單欄的高度。下例成員函數(shù)是一個計(jì)算主框菜單所占據(jù)的行數(shù)的代碼實(shí)現(xiàn)。<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>設(shè)置字體顏色。<BR>設(shè)置高亮度顏色。<BR>設(shè)置高亮度時的風(fēng)格。<BR>設(shè)置選中時和在普通狀態(tài)下的菜單顯示的圖標(biāo)。<BR>設(shè)置顯示圖標(biāo)大小。<BR>在CCustomMenu中定義了結(jié)構(gòu)MENUDATA,你必須根據(jù)你的需要填充該結(jié)構(gòu),并且在增加菜單時提供該結(jié)構(gòu)的指針(調(diào)用AppendMenu,InsertMenu)。下面是一個例子:<BR><BR>1、定義CCustomMenu的實(shí)例,和MENUDATA結(jié)構(gòu)變量。<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、調(diào)用CreateMenu()設(shè)置有關(guān)參數(shù)。<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、設(shè)置MENUDATA變量,并增加菜單項(xiàng)。<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(...)函數(shù)。<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>下面的函數(shù)將幫助你設(shè)置菜單屬性。<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 =
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -