⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 菜单控制.htm

📁 VC的一些技巧性文档
💻 HTM
📖 第 1 页 / 共 2 页
字号:
</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>&nbsp;&nbsp;&nbsp;&nbsp;m_clrText =  GetSysColor (COLOR_MENUTEXT);<Br>&nbsp;&nbsp;&nbsp;&nbsp;m_clrBack = GetSysColor (COLOR_MENU);<Br>&nbsp;&nbsp;&nbsp;&nbsp;m_brBackground.CreateSolidBrush (m_clrBack);<Br>&nbsp;&nbsp;&nbsp;&nbsp;m_penBack.CreatePen (PS_SOLID,0,m_clrBack);<Br>&nbsp;&nbsp;&nbsp;&nbsp;m_crText = m_clrText;<Br>&nbsp;&nbsp;&nbsp;&nbsp;m_bLBtnDown = FALSE;<Br>&nbsp;&nbsp;&nbsp;&nbsp;m_iconX =		GetSystemMetrics ( SM_CXMENUCHECK);<Br>&nbsp;&nbsp;&nbsp;&nbsp;m_iconY =		GetSystemMetrics (SM_CYMENUCHECK );<Br></Br>&nbsp;&nbsp;&nbsp;&nbsp;m_clrHilight = GetSysColor (COLOR_HIGHLIGHT);<Br>&nbsp;&nbsp;&nbsp;&nbsp;m_brSelect.CreateSolidBrush (m_clrHilight);<Br>&nbsp;&nbsp;&nbsp;&nbsp;m_clrHilightText = GetSysColor (COLOR_HIGHLIGHTTEXT);<Br></Br>&nbsp;&nbsp;&nbsp;&nbsp;ZeroMemory ((PVOID) &m_lf,sizeof (LOGFONT));<Br>&nbsp;&nbsp;&nbsp;&nbsp;NONCLIENTMETRICS nm;<Br>&nbsp;&nbsp;&nbsp;&nbsp;nm.cbSize = sizeof (NONCLIENTMETRICS);<Br></Br>&nbsp;&nbsp;&nbsp;&nbsp;//Get the system metrics for the Captionfromhere<Br>&nbsp;&nbsp;&nbsp;&nbsp;VERIFY (SystemParametersInfo (SPI_GETNONCLIENTMETRICS,0,&nm,0));<Br></Br>&nbsp;&nbsp;&nbsp;&nbsp;m_lf =  nm.lfMenuFont;<Br>&nbsp;&nbsp;&nbsp;&nbsp;m_iMenuHeight = nm.iMenuHeight;<Br>&nbsp;&nbsp;&nbsp;&nbsp;m_fontMenu.CreateFontIndirect (&m_lf);<Br>}<Br></Br>CCustomMenu::~CCustomMenu()<Br>{<Br>&nbsp;&nbsp;&nbsp;&nbsp;if ((HBRUSH) m_brBackground != NULL)<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_brBackground.DeleteObject ();<Br>&nbsp;&nbsp;&nbsp;&nbsp;if ((HFONT)m_fontMenu !=NULL)<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_fontMenu.DeleteObject ();<Br>&nbsp;&nbsp;&nbsp;&nbsp;if ((HBRUSH)m_brSelect != NULL)<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; m_brSelect.DeleteObject ();<Br>}<Br></Br></Br></Br>////////////////////////////////////////////////<Br>//<Br>// CCustomMenu message handlers<Br></Br></Br>void CCustomMenu::DrawItem (LPDRAWITEMSTRUCT lpDIS)<Br>{<Br>&nbsp;&nbsp;&nbsp;&nbsp;ASSERT(lpDIS != NULL);<Br></Br>&nbsp;&nbsp;&nbsp;&nbsp;CDC* pDC = CDC::FromHandle(lpDIS->hDC);<Br>&nbsp;&nbsp;&nbsp;&nbsp;CRect rect;<Br>&nbsp;&nbsp;&nbsp;&nbsp;HICON hIcon;<Br>&nbsp;&nbsp;&nbsp;&nbsp;COLORREF crText = m_crText;<Br>&nbsp;&nbsp;&nbsp;&nbsp;// draw the colored rectangle portion<Br>&nbsp;&nbsp;&nbsp;&nbsp;rect.CopyRect(&lpDIS->rcItem);<Br></Br>&nbsp;&nbsp;&nbsp;&nbsp;// draw the up/down/focused/disabled state<Br></Br>&nbsp;&nbsp;&nbsp;&nbsp;UINT action = lpDIS->itemAction;<Br>&nbsp;&nbsp;&nbsp;&nbsp;UINT state = lpDIS->itemState;<Br>&nbsp;&nbsp;&nbsp;&nbsp;CString strText;<Br>&nbsp;&nbsp;&nbsp;&nbsp;LOGFONT lf;<Br>&nbsp;&nbsp;&nbsp;&nbsp;lf = m_lf;<Br></Br>&nbsp;&nbsp;&nbsp;&nbsp;CFont dispFont;<Br>&nbsp;&nbsp;&nbsp;&nbsp;CFont *pFont;<Br>&nbsp;&nbsp;&nbsp;&nbsp;//GetWindowText(strText);<Br>&nbsp;&nbsp;&nbsp;&nbsp;if (lpDIS->itemData != NULL)<Br>&nbsp;&nbsp;&nbsp;&nbsp;{<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strText = (((MENUDATA*) (lpDIS->itemData))->menuText);<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((((MENUDATA *)(lpDIS->itemData))->menuIconNormal) == -1)<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hIcon = NULL;<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if (state & ODS_SELECTED)<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((((MENUDATA *)(lpDIS->itemData))->menuIconSelected) != -1)<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hIcon = AfxGetApp ()->LoadIcon (((MENUDATA *)(lpDIS->itemData))->menuIconSelected);<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hIcon = AfxGetApp()->LoadIcon (((MENUDATA*)(lpDIS->itemData))->menuIconNormal);<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hIcon = AfxGetApp()->LoadIcon (((MENUDATA*)(lpDIS->itemData))->menuIconNormal);<Br></Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TRACE1 ("Draw for %s\n", strText);<Br>&nbsp;&nbsp;&nbsp;&nbsp;}<Br>&nbsp;&nbsp;&nbsp;&nbsp;else<Br>&nbsp;&nbsp;&nbsp;&nbsp;{<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strText.Empty();<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hIcon = NULL;<Br>&nbsp;&nbsp;&nbsp;&nbsp;}<Br></Br>&nbsp;&nbsp;&nbsp;&nbsp;if ( (state & ODS_SELECTED) )<Br>&nbsp;&nbsp;&nbsp;&nbsp;{<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// draw the down edges<Br></Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CPen *pOldPen = pDC->SelectObject (&m_penBack);<Br></Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//You need only Text highlight and thats what you get<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (m_hilightStyle != Normal)<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDC->FillRect (rect,&m_brBackground);<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDC->FillRect (rect,&m_brSelect);<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<Br></Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDC->SelectObject (pOldPen);<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDC->Draw3dRect (rect,GetSysColor (COLOR_3DHILIGHT),GetSysColor(COLOR_3DSHADOW));<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lf.lfWeight = FW_BOLD;<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((HFONT)dispFont != NULL)<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dispFont.DeleteObject ();<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dispFont.CreateFontIndirect (&lf);<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;crText = m_clrHilightText;<Br></Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//While selected move the text a bit<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TRACE0 ("SELECT,SELECTED\n");<Br>&nbsp;&nbsp;&nbsp;&nbsp;}<Br>&nbsp;&nbsp;&nbsp;&nbsp;else<Br>&nbsp;&nbsp;&nbsp;&nbsp;{<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CPen *pOldPen = pDC->SelectObject (&m_penBack);<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDC->FillRect (rect,&m_brBackground);<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDC->SelectObject (pOldPen);<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;// draw the up edges<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDC->Draw3dRect (rect,m_clrBack,m_clrBack);<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ((HFONT)dispFont != NULL)<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dispFont.DeleteObject ();<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dispFont.CreateFontIndirect (&lf); //Normal<Br></Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TRACE0 ("SELECT, NORMAL\n");<Br>&nbsp;&nbsp;&nbsp;&nbsp;}<Br></Br>&nbsp;&nbsp;&nbsp;&nbsp;// draw the text if there is any<Br>&nbsp;&nbsp;&nbsp;&nbsp;//We have to paint the text only if the image is nonexistant<Br>&nbsp;&nbsp;&nbsp;&nbsp;if (hIcon != NULL)<Br>&nbsp;&nbsp;&nbsp;&nbsp;{<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(DrawIconEx (pDC->GetSafeHdc(),rect.left,rect.top,hIcon,<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(m_iconX)?m_iconX:32,(m_iconY)?m_iconY:32,0,NULL,DI_NORMAL))<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TRACE0("Wrote the icon successfully\n");<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TRACE0 ("SORRY.NOGO\n");<Br>&nbsp;&nbsp;&nbsp;&nbsp;}<Br>&nbsp;&nbsp;&nbsp;&nbsp;//This is needed always so that we can have the space for check marks<Br>&nbsp;&nbsp;&nbsp;&nbsp;rect.left = rect.left +((m_iconX)?m_iconX:32);<Br></Br>&nbsp;&nbsp;&nbsp;&nbsp;if ( !strText.IsEmpty())<Br>&nbsp;&nbsp;&nbsp;&nbsp;{<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//		pFont->GetLogFont (&lf);<Br></Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;int		  iOldMode = pDC->GetBkMode();<Br></Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDC->SetBkMode( TRANSPARENT);<Br></Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDC->SetTextColor( crText);<Br></Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pFont = pDC->SelectObject (&dispFont);<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TRACE1( "About To DrawText %s\n",strText);<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDC->DrawText (strText,rect,DT_LEFT|DT_SINGLELINE|DT_VCENTER);<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TRACE0("Done\n");<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDC->SetBkMode( iOldMode );<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pDC->SelectObject (pFont); //set it to the old font<Br>&nbsp;&nbsp;&nbsp;&nbsp;}<Br>&nbsp;&nbsp;&nbsp;&nbsp;dispFont.DeleteObject ();<Br>}<Br></Br>void CCustomMenu::MeasureItem( LPMEASUREITEMSTRUCT lpMIS )<Br>{<Br>&nbsp;&nbsp;&nbsp;&nbsp;CDC *pDC = AfxGetApp()->m_pMainWnd->GetDC();<Br>&nbsp;&nbsp;&nbsp;&nbsp;CFont* pFont = pDC->SelectObject (&m_fontMenu);<Br>&nbsp;&nbsp;&nbsp;&nbsp;int iconX = 0,iconY= 0;<Br>&nbsp;&nbsp;&nbsp;&nbsp;TEXTMETRIC tm;<Br>&nbsp;&nbsp;&nbsp;&nbsp;pDC->GetTextMetrics (&tm);<Br>&nbsp;&nbsp;&nbsp;&nbsp;pDC->SelectObject (pFont);<Br>&nbsp;&nbsp;&nbsp;&nbsp;AfxGetApp()->m_pMainWnd->ReleaseDC (pDC);<Br></Br>&nbsp;&nbsp;&nbsp;&nbsp;if (m_iconX)<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iconX = m_iconX;<Br>&nbsp;&nbsp;&nbsp;&nbsp;if (m_iconY)<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iconY = m_iconY;<Br></Br>&nbsp;&nbsp;&nbsp;&nbsp;lpMIS->itemWidth = iconX + tm.tmAveCharWidth *  lstrlen(((MENUDATA*)(lpMIS->itemData))->menuText) +10;<Br>&nbsp;&nbsp;&nbsp;&nbsp;lpMIS->itemHeight = (iconY > (m_iMenuHeight+1))?iconY:m_iMenuHeight + 1;<Br>}<Br></Br>void CCustomMenu::SetIconSize (int width, int height)<Br>{<Br>&nbsp;&nbsp;&nbsp;&nbsp;m_iconX = width;<Br>&nbsp;&nbsp;&nbsp;&nbsp;m_iconY = height;<Br>}<Br></Br>void CCustomMenu::SetTextColor (COLORREF clrText)<Br>{<Br>&nbsp;&nbsp;&nbsp;&nbsp;m_crText = clrText;<Br>}<Br></Br>void CCustomMenu::SetBackColor (COLORREF clrBack)<Br>{<Br>&nbsp;&nbsp;&nbsp;&nbsp;m_clrBack = clrBack;<Br>&nbsp;&nbsp;&nbsp;&nbsp;if ((HBRUSH)m_brBackground != NULL)<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_brBackground.DeleteObject ();<Br>&nbsp;&nbsp;&nbsp;&nbsp;m_brBackground.CreateSolidBrush (clrBack);<Br>}<Br></Br>void CCustomMenu::SetHighlightColor (COLORREF clrHilight)<Br>{<Br>&nbsp;&nbsp;&nbsp;&nbsp;m_clrHilight = clrHilight;<Br>&nbsp;&nbsp;&nbsp;&nbsp;if ((HBRUSH)m_brSelect != NULL)<Br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_brSelect.DeleteObject ();<Br>&nbsp;&nbsp;&nbsp;&nbsp;m_brSelect.CreateSolidBrush (clrHilight);<Br>}<Br></Br>void CCustomMenu::SetHighlightTextColor (COLORREF clrHilightText)<Br>{<Br>&nbsp;&nbsp;&nbsp;&nbsp;m_clrHilightText = clrHilightText;<Br>}<Br></Br></Br>void CCustomMenu::SetHighlightStyle (HIGHLIGHTSTYLE hilightStyle)<Br>{<Br>&nbsp;&nbsp;&nbsp;&nbsp;m_hilightStyle = hilightStyle;<Br>}<Br></Br></Br> <Br></Br> <Br></p></td></tr></table><p align="center"><img src="/logo.gif" align="center"><a href="/co/index.htm">北京美达美科技有限公司</a> 版权所有: 1998-1999</a></p></body></html>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -