⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 menuce.cpp

📁 很牛的GUI源码wxWidgets-2.8.0.zip 可在多种平台下运行.
💻 CPP
字号:
///////////////////////////////////////////////////////////////////////////////// Name:        src/msw/wince/menuce.cpp// Purpose:     Smartphone menus implementation// Author:      Wlodzimierz ABX Skiba// Modified by:// Created:     28.05.2004// RCS-ID:      $Id: menuce.cpp,v 1.9 2006/09/03 12:22:55 RR Exp $// Copyright:   (c) Wlodzimierz Skiba// License:     wxWindows licence///////////////////////////////////////////////////////////////////////////////// ============================================================================// declarations// ============================================================================// ----------------------------------------------------------------------------// headers// ----------------------------------------------------------------------------// For compilers that support precompilation, includes "wx.h".#include "wx/wxprec.h"#ifdef __BORLANDC__    #pragma hdrstop#endif#if defined(__SMARTPHONE__) && defined(__WXWINCE__)#ifndef WX_PRECOMP    #include "wx/app.h"    #include "wx/toplevel.h"    #include "wx/menu.h"#endif //WX_PRECOMP#include <windows.h>#include <ole2.h>#include <shellapi.h>#include <aygshell.h>#include <tpcshell.h>#include <tpcuser.h>#include "wx/msw/wince/missing.h"#include "wx/msw/wince/resources.h"#include "wx/stockitem.h"wxTopLevelWindowMSW::ButtonMenu::ButtonMenu(){    m_id = wxID_ANY;    m_label = wxEmptyString;    m_menu = NULL;    m_assigned = false;}wxTopLevelWindowMSW::ButtonMenu::~ButtonMenu(){    if(m_menu)    {        delete m_menu;        m_menu = NULL;    };}void wxTopLevelWindowMSW::SetLeftMenu(int id, const wxString& label, wxMenu *subMenu){    m_LeftButton.SetButton(id, label, subMenu);    ReloadAllButtons();}void wxTopLevelWindowMSW::SetRightMenu(int id, const wxString& label, wxMenu *subMenu){    m_RightButton.SetButton(id, label, subMenu);    ReloadAllButtons();}void wxTopLevelWindowMSW::ButtonMenu::SetButton(int id, const wxString& label, wxMenu *subMenu){    m_assigned = true;    m_id = id;    if(label.empty() && wxIsStockID(id))        m_label = wxGetStockLabel(id, wxSTOCK_NOFLAGS);    else        m_label = label;    m_menu = subMenu;}wxMenu *wxTopLevelWindowMSW::ButtonMenu::DuplicateMenu(wxMenu *menu){    // This is required in case of converting wxMenuBar to wxMenu in wxFrame::SetMenuBar.    // All submenus has to be recreated because of new owner.    wxMenu *duplication = new wxMenu;    if (menu)    {        wxMenuItemList::compatibility_iterator node = menu->GetMenuItems().GetFirst();        while (node)        {            wxMenuItem *item = node->GetData();            if (item)            {                wxMenu *submenu = NULL;                if(item->IsSubMenu())                    submenu = DuplicateMenu( item->GetSubMenu() );                else                    submenu = NULL;                wxMenuItem *new_item = wxMenuItem::New(duplication, item->GetId(), item->GetLabel(), item->GetHelp(), item->GetKind(), submenu);                if( item->IsCheckable() )                    new_item->Check(item->IsChecked());                new_item->Enable( item->IsEnabled() );                duplication->Append(new_item);            }            node = node->GetNext();        }    }    return duplication;}void wxMenuToHMenu(wxMenu* in, HMENU hMenu){    if(!in) return;    wxChar buf[256];    wxMenuItemList::compatibility_iterator node = in->GetMenuItems().GetFirst();    while ( node )    {        wxMenuItem *item = node->GetData();        UINT uFlags = 0;        UINT uIDNewItem;        LPCTSTR lpNewItem;        if( item->IsSeparator() )        {            uFlags |= MF_SEPARATOR;            uIDNewItem = (unsigned)wxID_ANY;            lpNewItem = NULL;        }        else        {            // label            uFlags |= MF_STRING;            wxStrcpy(buf, item->GetLabel().c_str());            lpNewItem = buf;            // state            uFlags |= ( item->IsEnabled() ? MF_ENABLED : MF_GRAYED );            // checked            uFlags |= ( item->IsChecked() ? MF_CHECKED : MF_UNCHECKED );            if( item->IsSubMenu() )            {                uFlags |= MF_POPUP;                HMENU hSubMenu = CreatePopupMenu();                wxMenuToHMenu(item->GetSubMenu(), hSubMenu);                uIDNewItem = (UINT) hSubMenu;            }            else            {                uIDNewItem = item->GetId();            }        }        AppendMenu(hMenu, uFlags, uIDNewItem, lpNewItem);        node = node->GetNext();    }}void wxTopLevelWindowMSW::ReloadButton(ButtonMenu& button, UINT menuID){    TBBUTTONINFO  button_info;    wxChar        buf[256];    // set button name    memset (&button_info, 0, sizeof (TBBUTTONINFO));    button_info.cbSize = sizeof(TBBUTTONINFO);    button_info.dwMask = TBIF_TEXT | TBIF_STATE;    button_info.fsState = TBSTATE_ENABLED;    wxStrcpy(buf, button.GetLabel().c_str());    button_info.pszText = buf;    ::SendMessage(m_MenuBarHWND, TB_SETBUTTONINFO, menuID, (LPARAM) &button_info);    if(button.IsMenu())    {        HMENU hPopupMenu = (HMENU) ::SendMessage(m_MenuBarHWND, SHCMBM_GETSUBMENU, 0, menuID);        RemoveMenu(hPopupMenu, 0, MF_BYPOSITION);        wxMenuToHMenu(button.GetMenu(), hPopupMenu);    }}void wxTopLevelWindowMSW::ReloadAllButtons(){    // first reaload only after initialization of both buttons    // it should is done at the end of Create() of wxTLW    if(!m_LeftButton.IsAssigned() || !m_RightButton.IsAssigned())        return;    SHMENUBARINFO menu_bar;    wxString      label;    memset (&menu_bar,    0, sizeof (SHMENUBARINFO));    menu_bar.cbSize     = sizeof (SHMENUBARINFO);    menu_bar.hwndParent = (HWND) GetHWND();    if(m_LeftButton.IsMenu() && m_RightButton.IsMenu())        menu_bar.nToolBarId = IDR_MENUBAR_BOTH_MENUS;    else if(m_LeftButton.IsMenu())        menu_bar.nToolBarId = IDR_MENUBAR_LEFT_MENU;    else if(m_RightButton.IsMenu())        menu_bar.nToolBarId = IDR_MENUBAR_RIGHT_MENU;    else        menu_bar.nToolBarId = IDR_MENUBAR_ONE_BUTTON;    menu_bar.hInstRes = wxGetInstance();    if (!SHCreateMenuBar(&menu_bar))    {        wxFAIL_MSG( _T("SHCreateMenuBar failed") );        return;    }    HWND prev_MenuBar = m_MenuBarHWND;    m_MenuBarHWND = menu_bar.hwndMB;    ReloadButton(m_LeftButton, IDM_LEFT);    ReloadButton(m_RightButton, IDM_RIGHT);    // hide previous and show new menubar    if ( prev_MenuBar )        ::ShowWindow( prev_MenuBar, SW_HIDE );    ::ShowWindow( m_MenuBarHWND, SW_SHOW );    // Setup backspace key handling    SendMessage(m_MenuBarHWND, SHCMBM_OVERRIDEKEY, VK_TBACK,                MAKELPARAM( SHMBOF_NODEFAULT | SHMBOF_NOTIFY,                            SHMBOF_NODEFAULT | SHMBOF_NOTIFY ));}bool wxTopLevelWindowMSW::HandleCommand(WXWORD id, WXWORD WXUNUSED(cmd), WXHWND WXUNUSED(control)){    // handle here commands from Smartphone menu bar    if ( id == IDM_LEFT || id == IDM_RIGHT )    {        int menuId = id == IDM_LEFT ? m_LeftButton.GetId() : m_RightButton.GetId() ;        wxCommandEvent commandEvent(wxEVT_COMMAND_MENU_SELECTED, menuId);        commandEvent.SetEventObject(this);        GetEventHandler()->ProcessEvent(commandEvent);        return true;    }    return false;}bool wxTopLevelWindowMSW::MSWShouldPreProcessMessage(WXMSG* pMsg){    MSG *msg = (MSG *)pMsg;    // Process back key to be like backspace.    if (msg->message == WM_HOTKEY)    {        if (HIWORD(msg->lParam) == VK_TBACK)            SHSendBackToFocusWindow(msg->message, msg->wParam, msg->lParam);    }    return wxTopLevelWindowBase::MSWShouldPreProcessMessage(pMsg);}#endif // __SMARTPHONE__ && __WXWINCE__

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -