|
|
// custmenu.cpp : custom menu
//
// This is a part of the Microsoft Foundation Classes C++ library.
// Copyright (C) 1992-1998 Microsoft Corporation
// All rights reserved.
//
// This source code is only intended as a supplement to the
// Microsoft Foundation Classes Reference and related
// electronic documentation provided with the library.
// See these sources for detailed information regarding the
// Microsoft Foundation Classes product.
#include "stdafx.h"
#include "ctrltest.h"
/////////////////////////////////////////////////////////////////////////////
// for owner draw menus, the CMenu object is embedded in the main frame window
// the CMenu stays attached to the HMENU while it is running so that
// owner draw messages are delegated to this class.
// Since we attach the HMENU to a menu bar (with ModifyMenu below), we
// don't want to delete the menu twice - so we detach on the destructor.
CColorMenu::CColorMenu() { VERIFY(CreateMenu()); }
CColorMenu::~CColorMenu() { Detach(); ASSERT(m_hMenu == NULL); // defaul CMenu::~CMenu will destroy
}
void CColorMenu::AppendColorMenuItem(UINT nID, COLORREF color) { VERIFY(AppendMenu(MF_ENABLED | MF_OWNERDRAW, nID, (LPCTSTR)color)); }
/////////////////////////////////////////////////////////////////////////////
#define COLOR_BOX_WIDTH 20
#define COLOR_BOX_HEIGHT 20
void CColorMenu::MeasureItem(LPMEASUREITEMSTRUCT lpMIS) { // all items are of fixed size
lpMIS->itemWidth = COLOR_BOX_WIDTH; lpMIS->itemHeight = COLOR_BOX_HEIGHT; }
void CColorMenu::DrawItem(LPDRAWITEMSTRUCT lpDIS) { CDC* pDC = CDC::FromHandle(lpDIS->hDC); COLORREF cr = (COLORREF)lpDIS->itemData; // RGB in item data
if (lpDIS->itemAction & ODA_DRAWENTIRE) { // Paint the color item in the color requested
CBrush br(cr); pDC->FillRect(&lpDIS->rcItem, &br); }
if ((lpDIS->itemState & ODS_SELECTED) && (lpDIS->itemAction & (ODA_SELECT | ODA_DRAWENTIRE))) { // item has been selected - hilite frame
COLORREF crHilite = RGB(255-GetRValue(cr), 255-GetGValue(cr), 255-GetBValue(cr)); CBrush br(crHilite); pDC->FrameRect(&lpDIS->rcItem, &br); }
if (!(lpDIS->itemState & ODS_SELECTED) && (lpDIS->itemAction & ODA_SELECT)) { // Item has been de-selected -- remove frame
CBrush br(cr); pDC->FrameRect(&lpDIS->rcItem, &br); } }
/////////////////////////////////////////////////////////////////////////////
// custom menu test - menu ids: index of color.
static COLORREF colors[] = { 0x00000000, // black
0x00FF0000, // blue
0x0000FF00, // green
0x00FFFF00, // cyan
0x000000FF, // red
0x00FF00FF, // magenta
0x0000FFFF, // yellow
0x00FFFFFF // white
}; const int nColors = sizeof(colors)/sizeof(colors[0]);
/////////////////////////////////////////////////////////////////////////////
// Call AttachCustomMenu once
// it will replace the menu item with the ID 'IDM_TEST_CUSTOM_MENU'
// with a color menu popup
// Replace the specified menu item with a color popup
void CTestWindow::AttachCustomMenu() { // now add a few new menu items
for (int iColor = 0; iColor < nColors; iColor++) m_colorMenu.AppendColorMenuItem(IDS_COLOR_NAME_FIRST + iColor, colors[iColor]);
// Replace the specified menu item with a color popup
// (note: will only work once)
CMenu* pMenuBar = GetMenu(); ASSERT(pMenuBar != NULL); TCHAR szString[256]; // don't change the string
pMenuBar->GetMenuString(IDM_TEST_CUSTOM_MENU, szString, sizeof(szString), MF_BYCOMMAND); VERIFY(GetMenu()->ModifyMenu(IDM_TEST_CUSTOM_MENU, MF_BYCOMMAND | MF_POPUP, (UINT)m_colorMenu.m_hMenu, szString)); }
/////////////////////////////////////////////////////////////////////////////
BOOL CTestWindow::OnCommand(WPARAM wParam, LPARAM lParam) { if (wParam < IDS_COLOR_NAME_FIRST || wParam >= IDS_COLOR_NAME_FIRST + nColors) return CFrameWnd::OnCommand(wParam, lParam); // default
// special color selected
CString strYouPicked; strYouPicked.LoadString(IDS_YOU_PICKED_COLOR);
CString strColor; strColor.LoadString(wParam);
CString strMsg; strMsg.Format(strYouPicked, (LPCTSTR)strColor);
CString strMenuTest; strMenuTest.LoadString(IDS_MENU_TEST);
MessageBox(strMsg, strMenuTest);
return TRUE; }
/////////////////////////////////////////////////////////////////////////////
|