|
|
1.1 ! root 1: // custmenu.cpp : custom menu ! 2: // ! 3: // This is a part of the Microsoft Foundation Classes C++ library. ! 4: // Copyright (C) 1992 Microsoft Corporation ! 5: // All rights reserved. ! 6: // ! 7: // This source code is only intended as a supplement to the ! 8: // Microsoft Foundation Classes Reference and Microsoft ! 9: // QuickHelp documentation provided with the library. ! 10: // See these sources for detailed information regarding the ! 11: // Microsoft Foundation Classes product. ! 12: ! 13: #include "ctrltest.h" ! 14: ! 15: ///////////////////////////////////////////////////////////////////////////// ! 16: ! 17: // for owner draw menus, the CMenu object is embedded in the main frame window ! 18: // the CMenu stays attached to the HMENU while it is running so that ! 19: // owner draw messages are delegated to this class. ! 20: // Since we attach the HMENU to a menu bar (with ModifyMenu below), we ! 21: // don't want to delete the menu twice - so we detach on the destructor. ! 22: ! 23: CColorMenu::CColorMenu() ! 24: { ! 25: VERIFY(CreateMenu()); ! 26: } ! 27: ! 28: CColorMenu::~CColorMenu() ! 29: { ! 30: Detach(); ! 31: ASSERT(m_hMenu == NULL); // defaul CMenu::~CMenu will destroy ! 32: } ! 33: ! 34: void CColorMenu::AppendColorMenuItem(UINT nID, COLORREF color) ! 35: { ! 36: VERIFY(AppendMenu(MF_ENABLED | MF_OWNERDRAW, nID, (LPCSTR)color)); ! 37: } ! 38: ! 39: ///////////////////////////////////////////////////////////////////////////// ! 40: ! 41: #define COLOR_BOX_WIDTH 20 ! 42: #define COLOR_BOX_HEIGHT 20 ! 43: ! 44: ! 45: void CColorMenu::MeasureItem(LPMEASUREITEMSTRUCT lpMIS) ! 46: { ! 47: // all items are of fixed size ! 48: lpMIS->itemWidth = COLOR_BOX_WIDTH; ! 49: lpMIS->itemHeight = COLOR_BOX_HEIGHT; ! 50: } ! 51: ! 52: void CColorMenu::DrawItem(LPDRAWITEMSTRUCT lpDIS) ! 53: { ! 54: CDC* pDC = CDC::FromHandle(lpDIS->hDC); ! 55: COLORREF cr = lpDIS->itemData; // RGB in item data ! 56: ! 57: if (lpDIS->itemAction & ODA_DRAWENTIRE) ! 58: { ! 59: // Paint the color item in the color requested ! 60: CBrush br(cr); ! 61: pDC->FillRect(&lpDIS->rcItem, &br); ! 62: } ! 63: ! 64: if ((lpDIS->itemState & ODS_SELECTED) && ! 65: (lpDIS->itemAction & (ODA_SELECT | ODA_DRAWENTIRE))) ! 66: { ! 67: // item has been selected - hilite frame ! 68: COLORREF crHilite = RGB(255-GetRValue(cr), ! 69: 255-GetGValue(cr), 255-GetBValue(cr)); ! 70: CBrush br(crHilite); ! 71: pDC->FrameRect(&lpDIS->rcItem, &br); ! 72: } ! 73: ! 74: if (!(lpDIS->itemState & ODS_SELECTED) && ! 75: (lpDIS->itemAction & ODA_SELECT)) ! 76: { ! 77: // Item has been de-selected -- remove frame ! 78: CBrush br(cr); ! 79: pDC->FrameRect(&lpDIS->rcItem, &br); ! 80: } ! 81: } ! 82: ! 83: ///////////////////////////////////////////////////////////////////////////// ! 84: ! 85: // Call AttachCustomMenu once ! 86: // it will replace the menu item with the ID 'IDM_TEST_CUSTOM_MENU' ! 87: // with a color menu popup ! 88: // Replace the specified menu item with a color popup ! 89: void CTestWindow::AttachCustomMenu() ! 90: { ! 91: // now add a few new menu items ! 92: for (int iColor = 0; iColor <= (IDM_COLOR_LAST-IDM_COLOR_FIRST); iColor++) ! 93: { ! 94: // 3 bit encoded RGB values ! 95: BYTE red = (iColor & 4) * 255; ! 96: BYTE green = (iColor & 2) * 255; ! 97: BYTE blue = (iColor & 1) * 255; ! 98: ! 99: m_colorMenu.AppendColorMenuItem(IDM_COLOR_FIRST + iColor, ! 100: RGB(red, green, blue)); ! 101: } ! 102: ! 103: // Replace the specified menu item with a color popup ! 104: // (note: will only work once) ! 105: CMenu* pMenuBar = GetMenu(); ! 106: ASSERT(pMenuBar != NULL); ! 107: char szString[256]; // don't change the string ! 108: ! 109: pMenuBar->GetMenuString(IDM_TEST_CUSTOM_MENU, szString, sizeof(szString), ! 110: MF_BYCOMMAND); ! 111: VERIFY(GetMenu()->ModifyMenu(IDM_TEST_CUSTOM_MENU, MF_BYCOMMAND | MF_POPUP, ! 112: (UINT)m_colorMenu.m_hMenu, szString)); ! 113: } ! 114: ! 115: ///////////////////////////////////////////////////////////////////////////// ! 116: ! 117: char* colorNames[] = ! 118: { ! 119: "black", "blue", "green", "cyan", ! 120: "red", "magenta", "yellow", "white" ! 121: }; ! 122: ! 123: BOOL CTestWindow::OnCommand(UINT wParam, LONG lParam) ! 124: { ! 125: if (wParam < IDM_COLOR_FIRST || wParam > IDM_COLOR_LAST) ! 126: return CFrameWnd::OnCommand(wParam, lParam); // default ! 127: ! 128: // special color selected ! 129: char szT[256]; ! 130: sprintf(szT, "You picked %s", colorNames[wParam - IDM_COLOR_FIRST]); ! 131: MessageBox(szT, "MenuTest"); ! 132: return TRUE; ! 133: } ! 134: ! 135: /////////////////////////////////////////////////////////////////////////////
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.