152 lines
4.2 KiB
C++
152 lines
4.2 KiB
C++
|
// 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;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////
|