📄 菜单控制.htm
字号:
</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 = CDC::FromHandle(lpDIS->hDC);<Br> CRect rect;<Br> HICON hIcon;<Br> COLORREF crText = m_crText;<Br> // draw the colored rectangle portion<Br> rect.CopyRect(&lpDIS->rcItem);<Br></Br> // draw the up/down/focused/disabled state<Br></Br> UINT action = lpDIS->itemAction;<Br> UINT state = lpDIS->itemState;<Br> CString strText;<Br> LOGFONT lf;<Br> lf = m_lf;<Br></Br> CFont dispFont;<Br> CFont *pFont;<Br> //GetWindowText(strText);<Br> if (lpDIS->itemData != NULL)<Br> {<Br> strText = (((MENUDATA*) (lpDIS->itemData))->menuText);<Br> if ((((MENUDATA *)(lpDIS->itemData))->menuIconNormal) == -1)<Br> hIcon = NULL;<Br> else if (state & ODS_SELECTED)<Br> {<Br> if ((((MENUDATA *)(lpDIS->itemData))->menuIconSelected) != -1)<Br> hIcon = AfxGetApp ()->LoadIcon (((MENUDATA *)(lpDIS->itemData))->menuIconSelected);<Br> else<Br> hIcon = AfxGetApp()->LoadIcon (((MENUDATA*)(lpDIS->itemData))->menuIconNormal);<Br> }<Br> else<Br> hIcon = AfxGetApp()->LoadIcon (((MENUDATA*)(lpDIS->itemData))->menuIconNormal);<Br></Br> TRACE1 ("Draw for %s\n", strText);<Br> }<Br> else<Br> {<Br> strText.Empty();<Br> hIcon = NULL;<Br> }<Br></Br> if ( (state & ODS_SELECTED) )<Br> {<Br> // draw the down edges<Br></Br> CPen *pOldPen = pDC->SelectObject (&m_penBack);<Br></Br> //You need only Text highlight and thats what you get<Br> if (m_hilightStyle != Normal)<Br> {<Br> pDC->FillRect (rect,&m_brBackground);<Br> }<Br> else<Br> {<Br> pDC->FillRect (rect,&m_brSelect);<Br> }<Br></Br> pDC->SelectObject (pOldPen);<Br> pDC->Draw3dRect (rect,GetSysColor (COLOR_3DHILIGHT),GetSysColor(COLOR_3DSHADOW));<Br> lf.lfWeight = FW_BOLD;<Br> if ((HFONT)dispFont != NULL)<Br> dispFont.DeleteObject ();<Br> dispFont.CreateFontIndirect (&lf);<Br> crText = m_clrHilightText;<Br></Br> //While selected move the text a bit<Br> TRACE0 ("SELECT,SELECTED\n");<Br> }<Br> else<Br> {<Br> CPen *pOldPen = pDC->SelectObject (&m_penBack);<Br> pDC->FillRect (rect,&m_brBackground);<Br> pDC->SelectObject (pOldPen);<Br> // draw the up edges<Br> pDC->Draw3dRect (rect,m_clrBack,m_clrBack);<Br> if ((HFONT)dispFont != NULL)<Br> dispFont.DeleteObject ();<Br> dispFont.CreateFontIndirect (&lf); //Normal<Br></Br> TRACE0 ("SELECT, NORMAL\n");<Br> }<Br></Br> // draw the text if there is any<Br> //We have to paint the text only if the image is nonexistant<Br> if (hIcon != NULL)<Br> {<Br> if(DrawIconEx (pDC->GetSafeHdc(),rect.left,rect.top,hIcon,<Br> (m_iconX)?m_iconX:32,(m_iconY)?m_iconY:32,0,NULL,DI_NORMAL))<Br> TRACE0("Wrote the icon successfully\n");<Br> else<Br> TRACE0 ("SORRY.NOGO\n");<Br> }<Br> //This is needed always so that we can have the space for check marks<Br> rect.left = rect.left +((m_iconX)?m_iconX:32);<Br></Br> if ( !strText.IsEmpty())<Br> {<Br> // pFont->GetLogFont (&lf);<Br></Br> int iOldMode = pDC->GetBkMode();<Br></Br> pDC->SetBkMode( TRANSPARENT);<Br></Br> pDC->SetTextColor( crText);<Br></Br> pFont = pDC->SelectObject (&dispFont);<Br> TRACE1( "About To DrawText %s\n",strText);<Br> pDC->DrawText (strText,rect,DT_LEFT|DT_SINGLELINE|DT_VCENTER);<Br> TRACE0("Done\n");<Br> pDC->SetBkMode( iOldMode );<Br> pDC->SelectObject (pFont); //set it to the old font<Br> }<Br> dispFont.DeleteObject ();<Br>}<Br></Br>void CCustomMenu::MeasureItem( LPMEASUREITEMSTRUCT lpMIS )<Br>{<Br> CDC *pDC = AfxGetApp()->m_pMainWnd->GetDC();<Br> CFont* pFont = pDC->SelectObject (&m_fontMenu);<Br> int iconX = 0,iconY= 0;<Br> TEXTMETRIC tm;<Br> pDC->GetTextMetrics (&tm);<Br> pDC->SelectObject (pFont);<Br> AfxGetApp()->m_pMainWnd->ReleaseDC (pDC);<Br></Br> if (m_iconX)<Br> iconX = m_iconX;<Br> if (m_iconY)<Br> iconY = m_iconY;<Br></Br> lpMIS->itemWidth = iconX + tm.tmAveCharWidth * lstrlen(((MENUDATA*)(lpMIS->itemData))->menuText) +10;<Br> lpMIS->itemHeight = (iconY > (m_iMenuHeight+1))?iconY:m_iMenuHeight + 1;<Br>}<Br></Br>void CCustomMenu::SetIconSize (int width, int height)<Br>{<Br> m_iconX = width;<Br> m_iconY = height;<Br>}<Br></Br>void CCustomMenu::SetTextColor (COLORREF clrText)<Br>{<Br> m_crText = clrText;<Br>}<Br></Br>void CCustomMenu::SetBackColor (COLORREF clrBack)<Br>{<Br> m_clrBack = clrBack;<Br> if ((HBRUSH)m_brBackground != NULL)<Br> m_brBackground.DeleteObject ();<Br> m_brBackground.CreateSolidBrush (clrBack);<Br>}<Br></Br>void CCustomMenu::SetHighlightColor (COLORREF clrHilight)<Br>{<Br> m_clrHilight = clrHilight;<Br> if ((HBRUSH)m_brSelect != NULL)<Br> m_brSelect.DeleteObject ();<Br> m_brSelect.CreateSolidBrush (clrHilight);<Br>}<Br></Br>void CCustomMenu::SetHighlightTextColor (COLORREF clrHilightText)<Br>{<Br> m_clrHilightText = clrHilightText;<Br>}<Br></Br></Br>void CCustomMenu::SetHighlightStyle (HIGHLIGHTSTYLE hilightStyle)<Br>{<Br> 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 + -