home *** CD-ROM | disk | FTP | other *** search
/ Programming Languages Suite / ProgLangD.iso / C++-7 / DISK11 / MFC / SAMPLES / CTRLTEST / CUSTMENU.CP$ / custmenu
Encoding:
Text File  |  1992-03-18  |  4.0 KB  |  136 lines

  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. /////////////////////////////////////////////////////////////////////////////
  136.