home *** CD-ROM | disk | FTP | other *** search
- // Microworks ObjectMate 2.6
- //
- // WinMenu - 3D Ownerdraw Menu Demonstration
- //
- // Copyright 1992-94 Microworks Sydney, Australia.
- //
- // WINMENU.CPP
-
- /* WinMenu implements 3-dimensional ownerdraw menu's that let you change the
- * menu text font and highlight and text highlight colors.
- */
-
- #define CM_ITEM1 101
- #define CM_ITEM2 102
- #define CM_ITEM3 103
- #define CM_ITEM4 104
- #define CM_EXITWINDOW 105
- #define CM_FONT 106
- #define CM_COLOR 107
- #define CM_COLORTEXT 109
- #define CM_ABOUT 110
- #define APPNAME "WINMENU"
-
- #include <owl\owlpch.h>
- #include <sfx\sfx200.h>
- #include <sfx\sframe.h>
- #include <sfx\swindow.h>
- #include <sfx\smenu.h>
- #include <owl\chooseco.h>
- #include <owl\choosefo.h>
-
- // TAboutDialog class
-
- class TAboutDialog : public TDialog {
- public:
- TAboutDialog(TWindow*, TResId);
- void SetupWindow();
- DECLARE_RESPONSE_TABLE(TAboutDialog);
- };
-
- DEFINE_RESPONSE_TABLE1(TAboutDialog, TDialog)
- END_RESPONSE_TABLE;
-
- TAboutDialog::TAboutDialog(TWindow* parent, TResId resId)
- :TDialog(parent, resId),
- TWindow(parent)
- {
- }
-
- void
- TAboutDialog::SetupWindow()
- {
- TDialog::SetupWindow();
- CenterWindow(Parent->HWindow, HWindow);
- }
-
- // TClientWindow class
-
- class TClientWindow : public TSFXWindow {
- public:
- TClientWindow();
- DECLARE_RESPONSE_TABLE(TClientWindow);
- };
-
- DEFINE_RESPONSE_TABLE2(TClientWindow, TSFXWindow, TWindow)
- END_RESPONSE_TABLE;
-
- TClientWindow::TClientWindow()
- : TSFXWindow(0, 0, 0)
- {
- //Attr.Style |= MWS_RAISEDCLIENT | MWS_GLAZE;
- Attr.Style |= MWS_RAISEDCLIENT | MWS_STEEL;
- }
-
- // TMenuWindow class
-
- class TMenuWindow : public TSFXFrameWindow {
- public:
- HFONT Font;
- COLORREF Color;
- COLORREF TextColor;
- LOGFONT LogFont;
- HMENU Menu, SubMenu;
- TMenuWindow(TWindow*, const char*, TWindow*);
- ~TMenuWindow();
- char far* GetClassName();
- void GetWindowClass(WNDCLASS& wndClass);
- void SetupWindow();
- void Create3DMenus();
- void EvDrawItem(UINT, DRAWITEMSTRUCT far&);
- void EvMeasureItem(UINT, MEASUREITEMSTRUCT far&);
- LRESULT EvMenuChar(WPARAM, LPARAM);
- void CmItem1();
- void CmItem2();
- void CmItem3();
- void CmItem4();
- void CmExitWindow();
- void CmFont();
- void CmColor();
- void CmColorText();
- void CmAbout();
- DECLARE_RESPONSE_TABLE(TMenuWindow);
- };
-
- DEFINE_RESPONSE_TABLE2(TMenuWindow, TSFXFrameWindow, TFrameWindow)
- EV_WM_DRAWITEM,
- EV_WM_MEASUREITEM,
- EV_COMMAND(CM_ITEM1, CmItem1),
- EV_COMMAND(CM_ITEM2, CmItem2),
- EV_COMMAND(CM_ITEM3, CmItem3),
- EV_COMMAND(CM_ITEM4, CmItem4),
- EV_COMMAND(CM_EXITWINDOW, CmExitWindow),
- EV_COMMAND(CM_FONT, CmFont),
- EV_COMMAND(CM_COLOR, CmColor),
- EV_COMMAND(CM_COLORTEXT, CmColorText),
- EV_COMMAND(CM_ABOUT, CmAbout),
- EV_MESSAGE(WM_MENUCHAR, EvMenuChar),
- END_RESPONSE_TABLE;
-
- TMenuWindow::TMenuWindow(TWindow* parent, const char* title, TWindow* clientWnd)
- :TSFXFrameWindow(parent, title, clientWnd),
- TFrameWindow(parent, title, clientWnd),
- TWindow(parent, title)
- {
- Attr.Style |= MWS_SFXCAPTION;
- //Attr.Style |= MWS_SFXFRAME; // Also remove Attr.Style flags for client window
-
- AssignMenu(APPNAME);
- Color = 0;
- TextColor = 0;
-
- //Set up fine system font for menu items
- Font = (HFONT)GetStockObject(SYSTEM_FONT);
- GetObject(Font, sizeof(LOGFONT), &LogFont);
- LogFont.lfWeight = FW_NORMAL;
- strcpy(LogFont.lfFaceName, "MS Sans Serif");
- Font = CreateFontIndirect(&LogFont);
- }
-
- TMenuWindow::~TMenuWindow()
- {
- EraseObject(Font);
- }
-
- char far*
- TMenuWindow::GetClassName()
- {
- return APPNAME;
- }
-
- void
- TMenuWindow::GetWindowClass(WNDCLASS& wndClass)
- {
- TSFXFrameWindow::GetWindowClass(wndClass);
- wndClass.hbrBackground = 0;
- }
-
- void TMenuWindow::SetupWindow()
- {
- TSFXFrameWindow::SetupWindow();
- Create3DMenus();
- }
-
- void
- TMenuWindow::Create3DMenus()
- {
- /* Since the system menu rarely gets modified, Set3DSystemMenu can be used to
- * automatically set up a basic ownerdraw system menu.
- */
- Set3DSystemMenu(HWindow, "WinMenu");
-
- //Create popup submenu with add ownerdraw items
- SubMenu = CreatePopupMenu();
- AppendMenu(SubMenu, MF_OWNERDRAW, CM_ITEM1, "SubMenu Item &A");
- AppendMenu(SubMenu, MF_OWNERDRAW, CM_ITEM2, "SubMenu Item &B");
- AppendMenu(SubMenu, MF_OWNERDRAW | MF_CHECKED, CM_ITEM3, "SubMenu Item &C");
- AppendMenu(SubMenu, MF_OWNERDRAW, CM_ITEM4, "SubMenu Item &D");
-
- //Modify main menu to display ownerdraw items
- Menu = GetSubMenu(GetMenu(), 0);
- ModifyMenu(Menu, 0, MF_BYPOSITION | MF_OWNERDRAW, CM_ITEM1, "Menu Item &A");
- ModifyMenu(Menu, 1, MF_BYPOSITION | MF_OWNERDRAW, CM_ITEM2, "Menu Item &B");
- ModifyMenu(Menu, 2, MF_BYPOSITION | MF_OWNERDRAW, CM_ITEM3, "Menu Item &C");
- ModifyMenu(Menu, 3, MF_BYPOSITION | MF_OWNERDRAW | MF_CHECKED, CM_ITEM4, "Menu Item &D");
- ModifyMenu(Menu, 5, MF_BYPOSITION | MF_OWNERDRAW, CM_EXITWINDOW, "&Exit WinMenu");
- Menu = GetSubMenu(GetMenu(), 1);
- ModifyMenu(Menu, 0, MF_BYPOSITION | MF_OWNERDRAW, CM_ITEM1, "Menu Item &A");
- ModifyMenu(Menu, 1, MF_BYPOSITION | MF_OWNERDRAW, CM_ITEM2, "Menu Item &B");
- ModifyMenu(Menu, 2, MF_BYPOSITION | MF_OWNERDRAW | MF_POPUP, (int)SubMenu, "&Sub Menu");
- ModifyMenu(Menu, 3, MF_BYPOSITION | MF_OWNERDRAW, CM_ITEM4, "Menu Item &D");
- Menu = GetSubMenu(GetMenu(), 2);
- ModifyMenu(Menu, 0, MF_BYPOSITION | MF_OWNERDRAW, CM_ITEM1, "Menu Item &A");
- ModifyMenu(Menu, 1, MF_BYPOSITION | MF_OWNERDRAW, CM_ITEM2, "Menu Item &B");
- ModifyMenu(Menu, 2, MF_BYPOSITION | MF_OWNERDRAW, CM_ITEM3, "Menu Item &C");
- ModifyMenu(Menu, 3, MF_BYPOSITION | MF_OWNERDRAW | MF_POPUP, (int)SubMenu, "&Sub Menu");
- Menu = GetSubMenu(GetMenu(), 3);
- ModifyMenu(Menu, 0, MF_BYPOSITION | MF_OWNERDRAW, CM_FONT, "Menu &Font");
- ModifyMenu(Menu, 1, MF_BYPOSITION | MF_OWNERDRAW, CM_COLOR, "Hilite &Color");
- ModifyMenu(Menu, 2, MF_BYPOSITION | MF_OWNERDRAW, CM_COLORTEXT, "Hilite &Text Color");
- Menu = GetSubMenu(GetMenu(), 4);
- ModifyMenu(Menu, 0, MF_BYPOSITION | MF_OWNERDRAW, CM_ABOUT, "&About WinMenu");
- }
-
- void
- TMenuWindow::EvDrawItem(UINT /*ctlId*/, DRAWITEMSTRUCT far& drawinfo)
- {
- /* Pass EvDrawItem onto DrawMenuItem. If you don't want the user to
- * change fonts and highlight colors you can use the default values
- * for this function and just call 'DrawMenuItem(drawinfo);'.
- */
- if (drawinfo.CtlType == ODT_MENU)
- DrawMenuItem(drawinfo, Font, Color, TextColor);
- }
-
- void
- TMenuWindow::EvMeasureItem(UINT /*ctlId*/, MEASUREITEMSTRUCT far& measureinfo)
- {
- /* The same font handle passed to DrawMenuItem must be passed to MeasureMenuItem
- */
- if (measureinfo.CtlType == ODT_MENU)
- MeasureMenuItem(HWindow, measureinfo, Font);
- }
-
- LRESULT
- TMenuWindow::EvMenuChar(WPARAM wParam, LPARAM lParam)
- {
- /* A mnemonic is the undelined letter in the text of a menu item. When a menu
- * is active the user can select a menu item by pressing the key that corresponds
- * to the item's underlined letter. Ownerdraw menus don't process standard menu
- * mnemonics so you must trap the WM_MENUCHAR message and process them yourself.
- * A WM_MENUCHAR message is sent when a menu is active and the user presses a key.
- * wParam is the key's ascii character, the LOWORD of lParam is the menu type,
- * either MF_POPUP or MF_SYSMENU and the HIWORD of lParam is the handle of the
- * menu. The return value must be a long integer specifying the menu item's zero
- * based position in its LOWORD and '2' in its HIWORD.
- *
- * It was necessary to redefine EvMenuChar using the EV_MESSAGE macro because
- * there is an apparent bug in OWL's EvMenuChar event, and it wont work.
- *
- * Since the system menu rarely gets modified, ProcessSystemChar can be used to
- * automatically handle system menu mnemonics.
- */
- if (LOWORD(lParam) & MF_SYSMENU)
- return ProcessSystemChar(wParam);
- else
- if ((HMENU)HIWORD(lParam) == SubMenu)
- {
- switch (wParam)
- {
- case 65:
- case 97:
- return MAKELONG(0, 2);
-
- case 66:
- case 98:
- return MAKELONG(1, 2);
-
- case 67:
- case 99:
- return MAKELONG(2, 2);
-
- case 68:
- case 100:
- return MAKELONG(3, 2);
- }
- }
- else
- if ((HMENU)HIWORD(lParam) == GetSubMenu(GetMenu(), 0))
- {
- switch (wParam)
- {
- case 65:
- case 97:
- return MAKELONG(0, 2);
-
- case 66:
- case 98:
- return MAKELONG(1, 2);
-
- case 67:
- case 99:
- return MAKELONG(2, 2);
-
- case 68:
- case 100:
- return MAKELONG(3, 2);
-
- case 69:
- case 101:
- return MAKELONG(5, 2);
- }
- }
- else
- if ((HMENU)HIWORD(lParam) == GetSubMenu(GetMenu(), 1))
- {
- switch (wParam)
- {
- case 65:
- case 97:
- return MAKELONG(0, 2);
-
- case 66:
- case 98:
- return MAKELONG(1, 2);
-
- case 83:
- case 115:
- return MAKELONG(2, 2);
-
- case 68:
- case 100:
- return MAKELONG(3, 2);
- }
- }
- else
- if ((HMENU)HIWORD(lParam) == GetSubMenu(GetMenu(), 2))
- {
- switch (wParam)
- {
- case 65:
- case 97:
- return MAKELONG(0, 2);
-
- case 66:
- case 98:
- return MAKELONG(1, 2);
-
- case 67:
- case 99:
- return MAKELONG(2, 2);
-
- case 83:
- case 115:
- return MAKELONG(3, 2);
- }
- }
- else
- if ((HMENU)HIWORD(lParam) == GetSubMenu(GetMenu(), 3))
- {
- switch (wParam)
- {
- case 70:
- case 102:
- return MAKELONG(0, 2);
-
- case 67:
- case 99:
- return MAKELONG(1, 2);
-
- case 84:
- case 116:
- return MAKELONG(2, 2);
- }
- }
- return 0L;
- }
-
- void
- TMenuWindow::CmItem1()
- {
- SFXMsgBox(HWindow, "You selected item A", "Information", MB_ICONINFORMATION, 0);
- }
-
- void
- TMenuWindow::CmItem2()
- {
- SFXMsgBox(HWindow, "You selected item B", "Information", MB_ICONINFORMATION, 0);
- }
-
- void
- TMenuWindow::CmItem3()
- {
- SFXMsgBox(HWindow, "You selected item C", "Information", MB_ICONINFORMATION, 0);
- }
-
- void
- TMenuWindow::CmItem4()
- {
- SFXMsgBox(HWindow, "You selected item D", "Information", MB_ICONINFORMATION, 0);
- }
-
- void
- TMenuWindow::CmExitWindow()
- {
- CloseWindow();
- }
-
- void
- TMenuWindow::CmFont()
- {
- DWORD flags = CF_SCREENFONTS | CF_FORCEFONTEXIST;
- int id = GetSFXTemplateId("SFX3DDlg", DLG_EXFONT);
-
- if (SFXChooseFont(HWindow, (LOGFONT far*)&LogFont, flags, id, TRUE))
- {
- EraseObject(Font);
- Font = CreateFontIndirect(&LogFont);
- AssignMenu("WinMenu");
- Create3DMenus();
- }
- }
-
- void
- TMenuWindow::CmColor()
- {
- DWORD flags = CC_RGBINIT;
- int id = GetSFXTemplateId("SFX3DDlg", DLG_EXCOLOR);
- SFXChooseColor(HWindow, (COLORREF far*)&Color, flags, id, TRUE);
- }
-
- void
- TMenuWindow::CmColorText()
- {
- DWORD flags = CC_RGBINIT;
- int id = GetSFXTemplateId("SFX3DDlg", DLG_EXCOLOR);
- SFXChooseColor(HWindow, (COLORREF far*)&TextColor, flags, id, TRUE);
- }
-
- void
- TMenuWindow::CmAbout()
- {
- TAboutDialog(this, "AboutDialog").Execute();
- }
-
- // TMenuApp
-
- class TMenuApp : public TApplication {
- public:
- TMenuApp() : TApplication() {}
- void InitMainWindow();
- };
-
- void
- TMenuApp::InitMainWindow()
- {
- MainWindow = new TMenuWindow(0, "WinMenu - 3D Menu Demonstration", new TClientWindow);
- MainWindow->SetIcon(this, APPNAME);
- }
-
- // OwlMain
-
- int
- OwlMain(int /*argc*/, char* /*argv*/ [])
- {
- return TMenuApp().Run();
- }
-