精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>C/C++>>WINDOWS界面设计>>怎样创建自绘菜单

主题:怎样创建自绘菜单
发信人: tsingxiao()
整理人: girlrong(1999-11-10 07:36:00), 站内信件
                                  闻怡洋 译
    int CMainFrame:: GetMenuRows ()
    {
    CRect rcFrame,rcClient;
    GetWindowRect (rcFrame);
    GetClientRect (rcClient);
    return (rcFrame.Height () -rcClient.Height ()-
    :: GetSystemMetrics (SM_CYCAPTION) -
    (:: getSystemMetrics (SM_CYFRAME) *2)) /
    :: GetSystemMetrics (SM_CYMENU);
    }

    在这里提供一个C++类(CCustomMenu),该类是CMenu的子类,并且拥有自绘能
力。
它可以向你提供以下的功能:
    设置字体颜色。
    设置高亮度颜色。
    设置高亮度时的风格。
    设置选中时和在普通状态下的菜单显示的图标。
    设置显示图标大小。
    在CCustomMenu中定义了结构MENUDATA,你必须根据你的需要填充该结构,并
且在
增加菜单时提供该结构的指针(调用
AppendMenu,InsertMenu)。下面是一个例子:

    1、定义CCustomMenu的实例,和MENUDATA结构变量。

    CCustomMenu m_cCustomMenu;
    MENUDATA menuData [8]; // as many menu items are present , You sho
uld be
able to use
    file://new and do the same

    2、调用CreateMenu()设置有关参数。

    m_customMenu.CreateMenu ();
    m_customMenu.SetIconSize (25,25); file://This is to set the size o
f the
Icon.
    // This should be used only once for any menu
    // in order to resize it, destroy and create the menu again with
different size.
    m_customMenu.SetHighlightStyle (Normal); file://Or TextOnly, if yo
u want
the
    // background color to remain the same
    // and the Text color to change to the Highlight color.
    // The following setXXXColor sets the menu colors. If you dont wan
t to
change any, Dont call these member functions.
    m_customMenu.SetTextColor (RGB (255,0,0));
    m_customMenu.SetBackColor (RGB (255,255,255));
    m_customMenu.SetHighlightColor (RGB (0,0,255));

    3、设置MENUDATA变量,并增加菜单项。

    lstrcpy (menuData[0].menuText , "text1");
    menuData[0].menuIconNormal= IDI_ICON1;
    m_customMenu.AppendMenu (MF_OWNERDRAW,3,(LPCTSTR)menuData);

    3、在你的窗口中重载OnMeasureItem(...)函数。

    void CMyView::OnMeasureItem(int nIDCtl, LPMEASUREITEMSTRUCT
lpMeasureItemStruct)
    {
    if ( lpMeasureItemStruct->CtlType == ODT_MENU &&
    IsMenu((HMENU)lpMeasureItemStruct->itemID) &&
    (lpMeasureItemStruct->itemID == (UINT)m_hMenuSub) )
    {
    m_customMenu.MeasureItem (lpMeasureItemStruct);
    }
    else
    // let MFC's self-drawing handle it
    CView::OnMeasureItem(nIDCtl, lpMeasureItemStruct);
    }

    下面的函数将帮助你设置菜单属性。

    void SetTextColor (COLORREF );
    void SetBackColor (COLORREF);
    void SetHighlightColor (COLORREF);
    void SetIconSize (int, int);
    void SetHighlightStyle (HIGHLIGHTSTYLE ); // HIGHLIGHTSTYLE : enum

{Normal, TextOnly}
    void SetHighlightTextColor (COLORREF);

--

  既不能达而兼善天下
                    只好穷而独善自身
  青山处处  斯民如土矣……

※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.96.253.41]

[关闭][返回]