Owner Drawn Menu With Free Color '& Font

defaul1.gif.gif (4096 bytes)

Download Source Code and Example 35K

CFreeMenu:This class is a owner drawn menu, You will be able to:
1. Set the menu position
2. Set the menu background color
3. Set the menu bar's edge color
4. Set the menu text color
5. Set the menu text font
6. Set the first level menu as horizontal or vertical
7.Develop the class to implement menuitem with icon,and cool background menubar (as wood, metal ,or other picture etc.)

In order to use it,you need add the file freemenu.cpp ,freemenu.h,menuitemwnd.cpp and menuitemwnd.h to your project.If you don't change any of the code,you can get the 1-6 function.To redraw the CFreeMenu's method DrawMenu you can develop it.

In the beginning of  .H file add those code:

            #include "freemenu.h"

In the containing class add those code:

             CFreeMenu *m_Menu;

In the .CPP file of the class where you want use the menu add those code:

1. In initialization part(as CDialog class' OnInitDialog method,the CFreeMenu need a parent window) add those code:

    m_menu = new CFreeMenu(IDR_MENU1,     //The menu ID

                        CPoint(10,10),this,         //The Menu position and it's parent window
                        RGB(192,192,192),        //The Color of the menu bar's background
                        RGB(255,225,255),        //The Color of the menu bar's left and up edge
                        RGB(128,128,128),        //The Color of the menu bar's right and down edge
                        RGB(0,0,0),&font,0);     //The Color and font of the menu text, when the

                                                            // last parameter is 0 the first level of the menu if

                                                            // horizontal,1 meant vertical

2.Where you need the menu you add those code:
        m_menu->DrawMenu();

3.In your class derive the WindowProc method to call the function:

void CTestdiDlg::OnMenuitem32782()
{
    AfxMessageBox("Test menu");   
}

LRESULT CTestdiDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam)
{
    if(message==ID_MENUITEM32782)
    {
        OnMenuitem32782();
    }
   
    return CDialog::WindowProc(message, wParam, lParam);
}

Download demo project 35K

Last updated: 26 June 1998



Comments

  • how to add shortcut to free menu

    Posted by Sanjeev_Kumar_Magoo on 03/18/2004 01:21am

    how to add shortcut to free menu

    Reply
  • VC++, can I change font for caption of the menu

    Posted by Legacy on 10/16/2003 12:00am

    Originally posted by: Bao Chau

    How I change the font of the menu caption in VC++? But not use class, only simple application.

    Please give me the sample code.

    Reply
  • have a memery leak!

    Posted by Legacy on 07/15/2003 12:00am

    Originally posted by: Lism

    have a memery leak!

    • Memory leak

      Posted by Vo Da Bao on 12/29/2015 03:17am

      Could you show me the position of memory leak?

      Reply
    Reply
  • Good work, but ...

    Posted by Legacy on 09/11/2002 12:00am

    Originally posted by: Zoran Basaric

    1. When I put control on dialog, and when I click on the menu, submenu is under the control. Only when mouse is over submenu item, submenu is visible.
    2. When submenu shows and when I click beside the submenu, it is still visible. It remains visible until I click on its subitem.

    Can someone help?

    Thanks in advance,
    Zoran Basaric

    • Help on Closing this menu

      Posted by danandu on 02/27/2009 06:20am

      Hi, I was using FreeMenu from the article in CG written by ShiGui Lu "Owner drawn menu with free color and font" Drawback: it doesnt close the opened menus and sub menus when clicked outside the menu (since standard menus do so). So i started altering my code as like this: void CTestdiDlg::OnLButtonDown(UINT nFlags, CPoint point) { int iMenuNo = -1; if(m_menu->m_selected != -1) { iMenuNo = m_menu->m_selected; switch(iMenuNo) { case 0: case 2: m_menu->SubMenu[m_menu->m_selected]->ClearParent(); break; case 1: m_menu->SubMenu[m_menu->m_selected]->SubMenu[3]->ClearParent(); break; } m_menu->DrawMenu(); } CDialog::OnLButtonDown(nFlags, point); } But Still i am hardcoding the menu numbers (observe that i have used 3) How to generalize my code Or how to alter authors code to suit my reqmt.

      Reply
    Reply
  • Great!

    Posted by Legacy on 11/18/2001 12:00am

    Originally posted by: Nathan Moinvaziri

    I like the brevity of this example the best.

    Reply
  • Need some help.

    Posted by Legacy on 12/07/2000 12:00am

    Originally posted by: Neha

    It is really a nice thing.But i want to implement this for my main menu.Which i am loading through the following stmt.
    
    

    pDocTemplate = new CSingleDocTemplate(
    IDR_MAINFRAME,
    RUNTIME_CLASS(CADoc),
    RUNTIME_CLASS(CMainFrame), // main SDI frame window);
    AddDocTemplate(pDocTemplate);

    After some stmts i have the following stmts:

    m_menu = new CFreeMenu(IDR_MAINFRAME,CPoint(0,0),m_pMainWnd,RGB(0,192,192),RGB(0,225,255),
    RGB(0,128,128), RGB(255,255,255),&font,1);
    if(m_menu)
    {
    m_menu->DrawMenu();
    }

    Now my freemenu will be overlapped with my toolbar.
    So How do i replace the main menu by freemenu.
    Looking forward for reply.
    Neha

    Reply
  • use with message

    Posted by Legacy on 10/06/2000 12:00am

    Originally posted by: David

    pretty cool menu, except it can't be use with a message map. I made a small change in the CFreeMenu::WindowProc() function in side case statment case WM_LBUTTONDOWN:

    I modified the PostMessage() function to send out a WM_COMMAND message when the menu item was pressed. By doing so, I can use messge mapping in my host class that employ the CFreeMenu class, and I no longer need to override my host class' WindowProc() virtual function.

    if(!m_Menu->GetSubMenu(selected))
    {
    m_ParentWnd->PostMessage(WM_COMMAND, MAKEWPARAM(m_Menu->GetMenuItemID(selected),0), 0);
    m_selfWnd->BringWindowToTop();
    ClearParent();
    m_selected = -1;
    m_goby = -1;
    }


    Reply
  • Wow...Amazing

    Posted by Legacy on 02/28/2000 12:00am

    Originally posted by: BostonGuy

    Aami sojje Korti Pachchi na... aami more jabo....

    Reply
Leave a Comment
  • Your email address will not be published. All fields are required.

Top White Papers and Webcasts

  • The future of cloud platforms is at hand. Even if your cloud applications are basic now, your next set of apps will require strong analytics services and tools, as well as features that ease enterprise integration. To fill these needs, consider using not only your current cloud provider but also specialists. Take advantage of not only the big cloud platforms, but also specialized providers in vertical industries; countries and regions; and functional domains including omnichannel, analytics, integration, and …

  • Featuring Art Schoeller, VP and Principal Analyst, Forrester Research Wednesday, August 31, 2016 10:00 AM PT | 1 PM ET If Agility Is Essential to Your Business Survival--Now's the Time to Start the Move to Cloud! The maturity of cloud platforms has given organizations new confidence in moving mission-critical systems to the cloud, to gain agility, scale and realize cost benefits in the process. How can your company achieve these benefits, and what steps are necessary to begin your contact center's …

Most Popular Programming Stories

More for Developers

RSS Feeds

Thanks for your registration, follow us on our social networks to keep up-to-date